@appconda/sdk 1.0.194 → 1.0.409
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/workflows/autoclose.yml +11 -0
- package/.github/workflows/publish.yml +42 -0
- package/.travis.yml +32 -0
- package/CHANGELOG.md +1 -0
- package/LICENSE +12 -0
- package/README.md +0 -0
- package/dist/actions/_authOptions.d.ts +5 -0
- package/dist/actions/_authOptions.js +235 -0
- package/dist/actions/actionClient.d.ts +10 -0
- package/dist/actions/actionClient.js +41 -0
- package/dist/actions/auth.d.ts +1 -0
- package/dist/actions/auth.js +7 -0
- package/dist/actions/authOptions.d.ts +5 -0
- package/dist/actions/authOptions.js +133 -0
- package/dist/actions/index.d.ts +3 -0
- package/dist/actions/index.js +4 -0
- package/dist/actions/nextAuthHandler.d.ts +1 -0
- package/dist/actions/nextAuthHandler.js +6 -0
- package/dist/client.d.ts +141 -0
- package/dist/client.js +335 -0
- package/dist/decorators/Cache.d.ts +1 -0
- package/dist/decorators/Cache.js +79 -0
- package/dist/decorators/CacheKey.d.ts +1 -0
- package/dist/decorators/CacheKey.js +9 -0
- package/dist/decorators/Invalidate.d.ts +1 -0
- package/dist/decorators/Invalidate.js +47 -0
- package/dist/enums/api-service.d.ts +13 -0
- package/dist/enums/api-service.js +15 -0
- package/dist/enums/api.d.ts +5 -0
- package/dist/enums/api.js +7 -0
- package/dist/enums/auth-method.d.ts +9 -0
- package/dist/enums/auth-method.js +11 -0
- package/dist/enums/browser.d.ts +16 -0
- package/dist/enums/browser.js +18 -0
- package/dist/enums/compression.d.ts +5 -0
- package/dist/enums/compression.js +7 -0
- package/dist/enums/credit-card.d.ts +18 -0
- package/dist/enums/credit-card.js +20 -0
- package/dist/enums/database-usage-range.d.ts +5 -0
- package/dist/enums/database-usage-range.js +7 -0
- package/dist/enums/email-template-locale.d.ts +133 -0
- package/dist/enums/email-template-locale.js +135 -0
- package/dist/enums/email-template-type.d.ts +9 -0
- package/dist/enums/email-template-type.js +11 -0
- package/dist/enums/entities/EntityLimitType.d.ts +4 -0
- package/dist/enums/entities/EntityLimitType.js +6 -0
- package/dist/enums/entities/PropertyAttributeName.d.ts +27 -0
- package/dist/enums/entities/PropertyAttributeName.js +29 -0
- package/dist/enums/entities/PropertyCondition.d.ts +7 -0
- package/dist/enums/entities/PropertyCondition.js +10 -0
- package/dist/enums/entities/PropertyType.d.ts +12 -0
- package/dist/enums/entities/PropertyType.js +18 -0
- package/dist/enums/entities/PropertyValueType.d.ts +6 -0
- package/dist/enums/entities/PropertyValueType.js +8 -0
- package/dist/enums/entities/RowAccess.d.ts +2 -0
- package/dist/enums/entities/RowAccess.js +2 -0
- package/dist/enums/entities/ViewFilterCondition.d.ts +12 -0
- package/dist/enums/entities/ViewFilterCondition.js +14 -0
- package/dist/enums/execution-method.d.ts +8 -0
- package/dist/enums/execution-method.js +10 -0
- package/dist/enums/flag.d.ts +197 -0
- package/dist/enums/flag.js +199 -0
- package/dist/enums/function-usage-range.d.ts +5 -0
- package/dist/enums/function-usage-range.js +7 -0
- package/dist/enums/image-format.d.ts +7 -0
- package/dist/enums/image-format.js +9 -0
- package/dist/enums/image-gravity.d.ts +11 -0
- package/dist/enums/image-gravity.js +13 -0
- package/dist/enums/index-type.d.ts +5 -0
- package/dist/enums/index-type.js +7 -0
- package/dist/enums/messaging-provider-type.d.ts +5 -0
- package/dist/enums/messaging-provider-type.js +7 -0
- package/dist/enums/name.d.ts +14 -0
- package/dist/enums/name.js +16 -0
- package/dist/enums/o-auth-provider copy.d.ts +41 -0
- package/dist/enums/o-auth-provider copy.js +43 -0
- package/dist/enums/password-hash.d.ts +13 -0
- package/dist/enums/password-hash.js +15 -0
- package/dist/enums/platform-type.d.ts +17 -0
- package/dist/enums/platform-type.js +19 -0
- package/dist/enums/project-usage-range.d.ts +4 -0
- package/dist/enums/project-usage-range.js +6 -0
- package/dist/enums/region.d.ts +4 -0
- package/dist/enums/region.js +6 -0
- package/dist/enums/relation-mutate.d.ts +5 -0
- package/dist/enums/relation-mutate.js +7 -0
- package/dist/enums/relationship-type.d.ts +6 -0
- package/dist/enums/relationship-type.js +8 -0
- package/dist/enums/resource-type.d.ts +4 -0
- package/dist/enums/resource-type.js +6 -0
- package/dist/enums/runtime.d.ts +48 -0
- package/dist/enums/runtime.js +50 -0
- package/dist/enums/s-m-t-p-secure.d.ts +3 -0
- package/dist/enums/s-m-t-p-secure.js +5 -0
- package/dist/enums/shared/ApplicationLayout.d.ts +4 -0
- package/dist/enums/shared/ApplicationLayout.js +6 -0
- package/dist/enums/shared/Colors.d.ts +24 -0
- package/dist/enums/shared/Colors.js +26 -0
- package/dist/enums/shared/InputType.d.ts +6 -0
- package/dist/enums/shared/InputType.js +8 -0
- package/dist/enums/shared/Periodicity.d.ts +7 -0
- package/dist/enums/shared/Periodicity.js +9 -0
- package/dist/enums/shared/SvgIcon.d.ts +37 -0
- package/dist/enums/shared/SvgIcon.js +39 -0
- package/dist/enums/shared/Theme.d.ts +4 -0
- package/dist/enums/shared/Theme.js +6 -0
- package/dist/enums/sms-template-locale.d.ts +133 -0
- package/dist/enums/sms-template-locale.js +135 -0
- package/dist/enums/sms-template-type.d.ts +6 -0
- package/dist/enums/sms-template-type.js +8 -0
- package/dist/enums/smtp-encryption.d.ts +5 -0
- package/dist/enums/smtp-encryption.js +7 -0
- package/dist/enums/storage-usage-range.d.ts +5 -0
- package/dist/enums/storage-usage-range.js +7 -0
- package/dist/enums/subscriptions/PricingModel.d.ts +11 -0
- package/dist/enums/subscriptions/PricingModel.js +12 -0
- package/dist/enums/subscriptions/SubscriptionBillingPeriod.d.ts +10 -0
- package/dist/enums/subscriptions/SubscriptionBillingPeriod.js +11 -0
- package/dist/enums/subscriptions/SubscriptionFeatureLimitType.d.ts +10 -0
- package/dist/enums/subscriptions/SubscriptionFeatureLimitType.js +13 -0
- package/dist/enums/subscriptions/SubscriptionPriceType.d.ts +7 -0
- package/dist/enums/subscriptions/SubscriptionPriceType.js +8 -0
- package/dist/enums/tenants/LinkedAccountStatus.d.ts +5 -0
- package/dist/enums/tenants/LinkedAccountStatus.js +7 -0
- package/dist/enums/tenants/TenantUserJoined.d.ts +6 -0
- package/dist/enums/tenants/TenantUserJoined.js +8 -0
- package/dist/enums/tenants/TenantUserStatus.d.ts +6 -0
- package/dist/enums/tenants/TenantUserStatus.js +8 -0
- package/dist/enums/tenants/TenantUserType.d.ts +5 -0
- package/dist/enums/tenants/TenantUserType.js +7 -0
- package/dist/enums/user-usage-range.d.ts +5 -0
- package/dist/enums/user-usage-range.js +7 -0
- package/dist/getAppcondaClient.d.ts +3 -0
- package/dist/getAppcondaClient.js +71 -0
- package/dist/getSDKForCurrentUser.d.ts +59 -0
- package/dist/getSDKForCurrentUser.js +100 -0
- package/dist/getSDKForService.d.ts +18 -0
- package/dist/getSDKForService.js +67 -0
- package/dist/getSDKForTenant.d.ts +20 -0
- package/dist/getSDKForTenant.js +44 -0
- package/dist/id.d.ts +20 -0
- package/dist/id.js +45 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/inputFile.d.ts +6 -0
- package/dist/inputFile.js +17 -0
- package/dist/lib/Cache/Adapter.d.ts +10 -0
- package/dist/lib/Cache/Adapter.js +2 -0
- package/dist/lib/Cache/Adapters/Filesystem.d.ts +16 -0
- package/dist/lib/Cache/Adapters/Filesystem.js +103 -0
- package/dist/lib/Cache/Adapters/Memory.d.ts +18 -0
- package/dist/lib/Cache/Adapters/Memory.js +47 -0
- package/dist/lib/Cache/Adapters/None.d.ts +12 -0
- package/dist/lib/Cache/Adapters/None.js +28 -0
- package/dist/lib/Cache/Adapters/Sharding.d.ts +17 -0
- package/dist/lib/Cache/Adapters/Sharding.js +73 -0
- package/dist/lib/Cache/Cache.d.ts +16 -0
- package/dist/lib/Cache/Cache.js +52 -0
- package/dist/lib/Cache/index.d.ts +4 -0
- package/dist/lib/Cache/index.js +5 -0
- package/dist/lib/Cache/test.d.ts +0 -0
- package/dist/lib/Cache/test.js +1 -0
- package/dist/lib/Registry/Registry.d.ts +38 -0
- package/dist/lib/Registry/Registry.js +56 -0
- package/dist/lib/Registry/index.d.ts +1 -0
- package/dist/lib/Registry/index.js +2 -0
- package/dist/lib/Services.d.ts +6 -0
- package/dist/lib/Services.js +14 -0
- package/dist/lib/crypto.d.ts +23 -0
- package/dist/lib/crypto.js +78 -0
- package/dist/lib/env.d.ts +1 -0
- package/dist/lib/env.js +137 -0
- package/dist/lib/errors.d.ts +70 -0
- package/dist/lib/errors.js +79 -0
- package/dist/lib/index.d.ts +0 -0
- package/dist/lib/index.js +1 -0
- package/dist/lib/jwt.d.ts +12 -0
- package/dist/lib/jwt.js +103 -0
- package/dist/lib/types.d.ts +5 -0
- package/dist/lib/types.js +2 -0
- package/dist/models.d.ts +3272 -0
- package/dist/models.js +2 -0
- package/dist/modules/account/actions.d.ts +11 -0
- package/dist/modules/account/actions.js +49 -0
- package/dist/modules/account/enums/authentication-factor.d.ts +6 -0
- package/dist/modules/account/enums/authentication-factor.js +8 -0
- package/dist/modules/account/enums/authenticator-type.d.ts +3 -0
- package/dist/modules/account/enums/authenticator-type.js +5 -0
- package/dist/modules/account/enums/o-auth-provider.d.ts +41 -0
- package/dist/modules/account/enums/o-auth-provider.js +43 -0
- package/dist/modules/account/index.d.ts +2 -0
- package/dist/modules/account/index.js +3 -0
- package/dist/modules/account/schema.d.ts +7 -0
- package/dist/modules/account/schema.js +8 -0
- package/dist/modules/account/service.d.ts +530 -0
- package/dist/modules/account/service.js +1263 -0
- package/dist/modules/account/types.d.ts +411 -0
- package/dist/modules/account/types.js +2 -0
- package/dist/modules/accounv1/action.d.ts +9 -0
- package/dist/modules/accounv1/action.js +88 -0
- package/dist/modules/accounv1/index.d.ts +3 -0
- package/dist/modules/accounv1/index.js +4 -0
- package/dist/modules/accounv1/schema.d.ts +43 -0
- package/dist/modules/accounv1/schema.js +44 -0
- package/dist/modules/accounv1/service.d.ts +14 -0
- package/dist/modules/accounv1/service.js +28 -0
- package/dist/modules/accounv1/types.d.ts +14 -0
- package/dist/modules/accounv1/types.js +2 -0
- package/dist/modules/acl/service.d.ts +26 -0
- package/dist/modules/acl/service.js +27 -0
- package/dist/modules/agent/action.d.ts +29 -0
- package/dist/modules/agent/action.js +53 -0
- package/dist/modules/agent/index.d.ts +4 -0
- package/dist/modules/agent/index.js +5 -0
- package/dist/modules/agent/schema.d.ts +20 -0
- package/dist/modules/agent/schema.js +21 -0
- package/dist/modules/agent/service.d.ts +12 -0
- package/dist/modules/agent/service.js +22 -0
- package/dist/modules/agent/types.d.ts +11 -0
- package/dist/modules/agent/types.js +2 -0
- package/dist/modules/ai/index.d.ts +1 -0
- package/dist/modules/ai/index.js +2 -0
- package/dist/modules/ai/node/actions.d.ts +4 -0
- package/dist/modules/ai/node/actions.js +14 -0
- package/dist/modules/ai/node/index.d.ts +2 -0
- package/dist/modules/ai/node/index.js +3 -0
- package/dist/modules/ai/node/service.d.ts +5 -0
- package/dist/modules/ai/node/service.js +12 -0
- package/dist/modules/bpm/action.d.ts +7 -0
- package/dist/modules/bpm/action.js +60 -0
- package/dist/modules/bpm/index.d.ts +3 -0
- package/dist/modules/bpm/index.js +4 -0
- package/dist/modules/bpm/schema.d.ts +18 -0
- package/dist/modules/bpm/schema.js +19 -0
- package/dist/modules/bpm/service.d.ts +11 -0
- package/dist/modules/bpm/service.js +19 -0
- package/dist/modules/bpm/types.d.ts +9 -0
- package/dist/modules/bpm/types.js +2 -0
- package/dist/modules/builder/action.d.ts +18 -0
- package/dist/modules/builder/action.js +214 -0
- package/dist/modules/builder/index.d.ts +4 -0
- package/dist/modules/builder/index.js +5 -0
- package/dist/modules/builder/schema.d.ts +80 -0
- package/dist/modules/builder/schema.js +81 -0
- package/dist/modules/builder/service.d.ts +22 -0
- package/dist/modules/builder/service.js +52 -0
- package/dist/modules/builder/types.d.ts +62 -0
- package/dist/modules/builder/types.js +2 -0
- package/dist/modules/datasource/action.d.ts +14 -0
- package/dist/modules/datasource/action.js +172 -0
- package/dist/modules/datasource/index.d.ts +4 -0
- package/dist/modules/datasource/index.js +5 -0
- package/dist/modules/datasource/schema.d.ts +55 -0
- package/dist/modules/datasource/schema.js +56 -0
- package/dist/modules/datasource/service.d.ts +19 -0
- package/dist/modules/datasource/service.js +43 -0
- package/dist/modules/datasource/types.d.ts +28 -0
- package/dist/modules/datasource/types.js +2 -0
- package/dist/modules/emploid/action.d.ts +73 -0
- package/dist/modules/emploid/action.js +984 -0
- package/dist/modules/emploid/index.d.ts +4 -0
- package/dist/modules/emploid/index.js +5 -0
- package/dist/modules/emploid/schema.d.ts +386 -0
- package/dist/modules/emploid/schema.js +331 -0
- package/dist/modules/emploid/service.d.ts +77 -0
- package/dist/modules/emploid/service.js +217 -0
- package/dist/modules/emploid/types.d.ts +114 -0
- package/dist/modules/emploid/types.js +2 -0
- package/dist/modules/google/action.d.ts +5 -0
- package/dist/modules/google/action.js +46 -0
- package/dist/modules/google/index.d.ts +4 -0
- package/dist/modules/google/index.js +5 -0
- package/dist/modules/google/schema.d.ts +13 -0
- package/dist/modules/google/schema.js +14 -0
- package/dist/modules/google/service.d.ts +10 -0
- package/dist/modules/google/service.js +16 -0
- package/dist/modules/google/types.d.ts +12 -0
- package/dist/modules/google/types.js +2 -0
- package/dist/modules/hooks/index.d.ts +3 -0
- package/dist/modules/hooks/index.js +4 -0
- package/dist/modules/hooks/lib/Hooks.d.ts +32 -0
- package/dist/modules/hooks/lib/Hooks.js +64 -0
- package/dist/modules/hooks/lib/handler.d.ts +12 -0
- package/dist/modules/hooks/lib/handler.js +23 -0
- package/dist/modules/hooks/lib/jobs/index.d.ts +2 -0
- package/dist/modules/hooks/lib/jobs/index.js +3 -0
- package/dist/modules/hooks/lib/jobs/job1.d.ts +1 -0
- package/dist/modules/hooks/lib/jobs/job1.js +16 -0
- package/dist/modules/hooks/lib/jobs/log-job.d.ts +1 -0
- package/dist/modules/hooks/lib/jobs/log-job.js +9 -0
- package/dist/modules/hooks/lib/wait.d.ts +8 -0
- package/dist/modules/hooks/lib/wait.js +13 -0
- package/dist/modules/index.d.ts +17 -0
- package/dist/modules/index.js +18 -0
- package/dist/modules/mail/action.d.ts +3 -0
- package/dist/modules/mail/action.js +18 -0
- package/dist/modules/mail/index.d.ts +4 -0
- package/dist/modules/mail/index.js +5 -0
- package/dist/modules/mail/schema.d.ts +6 -0
- package/dist/modules/mail/schema.js +7 -0
- package/dist/modules/mail/service.d.ts +8 -0
- package/dist/modules/mail/service.js +10 -0
- package/dist/modules/mail/types.d.ts +6 -0
- package/dist/modules/mail/types.js +2 -0
- package/dist/modules/notion/action.d.ts +5 -0
- package/dist/modules/notion/action.js +46 -0
- package/dist/modules/notion/index.d.ts +4 -0
- package/dist/modules/notion/index.js +5 -0
- package/dist/modules/notion/schema.d.ts +13 -0
- package/dist/modules/notion/schema.js +14 -0
- package/dist/modules/notion/service.d.ts +10 -0
- package/dist/modules/notion/service.js +19 -0
- package/dist/modules/notion/types.d.ts +11 -0
- package/dist/modules/notion/types.js +2 -0
- package/dist/modules/organization/action.d.ts +7 -0
- package/dist/modules/organization/action.js +60 -0
- package/dist/modules/organization/index.d.ts +4 -0
- package/dist/modules/organization/index.js +5 -0
- package/dist/modules/organization/schema.d.ts +24 -0
- package/dist/modules/organization/schema.js +20 -0
- package/dist/modules/organization/service.d.ts +11 -0
- package/dist/modules/organization/service.js +19 -0
- package/dist/modules/organization/types.d.ts +11 -0
- package/dist/modules/organization/types.js +2 -0
- package/dist/modules/scheduled-job/action.d.ts +70 -0
- package/dist/modules/scheduled-job/action.js +173 -0
- package/dist/modules/scheduled-job/index.d.ts +7 -0
- package/dist/modules/scheduled-job/index.js +8 -0
- package/dist/modules/scheduled-job/lib/Schedules.d.ts +34 -0
- package/dist/modules/scheduled-job/lib/Schedules.js +65 -0
- package/dist/modules/scheduled-job/lib/handler.d.ts +13 -0
- package/dist/modules/scheduled-job/lib/handler.js +23 -0
- package/dist/modules/scheduled-job/lib/jobs/index.d.ts +1 -0
- package/dist/modules/scheduled-job/lib/jobs/index.js +2 -0
- package/dist/modules/scheduled-job/lib/jobs/job1.d.ts +1 -0
- package/dist/modules/scheduled-job/lib/jobs/job1.js +10 -0
- package/dist/modules/scheduled-job/lib/wait.d.ts +8 -0
- package/dist/modules/scheduled-job/lib/wait.js +13 -0
- package/dist/modules/scheduled-job/schema.d.ts +39 -0
- package/dist/modules/scheduled-job/schema.js +40 -0
- package/dist/modules/scheduled-job/service.d.ts +20 -0
- package/dist/modules/scheduled-job/service.js +46 -0
- package/dist/modules/scheduled-job/types.d.ts +66 -0
- package/dist/modules/scheduled-job/types.js +2 -0
- package/dist/modules/task/action.d.ts +64 -0
- package/dist/modules/task/action.js +758 -0
- package/dist/modules/task/index.d.ts +4 -0
- package/dist/modules/task/index.js +5 -0
- package/dist/modules/task/schema.d.ts +355 -0
- package/dist/modules/task/schema.js +371 -0
- package/dist/modules/task/service.d.ts +69 -0
- package/dist/modules/task/service.js +193 -0
- package/dist/modules/task/types.d.ts +293 -0
- package/dist/modules/task/types.js +37 -0
- package/dist/modules/tenant/actions.d.ts +10 -0
- package/dist/modules/tenant/actions.js +160 -0
- package/dist/modules/tenant/index.d.ts +3 -0
- package/dist/modules/tenant/index.js +4 -0
- package/dist/modules/tenant/schema.d.ts +26 -0
- package/dist/modules/tenant/schema.js +28 -0
- package/dist/modules/tenant/service.d.ts +14 -0
- package/dist/modules/tenant/service.js +28 -0
- package/dist/modules/tenant/tenant.d.ts +32 -0
- package/dist/modules/tenant/tenant.js +125 -0
- package/dist/modules/tenant/types.d.ts +20 -0
- package/dist/modules/tenant/types.js +2 -0
- package/dist/modules/waitlist/action.d.ts +6 -0
- package/dist/modules/waitlist/action.js +78 -0
- package/dist/modules/waitlist/index.d.ts +4 -0
- package/dist/modules/waitlist/index.js +5 -0
- package/dist/modules/waitlist/schema.d.ts +17 -0
- package/dist/modules/waitlist/schema.js +18 -0
- package/dist/modules/waitlist/service.d.ts +13 -0
- package/dist/modules/waitlist/service.js +28 -0
- package/dist/modules/waitlist/types.d.ts +14 -0
- package/dist/modules/waitlist/types.js +2 -0
- package/dist/permission.d.ts +43 -0
- package/dist/permission.js +54 -0
- package/dist/query.d.ts +194 -0
- package/dist/query.js +204 -0
- package/dist/role.d.ts +70 -0
- package/dist/role.js +94 -0
- package/dist/schemas/nodes.d.ts +0 -0
- package/dist/schemas/nodes.js +1 -0
- package/dist/service-client.d.ts +8 -0
- package/dist/service-client.js +22 -0
- package/dist/service.d.ts +11 -0
- package/dist/service.js +23 -0
- package/dist/services/applets.d.ts +9 -0
- package/dist/services/applets.js +40 -0
- package/dist/services/avatars.d.ts +115 -0
- package/dist/services/avatars.js +251 -0
- package/dist/services/chat-flow.d.ts +7 -0
- package/dist/services/chat-flow.js +26 -0
- package/dist/services/community.d.ts +19 -0
- package/dist/services/community.js +69 -0
- package/dist/services/configuration.d.ts +5 -0
- package/dist/services/configuration.js +11 -0
- package/dist/services/databases.d.ts +613 -0
- package/dist/services/databases.js +1736 -0
- package/dist/services/functions.d.ts +319 -0
- package/dist/services/functions.js +810 -0
- package/dist/services/graphql.d.ts +25 -0
- package/dist/services/graphql.js +57 -0
- package/dist/services/health.d.ts +231 -0
- package/dist/services/health.js +463 -0
- package/dist/services/locale.d.ts +80 -0
- package/dist/services/locale.js +144 -0
- package/dist/services/messaging.d.ts +685 -0
- package/dist/services/messaging.js +1920 -0
- package/dist/services/permissions.d.ts +20 -0
- package/dist/services/permissions.js +90 -0
- package/dist/services/pricing.d.ts +15 -0
- package/dist/services/pricing.js +21 -0
- package/dist/services/projects.d.ts +542 -0
- package/dist/services/projects.js +1526 -0
- package/dist/services/roles.d.ts +19 -0
- package/dist/services/roles.js +72 -0
- package/dist/services/schema.d.ts +17 -0
- package/dist/services/schema.js +48 -0
- package/dist/services/storage.d.ts +189 -0
- package/dist/services/storage.js +474 -0
- package/dist/services/subscription.d.ts +15 -0
- package/dist/services/subscription.js +30 -0
- package/dist/services/teams.d.ts +167 -0
- package/dist/services/teams.js +395 -0
- package/dist/services/tenant-subscription.d.ts +12 -0
- package/dist/services/tenant-subscription.js +52 -0
- package/dist/services/users.d.ts +499 -0
- package/dist/services/users.js +1283 -0
- package/docs/examples/account/create-anonymous-session.md +11 -0
- package/docs/examples/account/create-email-password-session.md +14 -0
- package/docs/examples/account/create-email-token.md +15 -0
- package/docs/examples/account/create-j-w-t.md +11 -0
- package/docs/examples/account/create-magic-u-r-l-token.md +16 -0
- package/docs/examples/account/create-mfa-authenticator.md +13 -0
- package/docs/examples/account/create-mfa-challenge.md +13 -0
- package/docs/examples/account/create-mfa-recovery-codes.md +11 -0
- package/docs/examples/account/create-o-auth2session.md +15 -0
- package/docs/examples/account/create-o-auth2token.md +15 -0
- package/docs/examples/account/create-phone-token.md +14 -0
- package/docs/examples/account/create-phone-verification.md +11 -0
- package/docs/examples/account/create-push-target.md +15 -0
- package/docs/examples/account/create-recovery.md +14 -0
- package/docs/examples/account/create-session.md +14 -0
- package/docs/examples/account/create-verification.md +13 -0
- package/docs/examples/account/create.md +16 -0
- package/docs/examples/account/delete-identity.md +13 -0
- package/docs/examples/account/delete-mfa-authenticator.md +13 -0
- package/docs/examples/account/delete-push-target.md +13 -0
- package/docs/examples/account/delete-session.md +13 -0
- package/docs/examples/account/delete-sessions.md +11 -0
- package/docs/examples/account/delete.md +11 -0
- package/docs/examples/account/get-mfa-recovery-codes.md +11 -0
- package/docs/examples/account/get-prefs.md +11 -0
- package/docs/examples/account/get-session.md +13 -0
- package/docs/examples/account/get.md +11 -0
- package/docs/examples/account/list-identities.md +13 -0
- package/docs/examples/account/list-logs.md +13 -0
- package/docs/examples/account/list-mfa-factors.md +11 -0
- package/docs/examples/account/list-sessions.md +11 -0
- package/docs/examples/account/update-email.md +14 -0
- package/docs/examples/account/update-m-f-a.md +13 -0
- package/docs/examples/account/update-magic-u-r-l-session.md +14 -0
- package/docs/examples/account/update-mfa-authenticator.md +14 -0
- package/docs/examples/account/update-mfa-challenge.md +14 -0
- package/docs/examples/account/update-mfa-recovery-codes.md +11 -0
- package/docs/examples/account/update-name.md +13 -0
- package/docs/examples/account/update-password.md +14 -0
- package/docs/examples/account/update-phone-session.md +14 -0
- package/docs/examples/account/update-phone-verification.md +14 -0
- package/docs/examples/account/update-phone.md +14 -0
- package/docs/examples/account/update-prefs.md +13 -0
- package/docs/examples/account/update-push-target.md +14 -0
- package/docs/examples/account/update-recovery.md +15 -0
- package/docs/examples/account/update-session.md +13 -0
- package/docs/examples/account/update-status.md +11 -0
- package/docs/examples/account/update-verification.md +14 -0
- package/docs/examples/assistant/chat.md +13 -0
- package/docs/examples/avatars/get-browser.md +16 -0
- package/docs/examples/avatars/get-credit-card.md +16 -0
- package/docs/examples/avatars/get-favicon.md +13 -0
- package/docs/examples/avatars/get-flag.md +16 -0
- package/docs/examples/avatars/get-image.md +15 -0
- package/docs/examples/avatars/get-initials.md +16 -0
- package/docs/examples/avatars/get-q-r.md +16 -0
- package/docs/examples/console/variables.md +11 -0
- package/docs/examples/databases/create-boolean-attribute.md +18 -0
- package/docs/examples/databases/create-collection.md +18 -0
- package/docs/examples/databases/create-datetime-attribute.md +18 -0
- package/docs/examples/databases/create-document.md +17 -0
- package/docs/examples/databases/create-email-attribute.md +18 -0
- package/docs/examples/databases/create-enum-attribute.md +19 -0
- package/docs/examples/databases/create-float-attribute.md +20 -0
- package/docs/examples/databases/create-index.md +18 -0
- package/docs/examples/databases/create-integer-attribute.md +20 -0
- package/docs/examples/databases/create-ip-attribute.md +18 -0
- package/docs/examples/databases/create-relationship-attribute.md +20 -0
- package/docs/examples/databases/create-string-attribute.md +20 -0
- package/docs/examples/databases/create-url-attribute.md +18 -0
- package/docs/examples/databases/create.md +15 -0
- package/docs/examples/databases/delete-attribute.md +15 -0
- package/docs/examples/databases/delete-collection.md +14 -0
- package/docs/examples/databases/delete-document.md +15 -0
- package/docs/examples/databases/delete-index.md +15 -0
- package/docs/examples/databases/delete.md +13 -0
- package/docs/examples/databases/get-attribute.md +15 -0
- package/docs/examples/databases/get-collection-usage.md +15 -0
- package/docs/examples/databases/get-collection.md +14 -0
- package/docs/examples/databases/get-database-usage.md +14 -0
- package/docs/examples/databases/get-document.md +16 -0
- package/docs/examples/databases/get-index.md +15 -0
- package/docs/examples/databases/get-usage.md +13 -0
- package/docs/examples/databases/get.md +13 -0
- package/docs/examples/databases/list-attributes.md +15 -0
- package/docs/examples/databases/list-collection-logs.md +15 -0
- package/docs/examples/databases/list-collections.md +15 -0
- package/docs/examples/databases/list-document-logs.md +16 -0
- package/docs/examples/databases/list-documents.md +15 -0
- package/docs/examples/databases/list-indexes.md +15 -0
- package/docs/examples/databases/list-logs.md +14 -0
- package/docs/examples/databases/list.md +14 -0
- package/docs/examples/databases/update-boolean-attribute.md +17 -0
- package/docs/examples/databases/update-collection.md +18 -0
- package/docs/examples/databases/update-datetime-attribute.md +17 -0
- package/docs/examples/databases/update-document.md +17 -0
- package/docs/examples/databases/update-email-attribute.md +17 -0
- package/docs/examples/databases/update-enum-attribute.md +18 -0
- package/docs/examples/databases/update-float-attribute.md +19 -0
- package/docs/examples/databases/update-integer-attribute.md +19 -0
- package/docs/examples/databases/update-ip-attribute.md +17 -0
- package/docs/examples/databases/update-relationship-attribute.md +16 -0
- package/docs/examples/databases/update-string-attribute.md +17 -0
- package/docs/examples/databases/update-url-attribute.md +17 -0
- package/docs/examples/databases/update.md +15 -0
- package/docs/examples/functions/create-build.md +15 -0
- package/docs/examples/functions/create-deployment.md +17 -0
- package/docs/examples/functions/create-execution.md +19 -0
- package/docs/examples/functions/create-variable.md +15 -0
- package/docs/examples/functions/create.md +34 -0
- package/docs/examples/functions/delete-deployment.md +14 -0
- package/docs/examples/functions/delete-execution.md +14 -0
- package/docs/examples/functions/delete-variable.md +14 -0
- package/docs/examples/functions/delete.md +13 -0
- package/docs/examples/functions/get-deployment-download.md +14 -0
- package/docs/examples/functions/get-deployment.md +14 -0
- package/docs/examples/functions/get-execution.md +14 -0
- package/docs/examples/functions/get-function-usage.md +14 -0
- package/docs/examples/functions/get-template.md +13 -0
- package/docs/examples/functions/get-usage.md +13 -0
- package/docs/examples/functions/get-variable.md +14 -0
- package/docs/examples/functions/get.md +13 -0
- package/docs/examples/functions/list-deployments.md +15 -0
- package/docs/examples/functions/list-executions.md +15 -0
- package/docs/examples/functions/list-runtimes.md +11 -0
- package/docs/examples/functions/list-specifications.md +11 -0
- package/docs/examples/functions/list-templates.md +16 -0
- package/docs/examples/functions/list-variables.md +13 -0
- package/docs/examples/functions/list.md +14 -0
- package/docs/examples/functions/update-deployment-build.md +14 -0
- package/docs/examples/functions/update-deployment.md +14 -0
- package/docs/examples/functions/update-variable.md +16 -0
- package/docs/examples/functions/update.md +30 -0
- package/docs/examples/graphql/mutation.md +13 -0
- package/docs/examples/graphql/query.md +13 -0
- package/docs/examples/health/get-antivirus.md +11 -0
- package/docs/examples/health/get-cache.md +11 -0
- package/docs/examples/health/get-certificate.md +13 -0
- package/docs/examples/health/get-d-b.md +11 -0
- package/docs/examples/health/get-failed-jobs.md +14 -0
- package/docs/examples/health/get-pub-sub.md +11 -0
- package/docs/examples/health/get-queue-builds.md +13 -0
- package/docs/examples/health/get-queue-certificates.md +13 -0
- package/docs/examples/health/get-queue-databases.md +14 -0
- package/docs/examples/health/get-queue-deletes.md +13 -0
- package/docs/examples/health/get-queue-functions.md +13 -0
- package/docs/examples/health/get-queue-logs.md +13 -0
- package/docs/examples/health/get-queue-mails.md +13 -0
- package/docs/examples/health/get-queue-messaging.md +13 -0
- package/docs/examples/health/get-queue-migrations.md +13 -0
- package/docs/examples/health/get-queue-usage-dump.md +13 -0
- package/docs/examples/health/get-queue-usage.md +13 -0
- package/docs/examples/health/get-queue-webhooks.md +13 -0
- package/docs/examples/health/get-queue.md +11 -0
- package/docs/examples/health/get-storage-local.md +11 -0
- package/docs/examples/health/get-storage.md +11 -0
- package/docs/examples/health/get-time.md +11 -0
- package/docs/examples/health/get.md +11 -0
- package/docs/examples/locale/get.md +11 -0
- package/docs/examples/locale/list-codes.md +11 -0
- package/docs/examples/locale/list-continents.md +11 -0
- package/docs/examples/locale/list-countries-e-u.md +11 -0
- package/docs/examples/locale/list-countries-phones.md +11 -0
- package/docs/examples/locale/list-countries.md +11 -0
- package/docs/examples/locale/list-currencies.md +11 -0
- package/docs/examples/locale/list-languages.md +11 -0
- package/docs/examples/messaging/create-apns-provider.md +20 -0
- package/docs/examples/messaging/create-email.md +24 -0
- package/docs/examples/messaging/create-fcm-provider.md +16 -0
- package/docs/examples/messaging/create-mailgun-provider.md +22 -0
- package/docs/examples/messaging/create-msg91provider.md +18 -0
- package/docs/examples/messaging/create-push.md +28 -0
- package/docs/examples/messaging/create-sendgrid-provider.md +20 -0
- package/docs/examples/messaging/create-sms.md +19 -0
- package/docs/examples/messaging/create-smtp-provider.md +26 -0
- package/docs/examples/messaging/create-subscriber.md +15 -0
- package/docs/examples/messaging/create-telesign-provider.md +18 -0
- package/docs/examples/messaging/create-textmagic-provider.md +18 -0
- package/docs/examples/messaging/create-topic.md +15 -0
- package/docs/examples/messaging/create-twilio-provider.md +18 -0
- package/docs/examples/messaging/create-vonage-provider.md +18 -0
- package/docs/examples/messaging/delete-provider.md +13 -0
- package/docs/examples/messaging/delete-subscriber.md +14 -0
- package/docs/examples/messaging/delete-topic.md +13 -0
- package/docs/examples/messaging/delete.md +13 -0
- package/docs/examples/messaging/get-message.md +13 -0
- package/docs/examples/messaging/get-provider.md +13 -0
- package/docs/examples/messaging/get-subscriber.md +14 -0
- package/docs/examples/messaging/get-topic.md +13 -0
- package/docs/examples/messaging/list-message-logs.md +14 -0
- package/docs/examples/messaging/list-messages.md +14 -0
- package/docs/examples/messaging/list-provider-logs.md +14 -0
- package/docs/examples/messaging/list-providers.md +14 -0
- package/docs/examples/messaging/list-subscriber-logs.md +14 -0
- package/docs/examples/messaging/list-subscribers.md +15 -0
- package/docs/examples/messaging/list-targets.md +14 -0
- package/docs/examples/messaging/list-topic-logs.md +14 -0
- package/docs/examples/messaging/list-topics.md +14 -0
- package/docs/examples/messaging/update-apns-provider.md +20 -0
- package/docs/examples/messaging/update-email.md +24 -0
- package/docs/examples/messaging/update-fcm-provider.md +16 -0
- package/docs/examples/messaging/update-mailgun-provider.md +22 -0
- package/docs/examples/messaging/update-msg91provider.md +18 -0
- package/docs/examples/messaging/update-push.md +28 -0
- package/docs/examples/messaging/update-sendgrid-provider.md +20 -0
- package/docs/examples/messaging/update-sms.md +19 -0
- package/docs/examples/messaging/update-smtp-provider.md +26 -0
- package/docs/examples/messaging/update-telesign-provider.md +18 -0
- package/docs/examples/messaging/update-textmagic-provider.md +18 -0
- package/docs/examples/messaging/update-topic.md +15 -0
- package/docs/examples/messaging/update-twilio-provider.md +18 -0
- package/docs/examples/messaging/update-vonage-provider.md +18 -0
- package/docs/examples/migrations/create-appwrite-migration.md +16 -0
- package/docs/examples/migrations/create-firebase-migration.md +14 -0
- package/docs/examples/migrations/create-firebase-o-auth-migration.md +14 -0
- package/docs/examples/migrations/create-n-host-migration.md +20 -0
- package/docs/examples/migrations/create-supabase-migration.md +19 -0
- package/docs/examples/migrations/delete-firebase-auth.md +11 -0
- package/docs/examples/migrations/delete.md +13 -0
- package/docs/examples/migrations/get-appwrite-report.md +16 -0
- package/docs/examples/migrations/get-firebase-report-o-auth.md +14 -0
- package/docs/examples/migrations/get-firebase-report.md +14 -0
- package/docs/examples/migrations/get-n-host-report.md +20 -0
- package/docs/examples/migrations/get-supabase-report.md +19 -0
- package/docs/examples/migrations/get.md +13 -0
- package/docs/examples/migrations/list-firebase-projects.md +11 -0
- package/docs/examples/migrations/list.md +14 -0
- package/docs/examples/migrations/retry.md +13 -0
- package/docs/examples/project/create-variable.md +14 -0
- package/docs/examples/project/delete-variable.md +13 -0
- package/docs/examples/project/get-usage.md +15 -0
- package/docs/examples/project/get-variable.md +13 -0
- package/docs/examples/project/list-variables.md +11 -0
- package/docs/examples/project/update-variable.md +15 -0
- package/docs/examples/projects/create-j-w-t.md +15 -0
- package/docs/examples/projects/create-key.md +16 -0
- package/docs/examples/projects/create-platform.md +18 -0
- package/docs/examples/projects/create-smtp-test.md +22 -0
- package/docs/examples/projects/create-webhook.md +20 -0
- package/docs/examples/projects/create.md +25 -0
- package/docs/examples/projects/delete-email-template.md +15 -0
- package/docs/examples/projects/delete-key.md +14 -0
- package/docs/examples/projects/delete-platform.md +14 -0
- package/docs/examples/projects/delete-sms-template.md +15 -0
- package/docs/examples/projects/delete-webhook.md +14 -0
- package/docs/examples/projects/delete.md +13 -0
- package/docs/examples/projects/get-email-template.md +15 -0
- package/docs/examples/projects/get-key.md +14 -0
- package/docs/examples/projects/get-platform.md +14 -0
- package/docs/examples/projects/get-sms-template.md +15 -0
- package/docs/examples/projects/get-webhook.md +14 -0
- package/docs/examples/projects/get.md +13 -0
- package/docs/examples/projects/list-keys.md +13 -0
- package/docs/examples/projects/list-platforms.md +13 -0
- package/docs/examples/projects/list-webhooks.md +13 -0
- package/docs/examples/projects/list.md +14 -0
- package/docs/examples/projects/update-api-status-all.md +14 -0
- package/docs/examples/projects/update-api-status.md +15 -0
- package/docs/examples/projects/update-auth-duration.md +14 -0
- package/docs/examples/projects/update-auth-limit.md +14 -0
- package/docs/examples/projects/update-auth-password-dictionary.md +14 -0
- package/docs/examples/projects/update-auth-password-history.md +14 -0
- package/docs/examples/projects/update-auth-sessions-limit.md +14 -0
- package/docs/examples/projects/update-auth-status.md +15 -0
- package/docs/examples/projects/update-email-template.md +20 -0
- package/docs/examples/projects/update-key.md +17 -0
- package/docs/examples/projects/update-mock-numbers.md +14 -0
- package/docs/examples/projects/update-o-auth2.md +17 -0
- package/docs/examples/projects/update-personal-data-check.md +14 -0
- package/docs/examples/projects/update-platform.md +18 -0
- package/docs/examples/projects/update-service-status-all.md +14 -0
- package/docs/examples/projects/update-service-status.md +15 -0
- package/docs/examples/projects/update-session-alerts.md +14 -0
- package/docs/examples/projects/update-sms-template.md +16 -0
- package/docs/examples/projects/update-smtp.md +22 -0
- package/docs/examples/projects/update-team.md +14 -0
- package/docs/examples/projects/update-webhook-signature.md +14 -0
- package/docs/examples/projects/update-webhook.md +21 -0
- package/docs/examples/projects/update.md +23 -0
- package/docs/examples/proxy/create-rule.md +15 -0
- package/docs/examples/proxy/delete-rule.md +13 -0
- package/docs/examples/proxy/get-rule.md +13 -0
- package/docs/examples/proxy/list-rules.md +14 -0
- package/docs/examples/proxy/update-rule-verification.md +13 -0
- package/docs/examples/storage/create-bucket.md +22 -0
- package/docs/examples/storage/create-file.md +16 -0
- package/docs/examples/storage/delete-bucket.md +13 -0
- package/docs/examples/storage/delete-file.md +14 -0
- package/docs/examples/storage/get-bucket-usage.md +14 -0
- package/docs/examples/storage/get-bucket.md +13 -0
- package/docs/examples/storage/get-file-download.md +14 -0
- package/docs/examples/storage/get-file-preview.md +25 -0
- package/docs/examples/storage/get-file-view.md +14 -0
- package/docs/examples/storage/get-file.md +14 -0
- package/docs/examples/storage/get-usage.md +13 -0
- package/docs/examples/storage/list-buckets.md +14 -0
- package/docs/examples/storage/list-files.md +15 -0
- package/docs/examples/storage/update-bucket.md +22 -0
- package/docs/examples/storage/update-file.md +16 -0
- package/docs/examples/teams/create-membership.md +19 -0
- package/docs/examples/teams/create.md +15 -0
- package/docs/examples/teams/delete-membership.md +14 -0
- package/docs/examples/teams/delete.md +13 -0
- package/docs/examples/teams/get-membership.md +14 -0
- package/docs/examples/teams/get-prefs.md +13 -0
- package/docs/examples/teams/get.md +13 -0
- package/docs/examples/teams/list-logs.md +14 -0
- package/docs/examples/teams/list-memberships.md +15 -0
- package/docs/examples/teams/list.md +14 -0
- package/docs/examples/teams/update-membership-status.md +16 -0
- package/docs/examples/teams/update-membership.md +15 -0
- package/docs/examples/teams/update-name.md +14 -0
- package/docs/examples/teams/update-prefs.md +14 -0
- package/docs/examples/users/create-argon2user.md +16 -0
- package/docs/examples/users/create-bcrypt-user.md +16 -0
- package/docs/examples/users/create-j-w-t.md +15 -0
- package/docs/examples/users/create-m-d5user.md +16 -0
- package/docs/examples/users/create-mfa-recovery-codes.md +13 -0
- package/docs/examples/users/create-p-h-pass-user.md +16 -0
- package/docs/examples/users/create-s-h-a-user.md +17 -0
- package/docs/examples/users/create-scrypt-modified-user.md +19 -0
- package/docs/examples/users/create-scrypt-user.md +21 -0
- package/docs/examples/users/create-session.md +13 -0
- package/docs/examples/users/create-target.md +18 -0
- package/docs/examples/users/create-token.md +15 -0
- package/docs/examples/users/create.md +17 -0
- package/docs/examples/users/delete-identity.md +13 -0
- package/docs/examples/users/delete-mfa-authenticator.md +14 -0
- package/docs/examples/users/delete-session.md +14 -0
- package/docs/examples/users/delete-sessions.md +13 -0
- package/docs/examples/users/delete-target.md +14 -0
- package/docs/examples/users/delete.md +13 -0
- package/docs/examples/users/get-mfa-recovery-codes.md +13 -0
- package/docs/examples/users/get-prefs.md +13 -0
- package/docs/examples/users/get-target.md +14 -0
- package/docs/examples/users/get-usage.md +13 -0
- package/docs/examples/users/get.md +13 -0
- package/docs/examples/users/list-identities.md +14 -0
- package/docs/examples/users/list-logs.md +14 -0
- package/docs/examples/users/list-memberships.md +13 -0
- package/docs/examples/users/list-mfa-factors.md +13 -0
- package/docs/examples/users/list-sessions.md +13 -0
- package/docs/examples/users/list-targets.md +14 -0
- package/docs/examples/users/list.md +14 -0
- package/docs/examples/users/update-email-verification.md +14 -0
- package/docs/examples/users/update-email.md +14 -0
- package/docs/examples/users/update-labels.md +14 -0
- package/docs/examples/users/update-mfa-recovery-codes.md +13 -0
- package/docs/examples/users/update-mfa.md +14 -0
- package/docs/examples/users/update-name.md +14 -0
- package/docs/examples/users/update-password.md +14 -0
- package/docs/examples/users/update-phone-verification.md +14 -0
- package/docs/examples/users/update-phone.md +14 -0
- package/docs/examples/users/update-prefs.md +14 -0
- package/docs/examples/users/update-status.md +14 -0
- package/docs/examples/users/update-target.md +17 -0
- package/docs/examples/vcs/create-repository-detection.md +15 -0
- package/docs/examples/vcs/create-repository.md +15 -0
- package/docs/examples/vcs/delete-installation.md +13 -0
- package/docs/examples/vcs/get-installation.md +13 -0
- package/docs/examples/vcs/get-repository-contents.md +15 -0
- package/docs/examples/vcs/get-repository.md +14 -0
- package/docs/examples/vcs/list-installations.md +14 -0
- package/docs/examples/vcs/list-repositories.md +14 -0
- package/docs/examples/vcs/list-repository-branches.md +14 -0
- package/docs/examples/vcs/update-external-deployments.md +15 -0
- package/package.json +38 -141
- package/publish.sh +4 -0
- package/src/client.ts +397 -0
- package/src/enums/api-service.ts +13 -0
- package/src/enums/api.ts +5 -0
- package/src/enums/auth-method.ts +9 -0
- package/src/enums/browser.ts +16 -0
- package/src/enums/compression.ts +5 -0
- package/src/enums/credit-card.ts +18 -0
- package/src/enums/database-usage-range.ts +5 -0
- package/src/enums/email-template-locale.ts +133 -0
- package/src/enums/email-template-type.ts +9 -0
- package/src/enums/entities/EntityLimitType.ts +4 -0
- package/src/enums/entities/PropertyAttributeName.ts +27 -0
- package/src/enums/entities/PropertyCondition.ts +8 -0
- package/src/enums/entities/PropertyType.ts +16 -0
- package/src/enums/entities/PropertyValueType.ts +6 -0
- package/src/enums/entities/RowAccess.ts +2 -0
- package/src/enums/entities/ViewFilterCondition.ts +12 -0
- package/src/enums/execution-method.ts +8 -0
- package/src/enums/flag.ts +197 -0
- package/src/enums/function-usage-range.ts +5 -0
- package/src/enums/image-format.ts +7 -0
- package/src/enums/image-gravity.ts +11 -0
- package/src/enums/index-type.ts +5 -0
- package/src/enums/messaging-provider-type.ts +5 -0
- package/src/enums/name.ts +14 -0
- package/src/enums/o-auth-provider copy.ts +41 -0
- package/src/enums/password-hash.ts +13 -0
- package/src/enums/platform-type.ts +17 -0
- package/src/enums/project-usage-range.ts +4 -0
- package/src/enums/region.ts +4 -0
- package/src/enums/relation-mutate.ts +5 -0
- package/src/enums/relationship-type.ts +6 -0
- package/src/enums/resource-type.ts +4 -0
- package/src/enums/runtime.ts +48 -0
- package/src/enums/s-m-t-p-secure.ts +3 -0
- package/src/enums/shared/ApplicationLayout.ts +4 -0
- package/src/enums/shared/Colors.ts +24 -0
- package/src/enums/shared/InputType.ts +6 -0
- package/src/enums/shared/Periodicity.ts +7 -0
- package/src/enums/shared/SvgIcon.ts +37 -0
- package/src/enums/shared/Theme.ts +4 -0
- package/src/enums/sms-template-locale.ts +133 -0
- package/src/enums/sms-template-type.ts +6 -0
- package/src/enums/smtp-encryption.ts +5 -0
- package/src/enums/storage-usage-range.ts +5 -0
- package/src/enums/subscriptions/PricingModel.ts +14 -0
- package/src/enums/subscriptions/SubscriptionBillingPeriod.ts +15 -0
- package/src/enums/subscriptions/SubscriptionFeatureLimitType.ts +16 -0
- package/src/enums/subscriptions/SubscriptionPriceType.ts +10 -0
- package/src/enums/tenants/LinkedAccountStatus.ts +5 -0
- package/src/enums/tenants/TenantUserJoined.ts +6 -0
- package/src/enums/tenants/TenantUserStatus.ts +6 -0
- package/src/enums/tenants/TenantUserType.ts +5 -0
- package/src/enums/user-usage-range.ts +5 -0
- package/src/getAppcondaClient.ts +75 -0
- package/src/getSDKForService.ts +71 -0
- package/src/id.ts +47 -0
- package/src/index.ts +3 -0
- package/src/inputFile.ts +23 -0
- package/src/lib/errors.ts +141 -0
- package/src/lib/index.ts +0 -0
- package/src/lib/types.ts +7 -0
- package/src/models.ts +3339 -0
- package/src/modules/account/enums/authentication-factor.ts +6 -0
- package/src/modules/account/enums/authenticator-type.ts +3 -0
- package/src/modules/account/enums/o-auth-provider.ts +41 -0
- package/src/modules/account/index.ts +3 -0
- package/src/modules/account/schema.ts +8 -0
- package/src/modules/account/service.ts +1648 -0
- package/src/modules/account/types.ts +426 -0
- package/src/modules/accounv1/index.ts +4 -0
- package/src/modules/accounv1/schema.ts +50 -0
- package/src/modules/accounv1/service.ts +43 -0
- package/src/modules/accounv1/types.ts +16 -0
- package/src/modules/acl/service.ts +55 -0
- package/src/modules/agent/action.ts +66 -0
- package/src/modules/agent/index.ts +4 -0
- package/src/modules/agent/schema.ts +25 -0
- package/src/modules/agent/service.ts +34 -0
- package/src/modules/agent/types.ts +15 -0
- package/src/modules/ai/index.ts +1 -0
- package/src/modules/ai/node/actions.ts +14 -0
- package/src/modules/ai/node/index.ts +2 -0
- package/src/modules/ai/node/service.ts +18 -0
- package/src/modules/bpm/index.ts +3 -0
- package/src/modules/bpm/schema.ts +23 -0
- package/src/modules/bpm/service.ts +28 -0
- package/src/modules/bpm/types.ts +11 -0
- package/src/modules/builder/action.ts +234 -0
- package/src/modules/builder/index.ts +4 -0
- package/src/modules/builder/schema.ts +95 -0
- package/src/modules/builder/service.ts +74 -0
- package/src/modules/builder/types.ts +68 -0
- package/src/modules/datasource/action.ts +189 -0
- package/src/modules/datasource/index.ts +4 -0
- package/src/modules/datasource/schema.ts +69 -0
- package/src/modules/datasource/service.ts +58 -0
- package/src/modules/datasource/types.ts +31 -0
- package/src/modules/emploid/action.ts +1063 -0
- package/src/modules/emploid/index.ts +4 -0
- package/src/modules/emploid/schema.ts +405 -0
- package/src/modules/emploid/service.ts +295 -0
- package/src/modules/emploid/types.ts +132 -0
- package/src/modules/google/action.ts +54 -0
- package/src/modules/google/index.ts +4 -0
- package/src/modules/google/schema.ts +19 -0
- package/src/modules/google/service.ts +23 -0
- package/src/modules/google/types.ts +15 -0
- package/src/modules/hooks/index.ts +5 -0
- package/src/modules/hooks/lib/Hooks.ts +103 -0
- package/src/modules/hooks/lib/handler.ts +27 -0
- package/src/modules/hooks/lib/jobs/index.ts +2 -0
- package/src/modules/hooks/lib/jobs/job1.ts +20 -0
- package/src/modules/hooks/lib/jobs/log-job.ts +10 -0
- package/src/modules/hooks/lib/wait.ts +17 -0
- package/src/modules/index.ts +17 -0
- package/src/modules/mail/action.ts +22 -0
- package/src/modules/mail/index.ts +4 -0
- package/src/modules/mail/schema.ts +9 -0
- package/src/modules/mail/service.ts +15 -0
- package/src/modules/mail/types.ts +11 -0
- package/src/modules/notion/action.ts +53 -0
- package/src/modules/notion/index.ts +4 -0
- package/src/modules/notion/schema.ts +21 -0
- package/src/modules/notion/service.ts +26 -0
- package/src/modules/notion/types.ts +14 -0
- package/src/modules/organization/action.ts +71 -0
- package/src/modules/organization/index.ts +4 -0
- package/src/modules/organization/schema.ts +23 -0
- package/src/modules/organization/service.ts +32 -0
- package/src/modules/organization/types.ts +15 -0
- package/src/modules/scheduled-job/action.ts +212 -0
- package/src/modules/scheduled-job/index.ts +8 -0
- package/src/modules/scheduled-job/lib/Schedules.ts +105 -0
- package/src/modules/scheduled-job/lib/handler.ts +27 -0
- package/src/modules/scheduled-job/lib/jobs/index.ts +2 -0
- package/src/modules/scheduled-job/lib/jobs/job1.ts +12 -0
- package/src/modules/scheduled-job/lib/wait.ts +17 -0
- package/src/modules/scheduled-job/schema.ts +62 -0
- package/src/modules/scheduled-job/service.ts +63 -0
- package/src/modules/scheduled-job/types.ts +79 -0
- package/src/modules/task/action.ts +819 -0
- package/src/modules/task/index.ts +4 -0
- package/src/modules/task/schema.ts +455 -0
- package/src/modules/task/service.ts +268 -0
- package/src/modules/task/types.ts +325 -0
- package/src/modules/tenant/actions.ts +173 -0
- package/src/modules/tenant/index.ts +3 -0
- package/src/modules/tenant/schema.ts +32 -0
- package/src/modules/tenant/service.ts +43 -0
- package/src/modules/tenant/tenant.ts +193 -0
- package/src/modules/tenant/types.ts +22 -0
- package/src/modules/waitlist/action.ts +93 -0
- package/src/modules/waitlist/index.ts +4 -0
- package/src/modules/waitlist/schema.ts +24 -0
- package/src/modules/waitlist/service.ts +41 -0
- package/src/modules/waitlist/types.ts +18 -0
- package/src/permission.ts +57 -0
- package/src/query.ts +261 -0
- package/src/role.ts +100 -0
- package/src/service-client.ts +40 -0
- package/src/service.ts +30 -0
- package/src/services/applets.ts +75 -0
- package/src/services/avatars.ts +314 -0
- package/src/services/chat-flow.ts +32 -0
- package/src/services/community.ts +102 -0
- package/src/services/configuration.ts +15 -0
- package/src/services/databases.ts +2037 -0
- package/src/services/functions.ts +986 -0
- package/src/services/graphql.ts +75 -0
- package/src/services/health.ts +629 -0
- package/src/services/locale.ts +205 -0
- package/src/services/messaging.ts +2247 -0
- package/src/services/permissions.ts +131 -0
- package/src/services/pricing.ts +30 -0
- package/src/services/projects.ts +1901 -0
- package/src/services/roles.ts +101 -0
- package/src/services/schema.ts +65 -0
- package/src/services/storage.ts +576 -0
- package/src/services/subscription.ts +39 -0
- package/src/services/teams.ts +490 -0
- package/src/services/tenant-subscription.ts +93 -0
- package/src/services/users.ts +1584 -0
- package/tsconfig.json +32 -0
- package/index.d.ts +0 -3367
- package/index.js +0 -407
|
@@ -0,0 +1,1263 @@
|
|
|
1
|
+
import { AppcondaException } from '../../client';
|
|
2
|
+
import { Service } from '../../service';
|
|
3
|
+
export class Account {
|
|
4
|
+
constructor(client) {
|
|
5
|
+
this.client = client;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Get account
|
|
9
|
+
*
|
|
10
|
+
* Get the currently logged in user.
|
|
11
|
+
*
|
|
12
|
+
* @throws {AppcondaException}
|
|
13
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
14
|
+
*/
|
|
15
|
+
async get() {
|
|
16
|
+
const apiPath = '/account';
|
|
17
|
+
const payload = {};
|
|
18
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
19
|
+
const apiHeaders = {
|
|
20
|
+
'content-type': 'application/json',
|
|
21
|
+
};
|
|
22
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Create account
|
|
26
|
+
*
|
|
27
|
+
* Use this endpoint to allow a new user to register a new account in your project. After the user registration completes successfully, you can use the [/account/verfication](https://appconda.io/docs/references/cloud/client-web/account#createVerification) route to start verifying the user email address. To allow the new user to login to their new account, you need to create a new [account session](https://appconda.io/docs/references/cloud/client-web/account#createEmailSession).
|
|
28
|
+
*
|
|
29
|
+
* @param {string} userId
|
|
30
|
+
* @param {string} email
|
|
31
|
+
* @param {string} password
|
|
32
|
+
* @param {string} name
|
|
33
|
+
* @throws {AppcondaException}
|
|
34
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
35
|
+
*/
|
|
36
|
+
async create(userId, email, password, name) {
|
|
37
|
+
if (typeof userId === 'undefined') {
|
|
38
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
39
|
+
}
|
|
40
|
+
if (typeof email === 'undefined') {
|
|
41
|
+
throw new AppcondaException('Missing required parameter: "email"');
|
|
42
|
+
}
|
|
43
|
+
if (typeof password === 'undefined') {
|
|
44
|
+
throw new AppcondaException('Missing required parameter: "password"');
|
|
45
|
+
}
|
|
46
|
+
const apiPath = '/account';
|
|
47
|
+
const payload = {};
|
|
48
|
+
if (typeof userId !== 'undefined') {
|
|
49
|
+
payload['userId'] = userId;
|
|
50
|
+
}
|
|
51
|
+
if (typeof email !== 'undefined') {
|
|
52
|
+
payload['email'] = email;
|
|
53
|
+
}
|
|
54
|
+
if (typeof password !== 'undefined') {
|
|
55
|
+
payload['password'] = password;
|
|
56
|
+
}
|
|
57
|
+
if (typeof name !== 'undefined') {
|
|
58
|
+
payload['name'] = name;
|
|
59
|
+
}
|
|
60
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
61
|
+
const apiHeaders = {
|
|
62
|
+
'content-type': 'application/json',
|
|
63
|
+
};
|
|
64
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Delete account
|
|
68
|
+
*
|
|
69
|
+
* Delete the currently logged in user.
|
|
70
|
+
*
|
|
71
|
+
* @throws {AppcondaException}
|
|
72
|
+
* @returns {Promise<{}>}
|
|
73
|
+
*/
|
|
74
|
+
async delete() {
|
|
75
|
+
const apiPath = '/account';
|
|
76
|
+
const payload = {};
|
|
77
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
78
|
+
const apiHeaders = {
|
|
79
|
+
'content-type': 'application/json',
|
|
80
|
+
};
|
|
81
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Update email
|
|
85
|
+
*
|
|
86
|
+
* Update currently logged in user account email address. After changing user address, the user confirmation status will get reset. A new confirmation email is not sent automatically however you can use the send confirmation email endpoint again to send the confirmation email. For security measures, user password is required to complete this request.
|
|
87
|
+
This endpoint can also be used to convert an anonymous account to a normal one, by passing an email address and a new password.
|
|
88
|
+
|
|
89
|
+
*
|
|
90
|
+
* @param {string} email
|
|
91
|
+
* @param {string} password
|
|
92
|
+
* @throws {AppcondaException}
|
|
93
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
94
|
+
*/
|
|
95
|
+
async updateEmail(email, password) {
|
|
96
|
+
if (typeof email === 'undefined') {
|
|
97
|
+
throw new AppcondaException('Missing required parameter: "email"');
|
|
98
|
+
}
|
|
99
|
+
if (typeof password === 'undefined') {
|
|
100
|
+
throw new AppcondaException('Missing required parameter: "password"');
|
|
101
|
+
}
|
|
102
|
+
const apiPath = '/account/email';
|
|
103
|
+
const payload = {};
|
|
104
|
+
if (typeof email !== 'undefined') {
|
|
105
|
+
payload['email'] = email;
|
|
106
|
+
}
|
|
107
|
+
if (typeof password !== 'undefined') {
|
|
108
|
+
payload['password'] = password;
|
|
109
|
+
}
|
|
110
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
111
|
+
const apiHeaders = {
|
|
112
|
+
'content-type': 'application/json',
|
|
113
|
+
};
|
|
114
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* List Identities
|
|
118
|
+
*
|
|
119
|
+
* Get the list of identities for the currently logged in user.
|
|
120
|
+
*
|
|
121
|
+
* @param {string[]} queries
|
|
122
|
+
* @throws {AppcondaException}
|
|
123
|
+
* @returns {Promise<IdentityList>}
|
|
124
|
+
*/
|
|
125
|
+
async listIdentities(queries) {
|
|
126
|
+
const apiPath = '/account/identities';
|
|
127
|
+
const payload = {};
|
|
128
|
+
if (typeof queries !== 'undefined') {
|
|
129
|
+
payload['queries'] = queries;
|
|
130
|
+
}
|
|
131
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
132
|
+
const apiHeaders = {
|
|
133
|
+
'content-type': 'application/json',
|
|
134
|
+
};
|
|
135
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Delete identity
|
|
139
|
+
*
|
|
140
|
+
* Delete an identity by its unique ID.
|
|
141
|
+
*
|
|
142
|
+
* @param {string} identityId
|
|
143
|
+
* @throws {AppcondaException}
|
|
144
|
+
* @returns {Promise<{}>}
|
|
145
|
+
*/
|
|
146
|
+
async deleteIdentity(identityId) {
|
|
147
|
+
if (typeof identityId === 'undefined') {
|
|
148
|
+
throw new AppcondaException('Missing required parameter: "identityId"');
|
|
149
|
+
}
|
|
150
|
+
const apiPath = '/account/identities/{identityId}'.replace('{identityId}', identityId);
|
|
151
|
+
const payload = {};
|
|
152
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
153
|
+
const apiHeaders = {
|
|
154
|
+
'content-type': 'application/json',
|
|
155
|
+
};
|
|
156
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Create JWT
|
|
160
|
+
*
|
|
161
|
+
* Use this endpoint to create a JSON Web Token. You can use the resulting JWT to authenticate on behalf of the current user when working with the Appconda server-side API and SDKs. The JWT secret is valid for 15 minutes from its creation and will be invalid if the user will logout in that time frame.
|
|
162
|
+
*
|
|
163
|
+
* @throws {AppcondaException}
|
|
164
|
+
* @returns {Promise<Jwt>}
|
|
165
|
+
*/
|
|
166
|
+
async createJWT() {
|
|
167
|
+
const apiPath = '/account/jwts';
|
|
168
|
+
const payload = {};
|
|
169
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
170
|
+
const apiHeaders = {
|
|
171
|
+
'content-type': 'application/json',
|
|
172
|
+
};
|
|
173
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* List logs
|
|
177
|
+
*
|
|
178
|
+
* Get the list of latest security activity logs for the currently logged in user. Each log returns user IP address, location and date and time of log.
|
|
179
|
+
*
|
|
180
|
+
* @param {string[]} queries
|
|
181
|
+
* @throws {AppcondaException}
|
|
182
|
+
* @returns {Promise<LogList>}
|
|
183
|
+
*/
|
|
184
|
+
async listLogs(queries) {
|
|
185
|
+
const apiPath = '/account/logs';
|
|
186
|
+
const payload = {};
|
|
187
|
+
if (typeof queries !== 'undefined') {
|
|
188
|
+
payload['queries'] = queries;
|
|
189
|
+
}
|
|
190
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
191
|
+
const apiHeaders = {
|
|
192
|
+
'content-type': 'application/json',
|
|
193
|
+
};
|
|
194
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Update MFA
|
|
198
|
+
*
|
|
199
|
+
* Enable or disable MFA on an account.
|
|
200
|
+
*
|
|
201
|
+
* @param {boolean} mfa
|
|
202
|
+
* @throws {AppcondaException}
|
|
203
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
204
|
+
*/
|
|
205
|
+
async updateMFA(mfa) {
|
|
206
|
+
if (typeof mfa === 'undefined') {
|
|
207
|
+
throw new AppcondaException('Missing required parameter: "mfa"');
|
|
208
|
+
}
|
|
209
|
+
const apiPath = '/account/mfa';
|
|
210
|
+
const payload = {};
|
|
211
|
+
if (typeof mfa !== 'undefined') {
|
|
212
|
+
payload['mfa'] = mfa;
|
|
213
|
+
}
|
|
214
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
215
|
+
const apiHeaders = {
|
|
216
|
+
'content-type': 'application/json',
|
|
217
|
+
};
|
|
218
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Create Authenticator
|
|
222
|
+
*
|
|
223
|
+
* Add an authenticator app to be used as an MFA factor. Verify the authenticator using the [verify authenticator](/docs/references/cloud/client-web/account#updateMfaAuthenticator) method.
|
|
224
|
+
*
|
|
225
|
+
* @param {AuthenticatorType} type
|
|
226
|
+
* @throws {AppcondaException}
|
|
227
|
+
* @returns {Promise<MfaType>}
|
|
228
|
+
*/
|
|
229
|
+
async createMfaAuthenticator(type) {
|
|
230
|
+
if (typeof type === 'undefined') {
|
|
231
|
+
throw new AppcondaException('Missing required parameter: "type"');
|
|
232
|
+
}
|
|
233
|
+
const apiPath = '/account/mfa/authenticators/{type}'.replace('{type}', type);
|
|
234
|
+
const payload = {};
|
|
235
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
236
|
+
const apiHeaders = {
|
|
237
|
+
'content-type': 'application/json',
|
|
238
|
+
};
|
|
239
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Verify Authenticator
|
|
243
|
+
*
|
|
244
|
+
* Verify an authenticator app after adding it using the [add authenticator](/docs/references/cloud/client-web/account#createMfaAuthenticator) method.
|
|
245
|
+
*
|
|
246
|
+
* @param {AuthenticatorType} type
|
|
247
|
+
* @param {string} otp
|
|
248
|
+
* @throws {AppcondaException}
|
|
249
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
250
|
+
*/
|
|
251
|
+
async updateMfaAuthenticator(type, otp) {
|
|
252
|
+
if (typeof type === 'undefined') {
|
|
253
|
+
throw new AppcondaException('Missing required parameter: "type"');
|
|
254
|
+
}
|
|
255
|
+
if (typeof otp === 'undefined') {
|
|
256
|
+
throw new AppcondaException('Missing required parameter: "otp"');
|
|
257
|
+
}
|
|
258
|
+
const apiPath = '/account/mfa/authenticators/{type}'.replace('{type}', type);
|
|
259
|
+
const payload = {};
|
|
260
|
+
if (typeof otp !== 'undefined') {
|
|
261
|
+
payload['otp'] = otp;
|
|
262
|
+
}
|
|
263
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
264
|
+
const apiHeaders = {
|
|
265
|
+
'content-type': 'application/json',
|
|
266
|
+
};
|
|
267
|
+
return await this.client.call('put', uri, apiHeaders, payload);
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Delete Authenticator
|
|
271
|
+
*
|
|
272
|
+
* Delete an authenticator for a user by ID.
|
|
273
|
+
*
|
|
274
|
+
* @param {AuthenticatorType} type
|
|
275
|
+
* @throws {AppcondaException}
|
|
276
|
+
* @returns {Promise<{}>}
|
|
277
|
+
*/
|
|
278
|
+
async deleteMfaAuthenticator(type) {
|
|
279
|
+
if (typeof type === 'undefined') {
|
|
280
|
+
throw new AppcondaException('Missing required parameter: "type"');
|
|
281
|
+
}
|
|
282
|
+
const apiPath = '/account/mfa/authenticators/{type}'.replace('{type}', type);
|
|
283
|
+
const payload = {};
|
|
284
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
285
|
+
const apiHeaders = {
|
|
286
|
+
'content-type': 'application/json',
|
|
287
|
+
};
|
|
288
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Create MFA Challenge
|
|
292
|
+
*
|
|
293
|
+
* Begin the process of MFA verification after sign-in. Finish the flow with [updateMfaChallenge](/docs/references/cloud/client-web/account#updateMfaChallenge) method.
|
|
294
|
+
*
|
|
295
|
+
* @param {AuthenticationFactor} factor
|
|
296
|
+
* @throws {AppcondaException}
|
|
297
|
+
* @returns {Promise<MfaChallenge>}
|
|
298
|
+
*/
|
|
299
|
+
async createMfaChallenge(factor) {
|
|
300
|
+
if (typeof factor === 'undefined') {
|
|
301
|
+
throw new AppcondaException('Missing required parameter: "factor"');
|
|
302
|
+
}
|
|
303
|
+
const apiPath = '/account/mfa/challenge';
|
|
304
|
+
const payload = {};
|
|
305
|
+
if (typeof factor !== 'undefined') {
|
|
306
|
+
payload['factor'] = factor;
|
|
307
|
+
}
|
|
308
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
309
|
+
const apiHeaders = {
|
|
310
|
+
'content-type': 'application/json',
|
|
311
|
+
};
|
|
312
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Create MFA Challenge (confirmation)
|
|
316
|
+
*
|
|
317
|
+
* Complete the MFA challenge by providing the one-time password. Finish the process of MFA verification by providing the one-time password. To begin the flow, use [createMfaChallenge](/docs/references/cloud/client-web/account#createMfaChallenge) method.
|
|
318
|
+
*
|
|
319
|
+
* @param {string} challengeId
|
|
320
|
+
* @param {string} otp
|
|
321
|
+
* @throws {AppcondaException}
|
|
322
|
+
* @returns {Promise<{}>}
|
|
323
|
+
*/
|
|
324
|
+
async updateMfaChallenge(challengeId, otp) {
|
|
325
|
+
if (typeof challengeId === 'undefined') {
|
|
326
|
+
throw new AppcondaException('Missing required parameter: "challengeId"');
|
|
327
|
+
}
|
|
328
|
+
if (typeof otp === 'undefined') {
|
|
329
|
+
throw new AppcondaException('Missing required parameter: "otp"');
|
|
330
|
+
}
|
|
331
|
+
const apiPath = '/account/mfa/challenge';
|
|
332
|
+
const payload = {};
|
|
333
|
+
if (typeof challengeId !== 'undefined') {
|
|
334
|
+
payload['challengeId'] = challengeId;
|
|
335
|
+
}
|
|
336
|
+
if (typeof otp !== 'undefined') {
|
|
337
|
+
payload['otp'] = otp;
|
|
338
|
+
}
|
|
339
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
340
|
+
const apiHeaders = {
|
|
341
|
+
'content-type': 'application/json',
|
|
342
|
+
};
|
|
343
|
+
return await this.client.call('put', uri, apiHeaders, payload);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* List Factors
|
|
347
|
+
*
|
|
348
|
+
* List the factors available on the account to be used as a MFA challange.
|
|
349
|
+
*
|
|
350
|
+
* @throws {AppcondaException}
|
|
351
|
+
* @returns {Promise<MfaFactors>}
|
|
352
|
+
*/
|
|
353
|
+
async listMfaFactors() {
|
|
354
|
+
const apiPath = '/account/mfa/factors';
|
|
355
|
+
const payload = {};
|
|
356
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
357
|
+
const apiHeaders = {
|
|
358
|
+
'content-type': 'application/json',
|
|
359
|
+
};
|
|
360
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Get MFA Recovery Codes
|
|
364
|
+
*
|
|
365
|
+
* Get recovery codes that can be used as backup for MFA flow. Before getting codes, they must be generated using [createMfaRecoveryCodes](/docs/references/cloud/client-web/account#createMfaRecoveryCodes) method. An OTP challenge is required to read recovery codes.
|
|
366
|
+
*
|
|
367
|
+
* @throws {AppcondaException}
|
|
368
|
+
* @returns {Promise<MfaRecoveryCodes>}
|
|
369
|
+
*/
|
|
370
|
+
async getMfaRecoveryCodes() {
|
|
371
|
+
const apiPath = '/account/mfa/recovery-codes';
|
|
372
|
+
const payload = {};
|
|
373
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
374
|
+
const apiHeaders = {
|
|
375
|
+
'content-type': 'application/json',
|
|
376
|
+
};
|
|
377
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Create MFA Recovery Codes
|
|
381
|
+
*
|
|
382
|
+
* Generate recovery codes as backup for MFA flow. It's recommended to generate and show then immediately after user successfully adds their authehticator. Recovery codes can be used as a MFA verification type in [createMfaChallenge](/docs/references/cloud/client-web/account#createMfaChallenge) method.
|
|
383
|
+
*
|
|
384
|
+
* @throws {AppcondaException}
|
|
385
|
+
* @returns {Promise<Models.MfaRecoveryCodes>}
|
|
386
|
+
*/
|
|
387
|
+
async createMfaRecoveryCodes() {
|
|
388
|
+
const apiPath = '/account/mfa/recovery-codes';
|
|
389
|
+
const payload = {};
|
|
390
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
391
|
+
const apiHeaders = {
|
|
392
|
+
'content-type': 'application/json',
|
|
393
|
+
};
|
|
394
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Regenerate MFA Recovery Codes
|
|
398
|
+
*
|
|
399
|
+
* Regenerate recovery codes that can be used as backup for MFA flow. Before regenerating codes, they must be first generated using [createMfaRecoveryCodes](/docs/references/cloud/client-web/account#createMfaRecoveryCodes) method. An OTP challenge is required to regenreate recovery codes.
|
|
400
|
+
*
|
|
401
|
+
* @throws {AppcondaException}
|
|
402
|
+
* @returns {Promise<Models.MfaRecoveryCodes>}
|
|
403
|
+
*/
|
|
404
|
+
async updateMfaRecoveryCodes() {
|
|
405
|
+
const apiPath = '/account/mfa/recovery-codes';
|
|
406
|
+
const payload = {};
|
|
407
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
408
|
+
const apiHeaders = {
|
|
409
|
+
'content-type': 'application/json',
|
|
410
|
+
};
|
|
411
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Update name
|
|
415
|
+
*
|
|
416
|
+
* Update currently logged in user account name.
|
|
417
|
+
*
|
|
418
|
+
* @param {string} name
|
|
419
|
+
* @throws {AppcondaException}
|
|
420
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
421
|
+
*/
|
|
422
|
+
async updateName(name) {
|
|
423
|
+
if (typeof name === 'undefined') {
|
|
424
|
+
throw new AppcondaException('Missing required parameter: "name"');
|
|
425
|
+
}
|
|
426
|
+
const apiPath = '/account/name';
|
|
427
|
+
const payload = {};
|
|
428
|
+
if (typeof name !== 'undefined') {
|
|
429
|
+
payload['name'] = name;
|
|
430
|
+
}
|
|
431
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
432
|
+
const apiHeaders = {
|
|
433
|
+
'content-type': 'application/json',
|
|
434
|
+
};
|
|
435
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Update password
|
|
439
|
+
*
|
|
440
|
+
* Update currently logged in user password. For validation, user is required to pass in the new password, and the old password. For users created with OAuth, Team Invites and Magic URL, oldPassword is optional.
|
|
441
|
+
*
|
|
442
|
+
* @param {string} password
|
|
443
|
+
* @param {string} oldPassword
|
|
444
|
+
* @throws {AppcondaException}
|
|
445
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
446
|
+
*/
|
|
447
|
+
async updatePassword(password, oldPassword) {
|
|
448
|
+
if (typeof password === 'undefined') {
|
|
449
|
+
throw new AppcondaException('Missing required parameter: "password"');
|
|
450
|
+
}
|
|
451
|
+
const apiPath = '/account/password';
|
|
452
|
+
const payload = {};
|
|
453
|
+
if (typeof password !== 'undefined') {
|
|
454
|
+
payload['password'] = password;
|
|
455
|
+
}
|
|
456
|
+
if (typeof oldPassword !== 'undefined') {
|
|
457
|
+
payload['oldPassword'] = oldPassword;
|
|
458
|
+
}
|
|
459
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
460
|
+
const apiHeaders = {
|
|
461
|
+
'content-type': 'application/json',
|
|
462
|
+
};
|
|
463
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Update phone
|
|
467
|
+
*
|
|
468
|
+
* Update the currently logged in user's phone number. After updating the phone number, the phone verification status will be reset. A confirmation SMS is not sent automatically, however you can use the [POST /account/verification/phone](https://appconda.io/docs/references/cloud/client-web/account#createPhoneVerification) endpoint to send a confirmation SMS.
|
|
469
|
+
*
|
|
470
|
+
* @param {string} phone
|
|
471
|
+
* @param {string} password
|
|
472
|
+
* @throws {AppcondaException}
|
|
473
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
474
|
+
*/
|
|
475
|
+
async updatePhone(phone, password) {
|
|
476
|
+
if (typeof phone === 'undefined') {
|
|
477
|
+
throw new AppcondaException('Missing required parameter: "phone"');
|
|
478
|
+
}
|
|
479
|
+
if (typeof password === 'undefined') {
|
|
480
|
+
throw new AppcondaException('Missing required parameter: "password"');
|
|
481
|
+
}
|
|
482
|
+
const apiPath = '/account/phone';
|
|
483
|
+
const payload = {};
|
|
484
|
+
if (typeof phone !== 'undefined') {
|
|
485
|
+
payload['phone'] = phone;
|
|
486
|
+
}
|
|
487
|
+
if (typeof password !== 'undefined') {
|
|
488
|
+
payload['password'] = password;
|
|
489
|
+
}
|
|
490
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
491
|
+
const apiHeaders = {
|
|
492
|
+
'content-type': 'application/json',
|
|
493
|
+
};
|
|
494
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Get account preferences
|
|
498
|
+
*
|
|
499
|
+
* Get the preferences as a key-value object for the currently logged in user.
|
|
500
|
+
*
|
|
501
|
+
* @throws {AppcondaException}
|
|
502
|
+
* @returns {Promise<Preferences>}
|
|
503
|
+
*/
|
|
504
|
+
async getPrefs() {
|
|
505
|
+
const apiPath = '/account/prefs';
|
|
506
|
+
const payload = {};
|
|
507
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
508
|
+
const apiHeaders = {
|
|
509
|
+
'content-type': 'application/json',
|
|
510
|
+
};
|
|
511
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Update preferences
|
|
515
|
+
*
|
|
516
|
+
* Update currently logged in user account preferences. The object you pass is stored as is, and replaces any previous value. The maximum allowed prefs size is 64kB and throws error if exceeded.
|
|
517
|
+
*
|
|
518
|
+
* @param {Partial<Preferences>} prefs
|
|
519
|
+
* @throws {AppcondaException}
|
|
520
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
521
|
+
*/
|
|
522
|
+
async updatePrefs(prefs) {
|
|
523
|
+
if (typeof prefs === 'undefined') {
|
|
524
|
+
throw new AppcondaException('Missing required parameter: "prefs"');
|
|
525
|
+
}
|
|
526
|
+
const apiPath = '/account/prefs';
|
|
527
|
+
const payload = {};
|
|
528
|
+
if (typeof prefs !== 'undefined') {
|
|
529
|
+
payload['prefs'] = prefs;
|
|
530
|
+
}
|
|
531
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
532
|
+
const apiHeaders = {
|
|
533
|
+
'content-type': 'application/json',
|
|
534
|
+
};
|
|
535
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
536
|
+
}
|
|
537
|
+
/**
|
|
538
|
+
* Create password recovery
|
|
539
|
+
*
|
|
540
|
+
* Sends the user an email with a temporary secret key for password reset. When the user clicks the confirmation link he is redirected back to your app password reset URL with the secret key and email address values attached to the URL query string. Use the query string params to submit a request to the [PUT /account/recovery](https://appconda.io/docs/references/cloud/client-web/account#updateRecovery) endpoint to complete the process. The verification link sent to the user's email address is valid for 1 hour.
|
|
541
|
+
*
|
|
542
|
+
* @param {string} email
|
|
543
|
+
* @param {string} url
|
|
544
|
+
* @throws {AppcondaException}
|
|
545
|
+
* @returns {Promise<Token>}
|
|
546
|
+
*/
|
|
547
|
+
async createRecovery(email, url) {
|
|
548
|
+
if (typeof email === 'undefined') {
|
|
549
|
+
throw new AppcondaException('Missing required parameter: "email"');
|
|
550
|
+
}
|
|
551
|
+
if (typeof url === 'undefined') {
|
|
552
|
+
throw new AppcondaException('Missing required parameter: "url"');
|
|
553
|
+
}
|
|
554
|
+
const apiPath = '/account/recovery';
|
|
555
|
+
const payload = {};
|
|
556
|
+
if (typeof email !== 'undefined') {
|
|
557
|
+
payload['email'] = email;
|
|
558
|
+
}
|
|
559
|
+
if (typeof url !== 'undefined') {
|
|
560
|
+
payload['url'] = url;
|
|
561
|
+
}
|
|
562
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
563
|
+
const apiHeaders = {
|
|
564
|
+
'content-type': 'application/json',
|
|
565
|
+
};
|
|
566
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Create password recovery (confirmation)
|
|
570
|
+
*
|
|
571
|
+
* Use this endpoint to complete the user account password reset. Both the **userId** and **secret** arguments will be passed as query parameters to the redirect URL you have provided when sending your request to the [POST /account/recovery](https://appconda.io/docs/references/cloud/client-web/account#createRecovery) endpoint.
|
|
572
|
+
|
|
573
|
+
Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md) the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.
|
|
574
|
+
*
|
|
575
|
+
* @param {string} userId
|
|
576
|
+
* @param {string} secret
|
|
577
|
+
* @param {string} password
|
|
578
|
+
* @throws {AppcondaException}
|
|
579
|
+
* @returns {Promise<Models.Token>}
|
|
580
|
+
*/
|
|
581
|
+
async updateRecovery(userId, secret, password) {
|
|
582
|
+
if (typeof userId === 'undefined') {
|
|
583
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
584
|
+
}
|
|
585
|
+
if (typeof secret === 'undefined') {
|
|
586
|
+
throw new AppcondaException('Missing required parameter: "secret"');
|
|
587
|
+
}
|
|
588
|
+
if (typeof password === 'undefined') {
|
|
589
|
+
throw new AppcondaException('Missing required parameter: "password"');
|
|
590
|
+
}
|
|
591
|
+
const apiPath = '/account/recovery';
|
|
592
|
+
const payload = {};
|
|
593
|
+
if (typeof userId !== 'undefined') {
|
|
594
|
+
payload['userId'] = userId;
|
|
595
|
+
}
|
|
596
|
+
if (typeof secret !== 'undefined') {
|
|
597
|
+
payload['secret'] = secret;
|
|
598
|
+
}
|
|
599
|
+
if (typeof password !== 'undefined') {
|
|
600
|
+
payload['password'] = password;
|
|
601
|
+
}
|
|
602
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
603
|
+
const apiHeaders = {
|
|
604
|
+
'content-type': 'application/json',
|
|
605
|
+
};
|
|
606
|
+
return await this.client.call('put', uri, apiHeaders, payload);
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* List sessions
|
|
610
|
+
*
|
|
611
|
+
* Get the list of active sessions across different devices for the currently logged in user.
|
|
612
|
+
*
|
|
613
|
+
* @throws {AppcondaException}
|
|
614
|
+
* @returns {Promise<SessionList>}
|
|
615
|
+
*/
|
|
616
|
+
async listSessions() {
|
|
617
|
+
const apiPath = '/account/sessions';
|
|
618
|
+
const payload = {};
|
|
619
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
620
|
+
const apiHeaders = {
|
|
621
|
+
'content-type': 'application/json',
|
|
622
|
+
};
|
|
623
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* Delete sessions
|
|
627
|
+
*
|
|
628
|
+
* Delete all sessions from the user account and remove any sessions cookies from the end client.
|
|
629
|
+
*
|
|
630
|
+
* @throws {AppcondaException}
|
|
631
|
+
* @returns {Promise<{}>}
|
|
632
|
+
*/
|
|
633
|
+
async deleteSessions() {
|
|
634
|
+
const apiPath = '/account/sessions';
|
|
635
|
+
const payload = {};
|
|
636
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
637
|
+
const apiHeaders = {
|
|
638
|
+
'content-type': 'application/json',
|
|
639
|
+
};
|
|
640
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Create anonymous session
|
|
644
|
+
*
|
|
645
|
+
* Use this endpoint to allow a new user to register an anonymous account in your project. This route will also create a new session for the user. To allow the new user to convert an anonymous account to a normal account, you need to update its [email and password](https://appconda.io/docs/references/cloud/client-web/account#updateEmail) or create an [OAuth2 session](https://appconda.io/docs/references/cloud/client-web/account#CreateOAuth2Session).
|
|
646
|
+
*
|
|
647
|
+
* @throws {AppcondaException}
|
|
648
|
+
* @returns {Promise<Models.Session>}
|
|
649
|
+
*/
|
|
650
|
+
async createAnonymousSession() {
|
|
651
|
+
const apiPath = '/account/sessions/anonymous';
|
|
652
|
+
const payload = {};
|
|
653
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
654
|
+
const apiHeaders = {
|
|
655
|
+
'content-type': 'application/json',
|
|
656
|
+
};
|
|
657
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
658
|
+
}
|
|
659
|
+
/**
|
|
660
|
+
* Create email password session
|
|
661
|
+
*
|
|
662
|
+
* Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.
|
|
663
|
+
|
|
664
|
+
A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
|
|
665
|
+
*
|
|
666
|
+
* @param {string} email
|
|
667
|
+
* @param {string} password
|
|
668
|
+
* @throws {AppcondaException}
|
|
669
|
+
* @returns {Promise<Session>}
|
|
670
|
+
*/
|
|
671
|
+
async createEmailPasswordSession(email, password) {
|
|
672
|
+
if (typeof email === 'undefined') {
|
|
673
|
+
throw new AppcondaException('Missing required parameter: "email"');
|
|
674
|
+
}
|
|
675
|
+
if (typeof password === 'undefined') {
|
|
676
|
+
throw new AppcondaException('Missing required parameter: "password"');
|
|
677
|
+
}
|
|
678
|
+
const apiPath = '/account/sessions/email';
|
|
679
|
+
const payload = {};
|
|
680
|
+
if (typeof email !== 'undefined') {
|
|
681
|
+
payload['email'] = email;
|
|
682
|
+
}
|
|
683
|
+
if (typeof password !== 'undefined') {
|
|
684
|
+
payload['password'] = password;
|
|
685
|
+
}
|
|
686
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
687
|
+
const apiHeaders = {
|
|
688
|
+
'content-type': 'application/json',
|
|
689
|
+
};
|
|
690
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Update magic URL session
|
|
694
|
+
*
|
|
695
|
+
* Use this endpoint to create a session from token. Provide the **userId** and **secret** parameters from the successful response of authentication flows initiated by token creation. For example, magic URL and phone login.
|
|
696
|
+
*
|
|
697
|
+
* @param {string} userId
|
|
698
|
+
* @param {string} secret
|
|
699
|
+
* @throws {AppcondaException}
|
|
700
|
+
* @returns {Promise<Models.Session>}
|
|
701
|
+
*/
|
|
702
|
+
async updateMagicURLSession(userId, secret) {
|
|
703
|
+
if (typeof userId === 'undefined') {
|
|
704
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
705
|
+
}
|
|
706
|
+
if (typeof secret === 'undefined') {
|
|
707
|
+
throw new AppcondaException('Missing required parameter: "secret"');
|
|
708
|
+
}
|
|
709
|
+
const apiPath = '/account/sessions/magic-url';
|
|
710
|
+
const payload = {};
|
|
711
|
+
if (typeof userId !== 'undefined') {
|
|
712
|
+
payload['userId'] = userId;
|
|
713
|
+
}
|
|
714
|
+
if (typeof secret !== 'undefined') {
|
|
715
|
+
payload['secret'] = secret;
|
|
716
|
+
}
|
|
717
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
718
|
+
const apiHeaders = {
|
|
719
|
+
'content-type': 'application/json',
|
|
720
|
+
};
|
|
721
|
+
return await this.client.call('put', uri, apiHeaders, payload);
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* Create OAuth2 session
|
|
725
|
+
*
|
|
726
|
+
* Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appconda console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.
|
|
727
|
+
|
|
728
|
+
If there is already an active session, the new session will be attached to the logged-in account. If there are no active sessions, the server will attempt to look for a user with the same email address as the email received from the OAuth2 provider and attach the new session to the existing user. If no matching user is found - the server will create a new user.
|
|
729
|
+
|
|
730
|
+
A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
|
|
731
|
+
|
|
732
|
+
*
|
|
733
|
+
* @param {OAuthProvider} provider
|
|
734
|
+
* @param {string} success
|
|
735
|
+
* @param {string} failure
|
|
736
|
+
* @param {string[]} scopes
|
|
737
|
+
* @throws {AppcondaException}
|
|
738
|
+
* @returns {Promise<void | string>}
|
|
739
|
+
*/
|
|
740
|
+
async createOAuth2Session(provider, success, failure, scopes) {
|
|
741
|
+
if (typeof provider === 'undefined') {
|
|
742
|
+
throw new AppcondaException('Missing required parameter: "provider"');
|
|
743
|
+
}
|
|
744
|
+
const apiPath = '/account/sessions/oauth2/{provider}'.replace('{provider}', provider);
|
|
745
|
+
const payload = {};
|
|
746
|
+
if (typeof success !== 'undefined') {
|
|
747
|
+
payload['success'] = success;
|
|
748
|
+
}
|
|
749
|
+
if (typeof failure !== 'undefined') {
|
|
750
|
+
payload['failure'] = failure;
|
|
751
|
+
}
|
|
752
|
+
if (typeof scopes !== 'undefined') {
|
|
753
|
+
payload['scopes'] = scopes;
|
|
754
|
+
}
|
|
755
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
756
|
+
const apiHeaders = {
|
|
757
|
+
'content-type': 'application/json',
|
|
758
|
+
};
|
|
759
|
+
payload['project'] = this.client.config.project;
|
|
760
|
+
for (const [key, value] of Object.entries(Service.flatten(payload))) {
|
|
761
|
+
uri.searchParams.append(key, value);
|
|
762
|
+
}
|
|
763
|
+
if (typeof window !== 'undefined' && window?.location) {
|
|
764
|
+
window.location.href = uri.toString();
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
else {
|
|
768
|
+
return uri.toString();
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* Update phone session
|
|
773
|
+
*
|
|
774
|
+
* Use this endpoint to create a session from token. Provide the **userId** and **secret** parameters from the successful response of authentication flows initiated by token creation. For example, magic URL and phone login.
|
|
775
|
+
*
|
|
776
|
+
* @param {string} userId
|
|
777
|
+
* @param {string} secret
|
|
778
|
+
* @throws {AppcondaException}
|
|
779
|
+
* @returns {Promise<Models.Session>}
|
|
780
|
+
*/
|
|
781
|
+
async updatePhoneSession(userId, secret) {
|
|
782
|
+
if (typeof userId === 'undefined') {
|
|
783
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
784
|
+
}
|
|
785
|
+
if (typeof secret === 'undefined') {
|
|
786
|
+
throw new AppcondaException('Missing required parameter: "secret"');
|
|
787
|
+
}
|
|
788
|
+
const apiPath = '/account/sessions/phone';
|
|
789
|
+
const payload = {};
|
|
790
|
+
if (typeof userId !== 'undefined') {
|
|
791
|
+
payload['userId'] = userId;
|
|
792
|
+
}
|
|
793
|
+
if (typeof secret !== 'undefined') {
|
|
794
|
+
payload['secret'] = secret;
|
|
795
|
+
}
|
|
796
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
797
|
+
const apiHeaders = {
|
|
798
|
+
'content-type': 'application/json',
|
|
799
|
+
};
|
|
800
|
+
return await this.client.call('put', uri, apiHeaders, payload);
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Create session
|
|
804
|
+
*
|
|
805
|
+
* Use this endpoint to create a session from token. Provide the **userId** and **secret** parameters from the successful response of authentication flows initiated by token creation. For example, magic URL and phone login.
|
|
806
|
+
*
|
|
807
|
+
* @param {string} userId
|
|
808
|
+
* @param {string} secret
|
|
809
|
+
* @throws {AppcondaException}
|
|
810
|
+
* @returns {Promise<Models.Session>}
|
|
811
|
+
*/
|
|
812
|
+
async createSession(userId, secret) {
|
|
813
|
+
if (typeof userId === 'undefined') {
|
|
814
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
815
|
+
}
|
|
816
|
+
if (typeof secret === 'undefined') {
|
|
817
|
+
throw new AppcondaException('Missing required parameter: "secret"');
|
|
818
|
+
}
|
|
819
|
+
const apiPath = '/account/sessions/token';
|
|
820
|
+
const payload = {};
|
|
821
|
+
if (typeof userId !== 'undefined') {
|
|
822
|
+
payload['userId'] = userId;
|
|
823
|
+
}
|
|
824
|
+
if (typeof secret !== 'undefined') {
|
|
825
|
+
payload['secret'] = secret;
|
|
826
|
+
}
|
|
827
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
828
|
+
const apiHeaders = {
|
|
829
|
+
'content-type': 'application/json',
|
|
830
|
+
};
|
|
831
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* Get session
|
|
835
|
+
*
|
|
836
|
+
* Use this endpoint to get a logged in user's session using a Session ID. Inputting 'current' will return the current session being used.
|
|
837
|
+
*
|
|
838
|
+
* @param {string} sessionId
|
|
839
|
+
* @throws {AppcondaException}
|
|
840
|
+
* @returns {Promise<Models.Session>}
|
|
841
|
+
*/
|
|
842
|
+
async getSession(sessionId) {
|
|
843
|
+
if (typeof sessionId === 'undefined') {
|
|
844
|
+
throw new AppcondaException('Missing required parameter: "sessionId"');
|
|
845
|
+
}
|
|
846
|
+
const apiPath = '/account/sessions/{sessionId}'.replace('{sessionId}', sessionId);
|
|
847
|
+
const payload = {};
|
|
848
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
849
|
+
const apiHeaders = {
|
|
850
|
+
'content-type': 'application/json',
|
|
851
|
+
};
|
|
852
|
+
return await this.client.call('get', uri, apiHeaders, payload);
|
|
853
|
+
}
|
|
854
|
+
/**
|
|
855
|
+
* Update session
|
|
856
|
+
*
|
|
857
|
+
* Use this endpoint to extend a session's length. Extending a session is useful when session expiry is short. If the session was created using an OAuth provider, this endpoint refreshes the access token from the provider.
|
|
858
|
+
*
|
|
859
|
+
* @param {string} sessionId
|
|
860
|
+
* @throws {AppcondaException}
|
|
861
|
+
* @returns {Promise<Models.Session>}
|
|
862
|
+
*/
|
|
863
|
+
async updateSession(sessionId) {
|
|
864
|
+
if (typeof sessionId === 'undefined') {
|
|
865
|
+
throw new AppcondaException('Missing required parameter: "sessionId"');
|
|
866
|
+
}
|
|
867
|
+
const apiPath = '/account/sessions/{sessionId}'.replace('{sessionId}', sessionId);
|
|
868
|
+
const payload = {};
|
|
869
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
870
|
+
const apiHeaders = {
|
|
871
|
+
'content-type': 'application/json',
|
|
872
|
+
};
|
|
873
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
874
|
+
}
|
|
875
|
+
/**
|
|
876
|
+
* Delete session
|
|
877
|
+
*
|
|
878
|
+
* Logout the user. Use 'current' as the session ID to logout on this device, use a session ID to logout on another device. If you're looking to logout the user on all devices, use [Delete Sessions](https://appconda.io/docs/references/cloud/client-web/account#deleteSessions) instead.
|
|
879
|
+
*
|
|
880
|
+
* @param {string} sessionId
|
|
881
|
+
* @throws {AppcondaException}
|
|
882
|
+
* @returns {Promise<{}>}
|
|
883
|
+
*/
|
|
884
|
+
async deleteSession(sessionId) {
|
|
885
|
+
if (typeof sessionId === 'undefined') {
|
|
886
|
+
throw new AppcondaException('Missing required parameter: "sessionId"');
|
|
887
|
+
}
|
|
888
|
+
const apiPath = '/account/sessions/{sessionId}'.replace('{sessionId}', sessionId);
|
|
889
|
+
const payload = {};
|
|
890
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
891
|
+
const apiHeaders = {
|
|
892
|
+
'content-type': 'application/json',
|
|
893
|
+
};
|
|
894
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
|
895
|
+
}
|
|
896
|
+
/**
|
|
897
|
+
* Update status
|
|
898
|
+
*
|
|
899
|
+
* Block the currently logged in user account. Behind the scene, the user record is not deleted but permanently blocked from any access. To completely delete a user, use the Users API instead.
|
|
900
|
+
*
|
|
901
|
+
* @throws {AppcondaException}
|
|
902
|
+
* @returns {Promise<Models.User<Preferences>>}
|
|
903
|
+
*/
|
|
904
|
+
async updateStatus() {
|
|
905
|
+
const apiPath = '/account/status';
|
|
906
|
+
const payload = {};
|
|
907
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
908
|
+
const apiHeaders = {
|
|
909
|
+
'content-type': 'application/json',
|
|
910
|
+
};
|
|
911
|
+
return await this.client.call('patch', uri, apiHeaders, payload);
|
|
912
|
+
}
|
|
913
|
+
/**
|
|
914
|
+
* Create push target
|
|
915
|
+
*
|
|
916
|
+
*
|
|
917
|
+
* @param {string} targetId
|
|
918
|
+
* @param {string} identifier
|
|
919
|
+
* @param {string} providerId
|
|
920
|
+
* @throws {AppcondaException}
|
|
921
|
+
* @returns {Promise<Target>}
|
|
922
|
+
*/
|
|
923
|
+
async createPushTarget(targetId, identifier, providerId) {
|
|
924
|
+
if (typeof targetId === 'undefined') {
|
|
925
|
+
throw new AppcondaException('Missing required parameter: "targetId"');
|
|
926
|
+
}
|
|
927
|
+
if (typeof identifier === 'undefined') {
|
|
928
|
+
throw new AppcondaException('Missing required parameter: "identifier"');
|
|
929
|
+
}
|
|
930
|
+
const apiPath = '/account/targets/push';
|
|
931
|
+
const payload = {};
|
|
932
|
+
if (typeof targetId !== 'undefined') {
|
|
933
|
+
payload['targetId'] = targetId;
|
|
934
|
+
}
|
|
935
|
+
if (typeof identifier !== 'undefined') {
|
|
936
|
+
payload['identifier'] = identifier;
|
|
937
|
+
}
|
|
938
|
+
if (typeof providerId !== 'undefined') {
|
|
939
|
+
payload['providerId'] = providerId;
|
|
940
|
+
}
|
|
941
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
942
|
+
const apiHeaders = {
|
|
943
|
+
'content-type': 'application/json',
|
|
944
|
+
};
|
|
945
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
946
|
+
}
|
|
947
|
+
/**
|
|
948
|
+
* Update push target
|
|
949
|
+
*
|
|
950
|
+
*
|
|
951
|
+
* @param {string} targetId
|
|
952
|
+
* @param {string} identifier
|
|
953
|
+
* @throws {AppcondaException}
|
|
954
|
+
* @returns {Promise<Target>}
|
|
955
|
+
*/
|
|
956
|
+
async updatePushTarget(targetId, identifier) {
|
|
957
|
+
if (typeof targetId === 'undefined') {
|
|
958
|
+
throw new AppcondaException('Missing required parameter: "targetId"');
|
|
959
|
+
}
|
|
960
|
+
if (typeof identifier === 'undefined') {
|
|
961
|
+
throw new AppcondaException('Missing required parameter: "identifier"');
|
|
962
|
+
}
|
|
963
|
+
const apiPath = '/account/targets/{targetId}/push'.replace('{targetId}', targetId);
|
|
964
|
+
const payload = {};
|
|
965
|
+
if (typeof identifier !== 'undefined') {
|
|
966
|
+
payload['identifier'] = identifier;
|
|
967
|
+
}
|
|
968
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
969
|
+
const apiHeaders = {
|
|
970
|
+
'content-type': 'application/json',
|
|
971
|
+
};
|
|
972
|
+
return await this.client.call('put', uri, apiHeaders, payload);
|
|
973
|
+
}
|
|
974
|
+
/**
|
|
975
|
+
* Delete push target
|
|
976
|
+
*
|
|
977
|
+
*
|
|
978
|
+
* @param {string} targetId
|
|
979
|
+
* @throws {AppcondaException}
|
|
980
|
+
* @returns {Promise<{}>}
|
|
981
|
+
*/
|
|
982
|
+
async deletePushTarget(targetId) {
|
|
983
|
+
if (typeof targetId === 'undefined') {
|
|
984
|
+
throw new AppcondaException('Missing required parameter: "targetId"');
|
|
985
|
+
}
|
|
986
|
+
const apiPath = '/account/targets/{targetId}/push'.replace('{targetId}', targetId);
|
|
987
|
+
const payload = {};
|
|
988
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
989
|
+
const apiHeaders = {
|
|
990
|
+
'content-type': 'application/json',
|
|
991
|
+
};
|
|
992
|
+
return await this.client.call('delete', uri, apiHeaders, payload);
|
|
993
|
+
}
|
|
994
|
+
/**
|
|
995
|
+
* Create email token (OTP)
|
|
996
|
+
*
|
|
997
|
+
* Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST /v1/account/sessions/token](https://appconda.io/docs/references/cloud/client-web/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes.
|
|
998
|
+
|
|
999
|
+
A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
|
|
1000
|
+
*
|
|
1001
|
+
* @param {string} userId
|
|
1002
|
+
* @param {string} email
|
|
1003
|
+
* @param {boolean} phrase
|
|
1004
|
+
* @throws {AppcondaException}
|
|
1005
|
+
* @returns {Promise<Models.Token>}
|
|
1006
|
+
*/
|
|
1007
|
+
async createEmailToken(userId, email, phrase) {
|
|
1008
|
+
if (typeof userId === 'undefined') {
|
|
1009
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
1010
|
+
}
|
|
1011
|
+
if (typeof email === 'undefined') {
|
|
1012
|
+
throw new AppcondaException('Missing required parameter: "email"');
|
|
1013
|
+
}
|
|
1014
|
+
const apiPath = '/account/tokens/email';
|
|
1015
|
+
const payload = {};
|
|
1016
|
+
if (typeof userId !== 'undefined') {
|
|
1017
|
+
payload['userId'] = userId;
|
|
1018
|
+
}
|
|
1019
|
+
if (typeof email !== 'undefined') {
|
|
1020
|
+
payload['email'] = email;
|
|
1021
|
+
}
|
|
1022
|
+
if (typeof phrase !== 'undefined') {
|
|
1023
|
+
payload['phrase'] = phrase;
|
|
1024
|
+
}
|
|
1025
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
1026
|
+
const apiHeaders = {
|
|
1027
|
+
'content-type': 'application/json',
|
|
1028
|
+
};
|
|
1029
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
1030
|
+
}
|
|
1031
|
+
/**
|
|
1032
|
+
* Create magic URL token
|
|
1033
|
+
*
|
|
1034
|
+
* Sends the user an email with a secret key for creating a session. If the provided user ID has not been registered, a new user will be created. When the user clicks the link in the email, the user is redirected back to the URL you provided with the secret key and userId values attached to the URL query string. Use the query string parameters to submit a request to the [POST /v1/account/sessions/token](https://appconda.io/docs/references/cloud/client-web/account#createSession) endpoint to complete the login process. The link sent to the user's email address is valid for 1 hour. If you are on a mobile device you can leave the URL parameter empty, so that the login completion will be handled by your Appconda instance by default.
|
|
1035
|
+
|
|
1036
|
+
A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
|
|
1037
|
+
|
|
1038
|
+
*
|
|
1039
|
+
* @param {string} userId
|
|
1040
|
+
* @param {string} email
|
|
1041
|
+
* @param {string} url
|
|
1042
|
+
* @param {boolean} phrase
|
|
1043
|
+
* @throws {AppcondaException}
|
|
1044
|
+
* @returns {Promise<Models.Token>}
|
|
1045
|
+
*/
|
|
1046
|
+
async createMagicURLToken(userId, email, url, phrase) {
|
|
1047
|
+
if (typeof userId === 'undefined') {
|
|
1048
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
1049
|
+
}
|
|
1050
|
+
if (typeof email === 'undefined') {
|
|
1051
|
+
throw new AppcondaException('Missing required parameter: "email"');
|
|
1052
|
+
}
|
|
1053
|
+
const apiPath = '/account/tokens/magic-url';
|
|
1054
|
+
const payload = {};
|
|
1055
|
+
if (typeof userId !== 'undefined') {
|
|
1056
|
+
payload['userId'] = userId;
|
|
1057
|
+
}
|
|
1058
|
+
if (typeof email !== 'undefined') {
|
|
1059
|
+
payload['email'] = email;
|
|
1060
|
+
}
|
|
1061
|
+
if (typeof url !== 'undefined') {
|
|
1062
|
+
payload['url'] = url;
|
|
1063
|
+
}
|
|
1064
|
+
if (typeof phrase !== 'undefined') {
|
|
1065
|
+
payload['phrase'] = phrase;
|
|
1066
|
+
}
|
|
1067
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
1068
|
+
const apiHeaders = {
|
|
1069
|
+
'content-type': 'application/json',
|
|
1070
|
+
};
|
|
1071
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
1072
|
+
}
|
|
1073
|
+
/**
|
|
1074
|
+
* Create OAuth2 token
|
|
1075
|
+
*
|
|
1076
|
+
* Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appconda console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.
|
|
1077
|
+
|
|
1078
|
+
If authentication succeeds, `userId` and `secret` of a token will be appended to the success URL as query parameters. These can be used to create a new session using the [Create session](https://appconda.io/docs/references/cloud/client-web/account#createSession) endpoint.
|
|
1079
|
+
|
|
1080
|
+
A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
|
|
1081
|
+
*
|
|
1082
|
+
* @param {OAuthProvider} provider
|
|
1083
|
+
* @param {string} success
|
|
1084
|
+
* @param {string} failure
|
|
1085
|
+
* @param {string[]} scopes
|
|
1086
|
+
* @throws {AppcondaException}
|
|
1087
|
+
* @returns {Promise<void | string>}
|
|
1088
|
+
*/
|
|
1089
|
+
async createOAuth2Token(provider, success, failure, scopes) {
|
|
1090
|
+
if (typeof provider === 'undefined') {
|
|
1091
|
+
throw new AppcondaException('Missing required parameter: "provider"');
|
|
1092
|
+
}
|
|
1093
|
+
const apiPath = '/account/tokens/oauth2/{provider}'.replace('{provider}', provider);
|
|
1094
|
+
const payload = {};
|
|
1095
|
+
if (typeof success !== 'undefined') {
|
|
1096
|
+
payload['success'] = success;
|
|
1097
|
+
}
|
|
1098
|
+
if (typeof failure !== 'undefined') {
|
|
1099
|
+
payload['failure'] = failure;
|
|
1100
|
+
}
|
|
1101
|
+
if (typeof scopes !== 'undefined') {
|
|
1102
|
+
payload['scopes'] = scopes;
|
|
1103
|
+
}
|
|
1104
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
1105
|
+
const apiHeaders = {
|
|
1106
|
+
'content-type': 'application/json',
|
|
1107
|
+
};
|
|
1108
|
+
payload['project'] = this.client.config.project;
|
|
1109
|
+
for (const [key, value] of Object.entries(Service.flatten(payload))) {
|
|
1110
|
+
uri.searchParams.append(key, value);
|
|
1111
|
+
}
|
|
1112
|
+
if (typeof window !== 'undefined' && window?.location) {
|
|
1113
|
+
window.location.href = uri.toString();
|
|
1114
|
+
return;
|
|
1115
|
+
}
|
|
1116
|
+
else {
|
|
1117
|
+
return uri.toString();
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
/**
|
|
1121
|
+
* Create phone token
|
|
1122
|
+
*
|
|
1123
|
+
* Sends the user an SMS with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST /v1/account/sessions/token](https://appconda.io/docs/references/cloud/client-web/account#createSession) endpoint to complete the login process. The secret sent to the user's phone is valid for 15 minutes.
|
|
1124
|
+
|
|
1125
|
+
A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appconda.io/docs/authentication-security#limits).
|
|
1126
|
+
*
|
|
1127
|
+
* @param {string} userId
|
|
1128
|
+
* @param {string} phone
|
|
1129
|
+
* @throws {AppcondaException}
|
|
1130
|
+
* @returns {Promise<Models.Token>}
|
|
1131
|
+
*/
|
|
1132
|
+
async createPhoneToken(userId, phone) {
|
|
1133
|
+
if (typeof userId === 'undefined') {
|
|
1134
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
1135
|
+
}
|
|
1136
|
+
if (typeof phone === 'undefined') {
|
|
1137
|
+
throw new AppcondaException('Missing required parameter: "phone"');
|
|
1138
|
+
}
|
|
1139
|
+
const apiPath = '/account/tokens/phone';
|
|
1140
|
+
const payload = {};
|
|
1141
|
+
if (typeof userId !== 'undefined') {
|
|
1142
|
+
payload['userId'] = userId;
|
|
1143
|
+
}
|
|
1144
|
+
if (typeof phone !== 'undefined') {
|
|
1145
|
+
payload['phone'] = phone;
|
|
1146
|
+
}
|
|
1147
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
1148
|
+
const apiHeaders = {
|
|
1149
|
+
'content-type': 'application/json',
|
|
1150
|
+
};
|
|
1151
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
1152
|
+
}
|
|
1153
|
+
/**
|
|
1154
|
+
* Create email verification
|
|
1155
|
+
*
|
|
1156
|
+
* Use this endpoint to send a verification message to your user email address to confirm they are the valid owners of that address. Both the **userId** and **secret** arguments will be passed as query parameters to the URL you have provided to be attached to the verification email. The provided URL should redirect the user back to your app and allow you to complete the verification process by verifying both the **userId** and **secret** parameters. Learn more about how to [complete the verification process](https://appconda.io/docs/references/cloud/client-web/account#updateVerification). The verification link sent to the user's email address is valid for 7 days.
|
|
1157
|
+
|
|
1158
|
+
Please note that in order to avoid a [Redirect Attack](https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.md), the only valid redirect URLs are the ones from domains you have set when adding your platforms in the console interface.
|
|
1159
|
+
|
|
1160
|
+
*
|
|
1161
|
+
* @param {string} url
|
|
1162
|
+
* @throws {AppcondaException}
|
|
1163
|
+
* @returns {Promise<Models.Token>}
|
|
1164
|
+
*/
|
|
1165
|
+
async createVerification(url, body) {
|
|
1166
|
+
if (typeof url === 'undefined') {
|
|
1167
|
+
throw new AppcondaException('Missing required parameter: "url"');
|
|
1168
|
+
}
|
|
1169
|
+
const apiPath = '/account/verification';
|
|
1170
|
+
const payload = {};
|
|
1171
|
+
if (typeof url !== 'undefined') {
|
|
1172
|
+
payload['url'] = url;
|
|
1173
|
+
}
|
|
1174
|
+
if (typeof body !== 'undefined') {
|
|
1175
|
+
payload['body'] = body;
|
|
1176
|
+
}
|
|
1177
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
1178
|
+
const apiHeaders = {
|
|
1179
|
+
'content-type': 'application/json',
|
|
1180
|
+
};
|
|
1181
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
1182
|
+
}
|
|
1183
|
+
/**
|
|
1184
|
+
* Create email verification (confirmation)
|
|
1185
|
+
*
|
|
1186
|
+
* Use this endpoint to complete the user email verification process. Use both the **userId** and **secret** parameters that were attached to your app URL to verify the user email ownership. If confirmed this route will return a 200 status code.
|
|
1187
|
+
*
|
|
1188
|
+
* @param {string} userId
|
|
1189
|
+
* @param {string} secret
|
|
1190
|
+
* @throws {AppcondaException}
|
|
1191
|
+
* @returns {Promise<Models.Token>}
|
|
1192
|
+
*/
|
|
1193
|
+
async updateVerification(userId, secret) {
|
|
1194
|
+
if (typeof userId === 'undefined') {
|
|
1195
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
1196
|
+
}
|
|
1197
|
+
if (typeof secret === 'undefined') {
|
|
1198
|
+
throw new AppcondaException('Missing required parameter: "secret"');
|
|
1199
|
+
}
|
|
1200
|
+
const apiPath = '/account/verification';
|
|
1201
|
+
const payload = {};
|
|
1202
|
+
if (typeof userId !== 'undefined') {
|
|
1203
|
+
payload['userId'] = userId;
|
|
1204
|
+
}
|
|
1205
|
+
if (typeof secret !== 'undefined') {
|
|
1206
|
+
payload['secret'] = secret;
|
|
1207
|
+
}
|
|
1208
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
1209
|
+
const apiHeaders = {
|
|
1210
|
+
'content-type': 'application/json',
|
|
1211
|
+
};
|
|
1212
|
+
return await this.client.call('put', uri, apiHeaders, payload);
|
|
1213
|
+
}
|
|
1214
|
+
/**
|
|
1215
|
+
* Create phone verification
|
|
1216
|
+
*
|
|
1217
|
+
* Use this endpoint to send a verification SMS to the currently logged in user. This endpoint is meant for use after updating a user's phone number using the [accountUpdatePhone](https://appconda.io/docs/references/cloud/client-web/account#updatePhone) endpoint. Learn more about how to [complete the verification process](https://appconda.io/docs/references/cloud/client-web/account#updatePhoneVerification). The verification code sent to the user's phone number is valid for 15 minutes.
|
|
1218
|
+
*
|
|
1219
|
+
* @throws {AppcondaException}
|
|
1220
|
+
* @returns {Promise<Models.Token>}
|
|
1221
|
+
*/
|
|
1222
|
+
async createPhoneVerification() {
|
|
1223
|
+
const apiPath = '/account/verification/phone';
|
|
1224
|
+
const payload = {};
|
|
1225
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
1226
|
+
const apiHeaders = {
|
|
1227
|
+
'content-type': 'application/json',
|
|
1228
|
+
};
|
|
1229
|
+
return await this.client.call('post', uri, apiHeaders, payload);
|
|
1230
|
+
}
|
|
1231
|
+
/**
|
|
1232
|
+
* Update phone verification (confirmation)
|
|
1233
|
+
*
|
|
1234
|
+
* Use this endpoint to complete the user phone verification process. Use the **userId** and **secret** that were sent to your user's phone number to verify the user email ownership. If confirmed this route will return a 200 status code.
|
|
1235
|
+
*
|
|
1236
|
+
* @param {string} userId
|
|
1237
|
+
* @param {string} secret
|
|
1238
|
+
* @throws {AppcondaException}
|
|
1239
|
+
* @returns {Promise<Models.Token>}
|
|
1240
|
+
*/
|
|
1241
|
+
async updatePhoneVerification(userId, secret) {
|
|
1242
|
+
if (typeof userId === 'undefined') {
|
|
1243
|
+
throw new AppcondaException('Missing required parameter: "userId"');
|
|
1244
|
+
}
|
|
1245
|
+
if (typeof secret === 'undefined') {
|
|
1246
|
+
throw new AppcondaException('Missing required parameter: "secret"');
|
|
1247
|
+
}
|
|
1248
|
+
const apiPath = '/account/verification/phone';
|
|
1249
|
+
const payload = {};
|
|
1250
|
+
if (typeof userId !== 'undefined') {
|
|
1251
|
+
payload['userId'] = userId;
|
|
1252
|
+
}
|
|
1253
|
+
if (typeof secret !== 'undefined') {
|
|
1254
|
+
payload['secret'] = secret;
|
|
1255
|
+
}
|
|
1256
|
+
const uri = new URL(this.client.config.endpoint + apiPath);
|
|
1257
|
+
const apiHeaders = {
|
|
1258
|
+
'content-type': 'application/json',
|
|
1259
|
+
};
|
|
1260
|
+
return await this.client.call('put', uri, apiHeaders, payload);
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2R1bGVzL2FjY291bnQvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHeEMsTUFBTSxPQUFPLE9BQU87SUFHaEIsWUFBWSxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLEdBQUc7UUFDTCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUM7UUFDM0IsTUFBTSxPQUFPLEdBQVksRUFBRSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBaUM7WUFDN0MsY0FBYyxFQUFFLGtCQUFrQjtTQUNyQyxDQUFBO1FBR0QsT0FBTyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsRUFDVixPQUFPLENBQ1YsQ0FBQztJQUNOLENBQUM7SUFDRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQXdCLE1BQWMsRUFBRSxLQUFhLEVBQUUsUUFBZ0IsRUFBRSxJQUFhO1FBQzlGLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLGlCQUFpQixDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLGlCQUFpQixDQUFDLHFDQUFxQyxDQUFDLENB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LDZCQUE2QixDQUFDO1FBQzlDLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFHRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCB7IEF1dGhlbnRpY2F0b3JUeXBlIH0gZnJvbSAnLi9lbnVtcy9hdXRoZW50aWNhdG9yLXR5cGUnO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25GYWN0b3IgfSBmcm9tICcuL2VudW1zL2F1dGhlbnRpY2F0aW9uLWZhY3Rvcic7XG5pbXBvcnQgeyBPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9lbnVtcy9vLWF1dGgtcHJvdmlkZXInO1xuaW1wb3J0IHsgQXBwY29uZGFFeGNlcHRpb24sIENsaWVudCwgUGF5bG9hZCB9IGZyb20gJy4uLy4uL2NsaWVudCc7XG5pbXBvcnQgeyBVc2VyLCBQcmVmZXJlbmNlcywgSWRlbnRpdHlMaXN0LCBKd3QsIExvZ0xpc3QsIE1mYVR5cGUsIE1mYUNoYWxsZW5nZSwgTWZhRmFjdG9ycywgTWZhUmVjb3ZlcnlDb2RlcywgVG9rZW4sIFNlc3Npb25MaXN0LCBTZXNzaW9uLCBUYXJnZXQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlJztcblxuXG5leHBvcnQgY2xhc3MgQWNjb3VudCB7XG4gICAgY2xpZW50OiBDbGllbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWNjb3VudFxuICAgICAqXG4gICAgICogR2V0IHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVXNlcjxQcmVmZXJlbmNlcz4+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldDxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KCk6IFByb21pc2U8VXNlcjxUPj4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50JztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFjY291bnRcbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGFsbG93IGEgbmV3IHVzZXIgdG8gcmVnaXN0ZXIgYSBuZXcgYWNjb3VudCBpbiB5b3VyIHByb2plY3QuIEFmdGVyIHRoZSB1c2VyIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCB5b3UgY2FuIHVzZSB0aGUgWy9hY2NvdW50L3ZlcmZpY2F0aW9uXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlVmVyaWZpY2F0aW9uKSByb3V0ZSB0byBzdGFydCB2ZXJpZnlpbmcgdGhlIHVzZXIgZW1haWwgYWRkcmVzcy4gVG8gYWxsb3cgdGhlIG5ldyB1c2VyIHRvIGxvZ2luIHRvIHRoZWlyIG5ldyBhY2NvdW50LCB5b3UgbmVlZCB0byBjcmVhdGUgYSBuZXcgW2FjY291bnQgc2Vzc2lvbl0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I2NyZWF0ZUVtYWlsU2Vzc2lvbikuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVXNlcjxQcmVmZXJlbmNlcz4+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZTxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KHVzZXJJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nKTogUHJvbWlzZTxVc2VyPFQ+PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1c2VySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW1haWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImVtYWlsXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwYXNzd29yZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW1haWwnXSA9IGVtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwYXNzd29yZCddID0gcGFzc3dvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBhY2NvdW50XG4gICAgICpcbiAgICAgKiBEZWxldGUgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50JztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZW1haWxcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgYWNjb3VudCBlbWFpbCBhZGRyZXNzLiBBZnRlciBjaGFuZ2luZyB1c2VyIGFkZHJlc3MsIHRoZSB1c2VyIGNvbmZpcm1hdGlvbiBzdGF0dXMgd2lsbCBnZXQgcmVzZXQuIEEgbmV3IGNvbmZpcm1hdGlvbiBlbWFpbCBpcyBub3Qgc2VudCBhdXRvbWF0aWNhbGx5IGhvd2V2ZXIgeW91IGNhbiB1c2UgdGhlIHNlbmQgY29uZmlybWF0aW9uIGVtYWlsIGVuZHBvaW50IGFnYWluIHRvIHNlbmQgdGhlIGNvbmZpcm1hdGlvbiBlbWFpbC4gRm9yIHNlY3VyaXR5IG1lYXN1cmVzLCB1c2VyIHBhc3N3b3JkIGlzIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoaXMgcmVxdWVzdC5cblRoaXMgZW5kcG9pbnQgY2FuIGFsc28gYmUgdXNlZCB0byBjb252ZXJ0IGFuIGFub255bW91cyBhY2NvdW50IHRvIGEgbm9ybWFsIG9uZSwgYnkgcGFzc2luZyBhbiBlbWFpbCBhZGRyZXNzIGFuZCBhIG5ldyBwYXNzd29yZC5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlVzZXI8UHJlZmVyZW5jZXM+Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVFbWFpbDxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXI8VD4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZW1haWxcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInBhc3N3b3JkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L2VtYWlsJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGVtYWlsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW1haWwnXSA9IGVtYWlsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwYXNzd29yZCddID0gcGFzc3dvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBJZGVudGl0aWVzXG4gICAgICpcbiAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgaWRlbnRpdGllcyBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxJZGVudGl0eUxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RJZGVudGl0aWVzKHF1ZXJpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8SWRlbnRpdHlMaXN0PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvaWRlbnRpdGllcyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBxdWVyaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncXVlcmllcyddID0gcXVlcmllcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGlkZW50aXR5XG4gICAgICpcbiAgICAgKiBEZWxldGUgYW4gaWRlbnRpdHkgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGl0eUlkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUlkZW50aXR5KGlkZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpZGVudGl0eUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJpZGVudGl0eUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L2lkZW50aXRpZXMve2lkZW50aXR5SWR9Jy5yZXBsYWNlKCd7aWRlbnRpdHlJZH0nLCBpZGVudGl0eUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEpXVFxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSlNPTiBXZWIgVG9rZW4uIFlvdSBjYW4gdXNlIHRoZSByZXN1bHRpbmcgSldUIHRvIGF1dGhlbnRpY2F0ZSBvbiBiZWhhbGYgb2YgdGhlIGN1cnJlbnQgdXNlciB3aGVuIHdvcmtpbmcgd2l0aCB0aGUgQXBwY29uZGEgc2VydmVyLXNpZGUgQVBJIGFuZCBTREtzLiBUaGUgSldUIHNlY3JldCBpcyB2YWxpZCBmb3IgMTUgbWludXRlcyBmcm9tIGl0cyBjcmVhdGlvbiBhbmQgd2lsbCBiZSBpbnZhbGlkIGlmIHRoZSB1c2VyIHdpbGwgbG9nb3V0IGluIHRoYXQgdGltZSBmcmFtZS5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPEp3dD59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlSldUKCk6IFByb21pc2U8Snd0PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvand0cyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IGxvZ3NcbiAgICAgKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBsYXRlc3Qgc2VjdXJpdHkgYWN0aXZpdHkgbG9ncyBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci4gRWFjaCBsb2cgcmV0dXJucyB1c2VyIElQIGFkZHJlc3MsIGxvY2F0aW9uIGFuZCBkYXRlIGFuZCB0aW1lIG9mIGxvZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHF1ZXJpZXNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxMb2dMaXN0Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0TG9ncyhxdWVyaWVzPzogc3RyaW5nW10pOiBQcm9taXNlPExvZ0xpc3Q+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9sb2dzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgTUZBXG4gICAgICpcbiAgICAgKiBFbmFibGUgb3IgZGlzYWJsZSBNRkEgb24gYW4gYWNjb3VudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbWZhXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlVzZXI8UHJlZmVyZW5jZXM+Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVNRkE8VCBleHRlbmRzIFByZWZlcmVuY2VzPihtZmE6IGJvb2xlYW4pOiBQcm9taXNlPFVzZXI8VD4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBtZmEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm1mYVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9tZmEnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbWZhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWZhJ10gPSBtZmE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEF1dGhlbnRpY2F0b3JcbiAgICAgKlxuICAgICAqIEFkZCBhbiBhdXRoZW50aWNhdG9yIGFwcCB0byBiZSB1c2VkIGFzIGFuIE1GQSBmYWN0b3IuIFZlcmlmeSB0aGUgYXV0aGVudGljYXRvciB1c2luZyB0aGUgW3ZlcmlmeSBhdXRoZW50aWNhdG9yXSgvZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCN1cGRhdGVNZmFBdXRoZW50aWNhdG9yKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0F1dGhlbnRpY2F0b3JUeXBlfSB0eXBlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TWZhVHlwZT59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTWZhQXV0aGVudGljYXRvcih0eXBlOiBBdXRoZW50aWNhdG9yVHlwZSk6IFByb21pc2U8TWZhVHlwZT4ge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInR5cGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL2F1dGhlbnRpY2F0b3JzL3t0eXBlfScucmVwbGFjZSgne3R5cGV9JywgdHlwZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBWZXJpZnkgQXV0aGVudGljYXRvclxuICAgICAqXG4gICAgICogVmVyaWZ5IGFuIGF1dGhlbnRpY2F0b3IgYXBwIGFmdGVyIGFkZGluZyBpdCB1c2luZyB0aGUgW2FkZCBhdXRoZW50aWNhdG9yXSgvZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCNjcmVhdGVNZmFBdXRoZW50aWNhdG9yKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0F1dGhlbnRpY2F0b3JUeXBlfSB0eXBlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG90cFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTWZhQXV0aGVudGljYXRvcjxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KHR5cGU6IEF1dGhlbnRpY2F0b3JUeXBlLCBvdHA6IHN0cmluZyk6IFByb21pc2U8VXNlcjxUPj4ge1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInR5cGVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3RwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJvdHBcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL2F1dGhlbnRpY2F0b3JzL3t0eXBlfScucmVwbGFjZSgne3R5cGV9JywgdHlwZSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBvdHAgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydvdHAnXSA9IG90cDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwdXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIEF1dGhlbnRpY2F0b3JcbiAgICAgKlxuICAgICAqIERlbGV0ZSBhbiBhdXRoZW50aWNhdG9yIGZvciBhIHVzZXIgYnkgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0F1dGhlbnRpY2F0b3JUeXBlfSB0eXBlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZU1mYUF1dGhlbnRpY2F0b3IodHlwZTogQXV0aGVudGljYXRvclR5cGUpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidHlwZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9tZmEvYXV0aGVudGljYXRvcnMve3R5cGV9Jy5yZXBsYWNlKCd7dHlwZX0nLCB0eXBlKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE1GQSBDaGFsbGVuZ2VcbiAgICAgKlxuICAgICAqIEJlZ2luIHRoZSBwcm9jZXNzIG9mIE1GQSB2ZXJpZmljYXRpb24gYWZ0ZXIgc2lnbi1pbi4gRmluaXNoIHRoZSBmbG93IHdpdGggW3VwZGF0ZU1mYUNoYWxsZW5nZV0oL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjdXBkYXRlTWZhQ2hhbGxlbmdlKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0F1dGhlbnRpY2F0aW9uRmFjdG9yfSBmYWN0b3JcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNZmFDaGFsbGVuZ2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU1mYUNoYWxsZW5nZShmYWN0b3I6IEF1dGhlbnRpY2F0aW9uRmFjdG9yKTogUHJvbWlzZTxNZmFDaGFsbGVuZ2U+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmYWN0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImZhY3RvclwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9tZmEvY2hhbGxlbmdlJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGZhY3RvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2ZhY3RvciddID0gZmFjdG9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE1GQSBDaGFsbGVuZ2UgKGNvbmZpcm1hdGlvbilcbiAgICAgKlxuICAgICAqIENvbXBsZXRlIHRoZSBNRkEgY2hhbGxlbmdlIGJ5IHByb3ZpZGluZyB0aGUgb25lLXRpbWUgcGFzc3dvcmQuIEZpbmlzaCB0aGUgcHJvY2VzcyBvZiBNRkEgdmVyaWZpY2F0aW9uIGJ5IHByb3ZpZGluZyB0aGUgb25lLXRpbWUgcGFzc3dvcmQuIFRvIGJlZ2luIHRoZSBmbG93LCB1c2UgW2NyZWF0ZU1mYUNoYWxsZW5nZV0oL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlTWZhQ2hhbGxlbmdlKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhbGxlbmdlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3RwXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZU1mYUNoYWxsZW5nZShjaGFsbGVuZ2VJZDogc3RyaW5nLCBvdHA6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFsbGVuZ2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY2hhbGxlbmdlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb3RwID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJvdHBcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL2NoYWxsZW5nZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGFsbGVuZ2VJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2NoYWxsZW5nZUlkJ10gPSBjaGFsbGVuZ2VJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG90cCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ290cCddID0gb3RwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaXN0IEZhY3RvcnNcbiAgICAgKlxuICAgICAqIExpc3QgdGhlIGZhY3RvcnMgYXZhaWxhYmxlIG9uIHRoZSBhY2NvdW50IHRvIGJlIHVzZWQgYXMgYSBNRkEgY2hhbGxhbmdlLlxuICAgICAqXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TWZhRmFjdG9ycz59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdE1mYUZhY3RvcnMoKTogUHJvbWlzZTxNZmFGYWN0b3JzPiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL2ZhY3RvcnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgTUZBIFJlY292ZXJ5IENvZGVzXG4gICAgICpcbiAgICAgKiBHZXQgcmVjb3ZlcnkgY29kZXMgdGhhdCBjYW4gYmUgdXNlZCBhcyBiYWNrdXAgZm9yIE1GQSBmbG93LiBCZWZvcmUgZ2V0dGluZyBjb2RlcywgdGhleSBtdXN0IGJlIGdlbmVyYXRlZCB1c2luZyBbY3JlYXRlTWZhUmVjb3ZlcnlDb2Rlc10oL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlTWZhUmVjb3ZlcnlDb2RlcykgbWV0aG9kLiBBbiBPVFAgY2hhbGxlbmdlIGlzIHJlcXVpcmVkIHRvIHJlYWQgcmVjb3ZlcnkgY29kZXMuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNZmFSZWNvdmVyeUNvZGVzPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRNZmFSZWNvdmVyeUNvZGVzKCk6IFByb21pc2U8TWZhUmVjb3ZlcnlDb2Rlcz4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L21mYS9yZWNvdmVyeS1jb2Rlcyc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBNRkEgUmVjb3ZlcnkgQ29kZXNcbiAgICAgKlxuICAgICAqIEdlbmVyYXRlIHJlY292ZXJ5IGNvZGVzIGFzIGJhY2t1cCBmb3IgTUZBIGZsb3cuIEl0JiMwMzk7cyByZWNvbW1lbmRlZCB0byBnZW5lcmF0ZSBhbmQgc2hvdyB0aGVuIGltbWVkaWF0ZWx5IGFmdGVyIHVzZXIgc3VjY2Vzc2Z1bGx5IGFkZHMgdGhlaXIgYXV0aGVodGljYXRvci4gUmVjb3ZlcnkgY29kZXMgY2FuIGJlIHVzZWQgYXMgYSBNRkEgdmVyaWZpY2F0aW9uIHR5cGUgaW4gW2NyZWF0ZU1mYUNoYWxsZW5nZV0oL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlTWZhQ2hhbGxlbmdlKSBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuTWZhUmVjb3ZlcnlDb2Rlcz59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTWZhUmVjb3ZlcnlDb2RlcygpOiBQcm9taXNlPE1mYVJlY292ZXJ5Q29kZXM+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9tZmEvcmVjb3ZlcnktY29kZXMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdlbmVyYXRlIE1GQSBSZWNvdmVyeSBDb2Rlc1xuICAgICAqXG4gICAgICogUmVnZW5lcmF0ZSByZWNvdmVyeSBjb2RlcyB0aGF0IGNhbiBiZSB1c2VkIGFzIGJhY2t1cCBmb3IgTUZBIGZsb3cuIEJlZm9yZSByZWdlbmVyYXRpbmcgY29kZXMsIHRoZXkgbXVzdCBiZSBmaXJzdCBnZW5lcmF0ZWQgdXNpbmcgW2NyZWF0ZU1mYVJlY292ZXJ5Q29kZXNdKC9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I2NyZWF0ZU1mYVJlY292ZXJ5Q29kZXMpIG1ldGhvZC4gQW4gT1RQIGNoYWxsZW5nZSBpcyByZXF1aXJlZCB0byByZWdlbnJlYXRlIHJlY292ZXJ5IGNvZGVzLlxuICAgICAqXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLk1mYVJlY292ZXJ5Q29kZXM+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZU1mYVJlY292ZXJ5Q29kZXMoKTogUHJvbWlzZTxNZmFSZWNvdmVyeUNvZGVzPiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbWZhL3JlY292ZXJ5LWNvZGVzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgbmFtZVxuICAgICAqXG4gICAgICogVXBkYXRlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlciBhY2NvdW50IG5hbWUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTmFtZTxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8VXNlcjxUPj4ge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvbmFtZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmFtZSddID0gbmFtZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcGFzc3dvcmRcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXIgcGFzc3dvcmQuIEZvciB2YWxpZGF0aW9uLCB1c2VyIGlzIHJlcXVpcmVkIHRvIHBhc3MgaW4gdGhlIG5ldyBwYXNzd29yZCwgYW5kIHRoZSBvbGQgcGFzc3dvcmQuIEZvciB1c2VycyBjcmVhdGVkIHdpdGggT0F1dGgsIFRlYW0gSW52aXRlcyBhbmQgTWFnaWMgVVJMLCBvbGRQYXNzd29yZCBpcyBvcHRpb25hbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRQYXNzd29yZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUGFzc3dvcmQ8VCBleHRlbmRzIFByZWZlcmVuY2VzPihwYXNzd29yZDogc3RyaW5nLCBvbGRQYXNzd29yZD86IHN0cmluZyk6IFByb21pc2U8VXNlcjxUPj4ge1xuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwYXNzd29yZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9wYXNzd29yZCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Bhc3N3b3JkJ10gPSBwYXNzd29yZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9sZFBhc3N3b3JkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnb2xkUGFzc3dvcmQnXSA9IG9sZFBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwaG9uZVxuICAgICAqXG4gICAgICogVXBkYXRlIHRoZSBjdXJyZW50bHkgbG9nZ2VkIGluIHVzZXImIzAzOTtzIHBob25lIG51bWJlci4gQWZ0ZXIgdXBkYXRpbmcgdGhlIHBob25lIG51bWJlciwgdGhlIHBob25lIHZlcmlmaWNhdGlvbiBzdGF0dXMgd2lsbCBiZSByZXNldC4gQSBjb25maXJtYXRpb24gU01TIGlzIG5vdCBzZW50IGF1dG9tYXRpY2FsbHksIGhvd2V2ZXIgeW91IGNhbiB1c2UgdGhlIFtQT1NUIC9hY2NvdW50L3ZlcmlmaWNhdGlvbi9waG9uZV0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I2NyZWF0ZVBob25lVmVyaWZpY2F0aW9uKSBlbmRwb2ludCB0byBzZW5kIGEgY29uZmlybWF0aW9uIFNNUy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwaG9uZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUGhvbmU8VCBleHRlbmRzIFByZWZlcmVuY2VzPihwaG9uZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyPFQ+PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcGhvbmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInBob25lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwYXNzd29yZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9waG9uZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBwaG9uZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Bob25lJ10gPSBwaG9uZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncGFzc3dvcmQnXSA9IHBhc3N3b3JkO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhY2NvdW50IHByZWZlcmVuY2VzXG4gICAgICpcbiAgICAgKiBHZXQgdGhlIHByZWZlcmVuY2VzIGFzIGEga2V5LXZhbHVlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFByZWZlcmVuY2VzPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXRQcmVmczxUIGV4dGVuZHMgUHJlZmVyZW5jZXM+KCk6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3ByZWZzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHByZWZlcmVuY2VzXG4gICAgICpcbiAgICAgKiBVcGRhdGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIGFjY291bnQgcHJlZmVyZW5jZXMuIFRoZSBvYmplY3QgeW91IHBhc3MgaXMgc3RvcmVkIGFzIGlzLCBhbmQgcmVwbGFjZXMgYW55IHByZXZpb3VzIHZhbHVlLiBUaGUgbWF4aW11bSBhbGxvd2VkIHByZWZzIHNpemUgaXMgNjRrQiBhbmQgdGhyb3dzIGVycm9yIGlmIGV4Y2VlZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtQYXJ0aWFsPFByZWZlcmVuY2VzPn0gcHJlZnNcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVXNlcjxQcmVmZXJlbmNlcz4+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVByZWZzPFQgZXh0ZW5kcyBQcmVmZXJlbmNlcz4ocHJlZnM6IFBhcnRpYWw8UHJlZmVyZW5jZXM+KTogUHJvbWlzZTxVc2VyPFQ+PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJlZnMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInByZWZzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3ByZWZzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHByZWZzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncHJlZnMnXSA9IHByZWZzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwYXNzd29yZCByZWNvdmVyeVxuICAgICAqXG4gICAgICogU2VuZHMgdGhlIHVzZXIgYW4gZW1haWwgd2l0aCBhIHRlbXBvcmFyeSBzZWNyZXQga2V5IGZvciBwYXNzd29yZCByZXNldC4gV2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGNvbmZpcm1hdGlvbiBsaW5rIGhlIGlzIHJlZGlyZWN0ZWQgYmFjayB0byB5b3VyIGFwcCBwYXNzd29yZCByZXNldCBVUkwgd2l0aCB0aGUgc2VjcmV0IGtleSBhbmQgZW1haWwgYWRkcmVzcyB2YWx1ZXMgYXR0YWNoZWQgdG8gdGhlIFVSTCBxdWVyeSBzdHJpbmcuIFVzZSB0aGUgcXVlcnkgc3RyaW5nIHBhcmFtcyB0byBzdWJtaXQgYSByZXF1ZXN0IHRvIHRoZSBbUFVUIC9hY2NvdW50L3JlY292ZXJ5XShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjdXBkYXRlUmVjb3ZlcnkpIGVuZHBvaW50IHRvIGNvbXBsZXRlIHRoZSBwcm9jZXNzLiBUaGUgdmVyaWZpY2F0aW9uIGxpbmsgc2VudCB0byB0aGUgdXNlciYjMDM5O3MgZW1haWwgYWRkcmVzcyBpcyB2YWxpZCBmb3IgMSBob3VyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFRva2VuPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVSZWNvdmVyeShlbWFpbDogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFByb21pc2U8VG9rZW4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZW1haWxcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1cmxcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvcmVjb3ZlcnknO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbWFpbCddID0gZW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1cmwnXSA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwYXNzd29yZCByZWNvdmVyeSAoY29uZmlybWF0aW9uKVxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY29tcGxldGUgdGhlIHVzZXIgYWNjb3VudCBwYXNzd29yZCByZXNldC4gQm90aCB0aGUgKip1c2VySWQqKiBhbmQgKipzZWNyZXQqKiBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgYXMgcXVlcnkgcGFyYW1ldGVycyB0byB0aGUgcmVkaXJlY3QgVVJMIHlvdSBoYXZlIHByb3ZpZGVkIHdoZW4gc2VuZGluZyB5b3VyIHJlcXVlc3QgdG8gdGhlIFtQT1NUIC9hY2NvdW50L3JlY292ZXJ5XShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlUmVjb3ZlcnkpIGVuZHBvaW50LlxuXG5QbGVhc2Ugbm90ZSB0aGF0IGluIG9yZGVyIHRvIGF2b2lkIGEgW1JlZGlyZWN0IEF0dGFja10oaHR0cHM6Ly9naXRodWIuY29tL09XQVNQL0NoZWF0U2hlZXRTZXJpZXMvYmxvYi9tYXN0ZXIvY2hlYXRzaGVldHMvVW52YWxpZGF0ZWRfUmVkaXJlY3RzX2FuZF9Gb3J3YXJkc19DaGVhdF9TaGVldC5tZCkgdGhlIG9ubHkgdmFsaWQgcmVkaXJlY3QgVVJMcyBhcmUgdGhlIG9uZXMgZnJvbSBkb21haW5zIHlvdSBoYXZlIHNldCB3aGVuIGFkZGluZyB5b3VyIHBsYXRmb3JtcyBpbiB0aGUgY29uc29sZSBpbnRlcmZhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXNzd29yZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub2tlbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUmVjb3ZlcnkodXNlcklkOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2VjcmV0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwYXNzd29yZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9yZWNvdmVyeSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlY3JldCddID0gc2VjcmV0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwYXNzd29yZCddID0gcGFzc3dvcmQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncHV0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3Qgc2Vzc2lvbnNcbiAgICAgKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBhY3RpdmUgc2Vzc2lvbnMgYWNyb3NzIGRpZmZlcmVudCBkZXZpY2VzIGZvciB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyLlxuICAgICAqXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8U2Vzc2lvbkxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RTZXNzaW9ucygpOiBQcm9taXNlPFNlc3Npb25MaXN0PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgc2Vzc2lvbnNcbiAgICAgKlxuICAgICAqIERlbGV0ZSBhbGwgc2Vzc2lvbnMgZnJvbSB0aGUgdXNlciBhY2NvdW50IGFuZCByZW1vdmUgYW55IHNlc3Npb25zIGNvb2tpZXMgZnJvbSB0aGUgZW5kIGNsaWVudC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVTZXNzaW9ucygpOiBQcm9taXNlPHt9PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5vbnltb3VzIHNlc3Npb25cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGFsbG93IGEgbmV3IHVzZXIgdG8gcmVnaXN0ZXIgYW4gYW5vbnltb3VzIGFjY291bnQgaW4geW91ciBwcm9qZWN0LiBUaGlzIHJvdXRlIHdpbGwgYWxzbyBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBmb3IgdGhlIHVzZXIuIFRvIGFsbG93IHRoZSBuZXcgdXNlciB0byBjb252ZXJ0IGFuIGFub255bW91cyBhY2NvdW50IHRvIGEgbm9ybWFsIGFjY291bnQsIHlvdSBuZWVkIHRvIHVwZGF0ZSBpdHMgW2VtYWlsIGFuZCBwYXNzd29yZF0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I3VwZGF0ZUVtYWlsKSBvciBjcmVhdGUgYW4gW09BdXRoMiBzZXNzaW9uXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjQ3JlYXRlT0F1dGgyU2Vzc2lvbikuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU2Vzc2lvbj59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQW5vbnltb3VzU2Vzc2lvbigpOiBQcm9taXNlPFNlc3Npb24+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9zZXNzaW9ucy9hbm9ueW1vdXMnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGVtYWlsIHBhc3N3b3JkIHNlc3Npb25cbiAgICAgKlxuICAgICAqIEFsbG93IHRoZSB1c2VyIHRvIGxvZ2luIGludG8gdGhlaXIgYWNjb3VudCBieSBwcm92aWRpbmcgYSB2YWxpZCBlbWFpbCBhbmQgcGFzc3dvcmQgY29tYmluYXRpb24uIFRoaXMgcm91dGUgd2lsbCBjcmVhdGUgYSBuZXcgc2Vzc2lvbiBmb3IgdGhlIHVzZXIuXG5cbkEgdXNlciBpcyBsaW1pdGVkIHRvIDEwIGFjdGl2ZSBzZXNzaW9ucyBhdCBhIHRpbWUgYnkgZGVmYXVsdC4gW0xlYXJuIG1vcmUgYWJvdXQgc2Vzc2lvbiBsaW1pdHNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9hdXRoZW50aWNhdGlvbi1zZWN1cml0eSNsaW1pdHMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVtYWlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3N3b3JkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8U2Vzc2lvbj59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlRW1haWxQYXNzd29yZFNlc3Npb24oZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIGVtYWlsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbWFpbFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzd29yZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicGFzc3dvcmRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMvZW1haWwnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbWFpbCddID0gZW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwYXNzd29yZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Bhc3N3b3JkJ10gPSBwYXNzd29yZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBtYWdpYyBVUkwgc2Vzc2lvblxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc2Vzc2lvbiBmcm9tIHRva2VuLiBQcm92aWRlIHRoZSAqKnVzZXJJZCoqIGFuZCAqKnNlY3JldCoqIHBhcmFtZXRlcnMgZnJvbSB0aGUgc3VjY2Vzc2Z1bCByZXNwb25zZSBvZiBhdXRoZW50aWNhdGlvbiBmbG93cyBpbml0aWF0ZWQgYnkgdG9rZW4gY3JlYXRpb24uIEZvciBleGFtcGxlLCBtYWdpYyBVUkwgYW5kIHBob25lIGxvZ2luLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWNyZXRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU2Vzc2lvbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlTWFnaWNVUkxTZXNzaW9uKHVzZXJJZDogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2VjcmV0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3Nlc3Npb25zL21hZ2ljLXVybCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlY3JldCddID0gc2VjcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgT0F1dGgyIHNlc3Npb25cbiAgICAgKlxuICAgICAqIEFsbG93IHRoZSB1c2VyIHRvIGxvZ2luIHRvIHRoZWlyIGFjY291bnQgdXNpbmcgdGhlIE9BdXRoMiBwcm92aWRlciBvZiB0aGVpciBjaG9pY2UuIEVhY2ggT0F1dGgyIHByb3ZpZGVyIHNob3VsZCBiZSBlbmFibGVkIGZyb20gdGhlIEFwcGNvbmRhIGNvbnNvbGUgZmlyc3QuIFVzZSB0aGUgc3VjY2VzcyBhbmQgZmFpbHVyZSBhcmd1bWVudHMgdG8gcHJvdmlkZSBhIHJlZGlyZWN0IFVSTCYjMDM5O3MgYmFjayB0byB5b3VyIGFwcCB3aGVuIGxvZ2luIGlzIGNvbXBsZXRlZC5cblxuSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgc2Vzc2lvbiwgdGhlIG5ldyBzZXNzaW9uIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGxvZ2dlZC1pbiBhY2NvdW50LiBJZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHNlc3Npb25zLCB0aGUgc2VydmVyIHdpbGwgYXR0ZW1wdCB0byBsb29rIGZvciBhIHVzZXIgd2l0aCB0aGUgc2FtZSBlbWFpbCBhZGRyZXNzIGFzIHRoZSBlbWFpbCByZWNlaXZlZCBmcm9tIHRoZSBPQXV0aDIgcHJvdmlkZXIgYW5kIGF0dGFjaCB0aGUgbmV3IHNlc3Npb24gdG8gdGhlIGV4aXN0aW5nIHVzZXIuIElmIG5vIG1hdGNoaW5nIHVzZXIgaXMgZm91bmQgLSB0aGUgc2VydmVyIHdpbGwgY3JlYXRlIGEgbmV3IHVzZXIuXG5cbkEgdXNlciBpcyBsaW1pdGVkIHRvIDEwIGFjdGl2ZSBzZXNzaW9ucyBhdCBhIHRpbWUgYnkgZGVmYXVsdC4gW0xlYXJuIG1vcmUgYWJvdXQgc2Vzc2lvbiBsaW1pdHNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9hdXRoZW50aWNhdGlvbi1zZWN1cml0eSNsaW1pdHMpLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09BdXRoUHJvdmlkZXJ9IHByb3ZpZGVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmFpbHVyZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNjb3Blc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQgfCBzdHJpbmc+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU9BdXRoMlNlc3Npb24ocHJvdmlkZXI6IE9BdXRoUHJvdmlkZXIsIHN1Y2Nlc3M/OiBzdHJpbmcsIGZhaWx1cmU/OiBzdHJpbmcsIHNjb3Blcz86IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkIHwgc3RyaW5nPiB7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwcm92aWRlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicHJvdmlkZXJcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMvb2F1dGgyL3twcm92aWRlcn0nLnJlcGxhY2UoJ3twcm92aWRlcn0nLCBwcm92aWRlcik7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWNjZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3VjY2VzcyddID0gc3VjY2VzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZhaWx1cmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmYWlsdXJlJ10gPSBmYWlsdXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NvcGVzJ10gPSBzY29wZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWRbJ3Byb2plY3QnXSA9IHRoaXMuY2xpZW50LmNvbmZpZy5wcm9qZWN0O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhTZXJ2aWNlLmZsYXR0ZW4ocGF5bG9hZCkpKSB7XG4gICAgICAgICAgICB1cmkuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3c/LmxvY2F0aW9uKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwaG9uZSBzZXNzaW9uXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBjcmVhdGUgYSBzZXNzaW9uIGZyb20gdG9rZW4uIFByb3ZpZGUgdGhlICoqdXNlcklkKiogYW5kICoqc2VjcmV0KiogcGFyYW1ldGVycyBmcm9tIHRoZSBzdWNjZXNzZnVsIHJlc3BvbnNlIG9mIGF1dGhlbnRpY2F0aW9uIGZsb3dzIGluaXRpYXRlZCBieSB0b2tlbiBjcmVhdGlvbi4gRm9yIGV4YW1wbGUsIG1hZ2ljIFVSTCBhbmQgcGhvbmUgbG9naW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TZXNzaW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVQaG9uZVNlc3Npb24odXNlcklkOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1c2VySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjcmV0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZWNyZXRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMvcGhvbmUnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcklkJ10gPSB1c2VySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWNyZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWNyZXQnXSA9IHNlY3JldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwdXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHNlc3Npb25cbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHNlc3Npb24gZnJvbSB0b2tlbi4gUHJvdmlkZSB0aGUgKip1c2VySWQqKiBhbmQgKipzZWNyZXQqKiBwYXJhbWV0ZXJzIGZyb20gdGhlIHN1Y2Nlc3NmdWwgcmVzcG9uc2Ugb2YgYXV0aGVudGljYXRpb24gZmxvd3MgaW5pdGlhdGVkIGJ5IHRva2VuIGNyZWF0aW9uLiBGb3IgZXhhbXBsZSwgbWFnaWMgVVJMIGFuZCBwaG9uZSBsb2dpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VjcmV0XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlNlc3Npb24+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVNlc3Npb24odXNlcklkOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1c2VySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjcmV0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZWNyZXRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMvdG9rZW4nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcklkJ10gPSB1c2VySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWNyZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWNyZXQnXSA9IHNlY3JldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBzZXNzaW9uXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBnZXQgYSBsb2dnZWQgaW4gdXNlciYjMDM5O3Mgc2Vzc2lvbiB1c2luZyBhIFNlc3Npb24gSUQuIElucHV0dGluZyAmIzAzOTtjdXJyZW50JiMwMzk7IHdpbGwgcmV0dXJuIHRoZSBjdXJyZW50IHNlc3Npb24gYmVpbmcgdXNlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuU2Vzc2lvbj59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8U2Vzc2lvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHNlc3Npb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2Vzc2lvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3Nlc3Npb25zL3tzZXNzaW9uSWR9Jy5yZXBsYWNlKCd7c2Vzc2lvbklkfScsIHNlc3Npb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBzZXNzaW9uXG4gICAgICpcbiAgICAgKiBVc2UgdGhpcyBlbmRwb2ludCB0byBleHRlbmQgYSBzZXNzaW9uJiMwMzk7cyBsZW5ndGguIEV4dGVuZGluZyBhIHNlc3Npb24gaXMgdXNlZnVsIHdoZW4gc2Vzc2lvbiBleHBpcnkgaXMgc2hvcnQuIElmIHRoZSBzZXNzaW9uIHdhcyBjcmVhdGVkIHVzaW5nIGFuIE9BdXRoIHByb3ZpZGVyLCB0aGlzIGVuZHBvaW50IHJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIGZyb20gdGhlIHByb3ZpZGVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25JZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5TZXNzaW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2Vzc2lvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJzZXNzaW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc2Vzc2lvbnMve3Nlc3Npb25JZH0nLnJlcGxhY2UoJ3tzZXNzaW9uSWR9Jywgc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgc2Vzc2lvblxuICAgICAqXG4gICAgICogTG9nb3V0IHRoZSB1c2VyLiBVc2UgJiMwMzk7Y3VycmVudCYjMDM5OyBhcyB0aGUgc2Vzc2lvbiBJRCB0byBsb2dvdXQgb24gdGhpcyBkZXZpY2UsIHVzZSBhIHNlc3Npb24gSUQgdG8gbG9nb3V0IG9uIGFub3RoZXIgZGV2aWNlLiBJZiB5b3UmIzAzOTtyZSBsb29raW5nIHRvIGxvZ291dCB0aGUgdXNlciBvbiBhbGwgZGV2aWNlcywgdXNlIFtEZWxldGUgU2Vzc2lvbnNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCNkZWxldGVTZXNzaW9ucykgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlU2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXNzaW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInNlc3Npb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC9zZXNzaW9ucy97c2Vzc2lvbklkfScucmVwbGFjZSgne3Nlc3Npb25JZH0nLCBzZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgc3RhdHVzXG4gICAgICpcbiAgICAgKiBCbG9jayB0aGUgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VyIGFjY291bnQuIEJlaGluZCB0aGUgc2NlbmUsIHRoZSB1c2VyIHJlY29yZCBpcyBub3QgZGVsZXRlZCBidXQgcGVybWFuZW50bHkgYmxvY2tlZCBmcm9tIGFueSBhY2Nlc3MuIFRvIGNvbXBsZXRlbHkgZGVsZXRlIGEgdXNlciwgdXNlIHRoZSBVc2VycyBBUEkgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Vc2VyPFByZWZlcmVuY2VzPj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlU3RhdHVzPFQgZXh0ZW5kcyBQcmVmZXJlbmNlcz4oKTogUHJvbWlzZTxVc2VyPFQ+PiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvc3RhdHVzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgcHVzaCB0YXJnZXRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvdmlkZXJJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFRhcmdldD59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlUHVzaFRhcmdldCh0YXJnZXRJZDogc3RyaW5nLCBpZGVudGlmaWVyOiBzdHJpbmcsIHByb3ZpZGVySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFRhcmdldD4ge1xuICAgICAgICBpZiAodHlwZW9mIHRhcmdldElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0YXJnZXRJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpZGVudGlmaWVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJpZGVudGlmaWVyXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3RhcmdldHMvcHVzaCc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3RhcmdldElkJ10gPSB0YXJnZXRJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGlkZW50aWZpZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydpZGVudGlmaWVyJ10gPSBpZGVudGlmaWVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJvdmlkZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Byb3ZpZGVySWQnXSA9IHByb3ZpZGVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcHVzaCB0YXJnZXRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldElkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXJcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUYXJnZXQ+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVB1c2hUYXJnZXQodGFyZ2V0SWQ6IHN0cmluZywgaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUYXJnZXQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidGFyZ2V0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiaWRlbnRpZmllclwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC90YXJnZXRzL3t0YXJnZXRJZH0vcHVzaCcucmVwbGFjZSgne3RhcmdldElkfScsIHRhcmdldElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGlkZW50aWZpZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydpZGVudGlmaWVyJ10gPSBpZGVudGlmaWVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgcHVzaCB0YXJnZXRcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhcmdldElkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZVB1c2hUYXJnZXQodGFyZ2V0SWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidGFyZ2V0SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvdGFyZ2V0cy97dGFyZ2V0SWR9L3B1c2gnLnJlcGxhY2UoJ3t0YXJnZXRJZH0nLCB0YXJnZXRJZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBlbWFpbCB0b2tlbiAoT1RQKVxuICAgICAqXG4gICAgICogU2VuZHMgdGhlIHVzZXIgYW4gZW1haWwgd2l0aCBhIHNlY3JldCBrZXkgZm9yIGNyZWF0aW5nIGEgc2Vzc2lvbi4gSWYgdGhlIHByb3ZpZGVkIHVzZXIgSUQgaGFzIG5vdCBiZSByZWdpc3RlcmVkLCBhIG5ldyB1c2VyIHdpbGwgYmUgY3JlYXRlZC4gVXNlIHRoZSByZXR1cm5lZCB1c2VyIElEIGFuZCBzZWNyZXQgYW5kIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIFtQT1NUIC92MS9hY2NvdW50L3Nlc3Npb25zL3Rva2VuXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlU2Vzc2lvbikgZW5kcG9pbnQgdG8gY29tcGxldGUgdGhlIGxvZ2luIHByb2Nlc3MuIFRoZSBzZWNyZXQgc2VudCB0byB0aGUgdXNlciYjMDM5O3MgZW1haWwgaXMgdmFsaWQgZm9yIDE1IG1pbnV0ZXMuXG5cbkEgdXNlciBpcyBsaW1pdGVkIHRvIDEwIGFjdGl2ZSBzZXNzaW9ucyBhdCBhIHRpbWUgYnkgZGVmYXVsdC4gW0xlYXJuIG1vcmUgYWJvdXQgc2Vzc2lvbiBsaW1pdHNdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9hdXRoZW50aWNhdGlvbi1zZWN1cml0eSNsaW1pdHMpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcGhyYXNlXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRva2VuPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVFbWFpbFRva2VuKHVzZXJJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nLCBwaHJhc2U/OiBib29sZWFuKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVtYWlsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbWFpbFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC90b2tlbnMvZW1haWwnO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcklkJ10gPSB1c2VySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbWFpbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VtYWlsJ10gPSBlbWFpbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBocmFzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BocmFzZSddID0gcGhyYXNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG1hZ2ljIFVSTCB0b2tlblxuICAgICAqXG4gICAgICogU2VuZHMgdGhlIHVzZXIgYW4gZW1haWwgd2l0aCBhIHNlY3JldCBrZXkgZm9yIGNyZWF0aW5nIGEgc2Vzc2lvbi4gSWYgdGhlIHByb3ZpZGVkIHVzZXIgSUQgaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQsIGEgbmV3IHVzZXIgd2lsbCBiZSBjcmVhdGVkLiBXaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgbGluayBpbiB0aGUgZW1haWwsIHRoZSB1c2VyIGlzIHJlZGlyZWN0ZWQgYmFjayB0byB0aGUgVVJMIHlvdSBwcm92aWRlZCB3aXRoIHRoZSBzZWNyZXQga2V5IGFuZCB1c2VySWQgdmFsdWVzIGF0dGFjaGVkIHRvIHRoZSBVUkwgcXVlcnkgc3RyaW5nLiBVc2UgdGhlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIHRvIHN1Ym1pdCBhIHJlcXVlc3QgdG8gdGhlIFtQT1NUIC92MS9hY2NvdW50L3Nlc3Npb25zL3Rva2VuXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjY3JlYXRlU2Vzc2lvbikgZW5kcG9pbnQgdG8gY29tcGxldGUgdGhlIGxvZ2luIHByb2Nlc3MuIFRoZSBsaW5rIHNlbnQgdG8gdGhlIHVzZXImIzAzOTtzIGVtYWlsIGFkZHJlc3MgaXMgdmFsaWQgZm9yIDEgaG91ci4gSWYgeW91IGFyZSBvbiBhIG1vYmlsZSBkZXZpY2UgeW91IGNhbiBsZWF2ZSB0aGUgVVJMIHBhcmFtZXRlciBlbXB0eSwgc28gdGhhdCB0aGUgbG9naW4gY29tcGxldGlvbiB3aWxsIGJlIGhhbmRsZWQgYnkgeW91ciBBcHBjb25kYSBpbnN0YW5jZSBieSBkZWZhdWx0LlxuXG5BIHVzZXIgaXMgbGltaXRlZCB0byAxMCBhY3RpdmUgc2Vzc2lvbnMgYXQgYSB0aW1lIGJ5IGRlZmF1bHQuIFtMZWFybiBtb3JlIGFib3V0IHNlc3Npb24gbGltaXRzXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvYXV0aGVudGljYXRpb24tc2VjdXJpdHkjbGltaXRzKS5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbWFpbFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBocmFzZVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub2tlbj59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTWFnaWNVUkxUb2tlbih1c2VySWQ6IHN0cmluZywgZW1haWw6IHN0cmluZywgdXJsPzogc3RyaW5nLCBwaHJhc2U/OiBib29sZWFuKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVtYWlsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJlbWFpbFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC90b2tlbnMvbWFnaWMtdXJsJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3VzZXJJZCddID0gdXNlcklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW1haWwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbWFpbCddID0gZW1haWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1cmwnXSA9IHVybDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBocmFzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3BocmFzZSddID0gcGhyYXNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIE9BdXRoMiB0b2tlblxuICAgICAqXG4gICAgICogQWxsb3cgdGhlIHVzZXIgdG8gbG9naW4gdG8gdGhlaXIgYWNjb3VudCB1c2luZyB0aGUgT0F1dGgyIHByb3ZpZGVyIG9mIHRoZWlyIGNob2ljZS4gRWFjaCBPQXV0aDIgcHJvdmlkZXIgc2hvdWxkIGJlIGVuYWJsZWQgZnJvbSB0aGUgQXBwY29uZGEgY29uc29sZSBmaXJzdC4gVXNlIHRoZSBzdWNjZXNzIGFuZCBmYWlsdXJlIGFyZ3VtZW50cyB0byBwcm92aWRlIGEgcmVkaXJlY3QgVVJMJiMwMzk7cyBiYWNrIHRvIHlvdXIgYXBwIHdoZW4gbG9naW4gaXMgY29tcGxldGVkLiBcblxuSWYgYXV0aGVudGljYXRpb24gc3VjY2VlZHMsIGB1c2VySWRgIGFuZCBgc2VjcmV0YCBvZiBhIHRva2VuIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHN1Y2Nlc3MgVVJMIGFzIHF1ZXJ5IHBhcmFtZXRlcnMuIFRoZXNlIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBzZXNzaW9uIHVzaW5nIHRoZSBbQ3JlYXRlIHNlc3Npb25dKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCNjcmVhdGVTZXNzaW9uKSBlbmRwb2ludC5cblxuQSB1c2VyIGlzIGxpbWl0ZWQgdG8gMTAgYWN0aXZlIHNlc3Npb25zIGF0IGEgdGltZSBieSBkZWZhdWx0LiBbTGVhcm4gbW9yZSBhYm91dCBzZXNzaW9uIGxpbWl0c10oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL2F1dGhlbnRpY2F0aW9uLXNlY3VyaXR5I2xpbWl0cykuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09BdXRoUHJvdmlkZXJ9IHByb3ZpZGVyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZmFpbHVyZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHNjb3Blc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQgfCBzdHJpbmc+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZU9BdXRoMlRva2VuKHByb3ZpZGVyOiBPQXV0aFByb3ZpZGVyLCBzdWNjZXNzPzogc3RyaW5nLCBmYWlsdXJlPzogc3RyaW5nLCBzY29wZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZCB8IHN0cmluZz4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3ZpZGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJwcm92aWRlclwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC90b2tlbnMvb2F1dGgyL3twcm92aWRlcn0nLnJlcGxhY2UoJ3twcm92aWRlcn0nLCBwcm92aWRlcik7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBzdWNjZXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc3VjY2VzcyddID0gc3VjY2VzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGZhaWx1cmUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydmYWlsdXJlJ10gPSBmYWlsdXJlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2NvcGVzJ10gPSBzY29wZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWRbJ3Byb2plY3QnXSA9IHRoaXMuY2xpZW50LmNvbmZpZy5wcm9qZWN0O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhTZXJ2aWNlLmZsYXR0ZW4ocGF5bG9hZCkpKSB7XG4gICAgICAgICAgICB1cmkuc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3c/LmxvY2F0aW9uKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHVyaS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBwaG9uZSB0b2tlblxuICAgICAqXG4gICAgICogU2VuZHMgdGhlIHVzZXIgYW4gU01TIHdpdGggYSBzZWNyZXQga2V5IGZvciBjcmVhdGluZyBhIHNlc3Npb24uIElmIHRoZSBwcm92aWRlZCB1c2VyIElEIGhhcyBub3QgYmUgcmVnaXN0ZXJlZCwgYSBuZXcgdXNlciB3aWxsIGJlIGNyZWF0ZWQuIFVzZSB0aGUgcmV0dXJuZWQgdXNlciBJRCBhbmQgc2VjcmV0IGFuZCBzdWJtaXQgYSByZXF1ZXN0IHRvIHRoZSBbUE9TVCAvdjEvYWNjb3VudC9zZXNzaW9ucy90b2tlbl0oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL3JlZmVyZW5jZXMvY2xvdWQvY2xpZW50LXdlYi9hY2NvdW50I2NyZWF0ZVNlc3Npb24pIGVuZHBvaW50IHRvIGNvbXBsZXRlIHRoZSBsb2dpbiBwcm9jZXNzLiBUaGUgc2VjcmV0IHNlbnQgdG8gdGhlIHVzZXImIzAzOTtzIHBob25lIGlzIHZhbGlkIGZvciAxNSBtaW51dGVzLlxuXG5BIHVzZXIgaXMgbGltaXRlZCB0byAxMCBhY3RpdmUgc2Vzc2lvbnMgYXQgYSB0aW1lIGJ5IGRlZmF1bHQuIFtMZWFybiBtb3JlIGFib3V0IHNlc3Npb24gbGltaXRzXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvYXV0aGVudGljYXRpb24tc2VjdXJpdHkjbGltaXRzKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGhvbmVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuVG9rZW4+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVBob25lVG9rZW4odXNlcklkOiBzdHJpbmcsIHBob25lOiBzdHJpbmcpOiBQcm9taXNlPFRva2VuPiB7XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ1c2VySWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGhvbmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInBob25lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3Rva2Vucy9waG9uZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBob25lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncGhvbmUnXSA9IHBob25lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGVtYWlsIHZlcmlmaWNhdGlvblxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gc2VuZCBhIHZlcmlmaWNhdGlvbiBtZXNzYWdlIHRvIHlvdXIgdXNlciBlbWFpbCBhZGRyZXNzIHRvIGNvbmZpcm0gdGhleSBhcmUgdGhlIHZhbGlkIG93bmVycyBvZiB0aGF0IGFkZHJlc3MuIEJvdGggdGhlICoqdXNlcklkKiogYW5kICoqc2VjcmV0KiogYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGFzIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdGhlIFVSTCB5b3UgaGF2ZSBwcm92aWRlZCB0byBiZSBhdHRhY2hlZCB0byB0aGUgdmVyaWZpY2F0aW9uIGVtYWlsLiBUaGUgcHJvdmlkZWQgVVJMIHNob3VsZCByZWRpcmVjdCB0aGUgdXNlciBiYWNrIHRvIHlvdXIgYXBwIGFuZCBhbGxvdyB5b3UgdG8gY29tcGxldGUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGJ5IHZlcmlmeWluZyBib3RoIHRoZSAqKnVzZXJJZCoqIGFuZCAqKnNlY3JldCoqIHBhcmFtZXRlcnMuIExlYXJuIG1vcmUgYWJvdXQgaG93IHRvIFtjb21wbGV0ZSB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3NdKGh0dHBzOi8vYXBwY29uZGEuaW8vZG9jcy9yZWZlcmVuY2VzL2Nsb3VkL2NsaWVudC13ZWIvYWNjb3VudCN1cGRhdGVWZXJpZmljYXRpb24pLiBUaGUgdmVyaWZpY2F0aW9uIGxpbmsgc2VudCB0byB0aGUgdXNlciYjMDM5O3MgZW1haWwgYWRkcmVzcyBpcyB2YWxpZCBmb3IgNyBkYXlzLlxuXG5QbGVhc2Ugbm90ZSB0aGF0IGluIG9yZGVyIHRvIGF2b2lkIGEgW1JlZGlyZWN0IEF0dGFja10oaHR0cHM6Ly9naXRodWIuY29tL09XQVNQL0NoZWF0U2hlZXRTZXJpZXMvYmxvYi9tYXN0ZXIvY2hlYXRzaGVldHMvVW52YWxpZGF0ZWRfUmVkaXJlY3RzX2FuZF9Gb3J3YXJkc19DaGVhdF9TaGVldC5tZCksIHRoZSBvbmx5IHZhbGlkIHJlZGlyZWN0IFVSTHMgYXJlIHRoZSBvbmVzIGZyb20gZG9tYWlucyB5b3UgaGF2ZSBzZXQgd2hlbiBhZGRpbmcgeW91ciBwbGF0Zm9ybXMgaW4gdGhlIGNvbnNvbGUgaW50ZXJmYWNlLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRva2VuPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVWZXJpZmljYXRpb24odXJsOiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFByb21pc2U8VG9rZW4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInVybFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC92ZXJpZmljYXRpb24nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXJsICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXJsJ10gPSB1cmw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYm9keSddID0gYm9keTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBlbWFpbCB2ZXJpZmljYXRpb24gKGNvbmZpcm1hdGlvbilcbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNvbXBsZXRlIHRoZSB1c2VyIGVtYWlsIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBVc2UgYm90aCB0aGUgKip1c2VySWQqKiBhbmQgKipzZWNyZXQqKiBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhdHRhY2hlZCB0byB5b3VyIGFwcCBVUkwgdG8gdmVyaWZ5IHRoZSB1c2VyIGVtYWlsIG93bmVyc2hpcC4gSWYgY29uZmlybWVkIHRoaXMgcm91dGUgd2lsbCByZXR1cm4gYSAyMDAgc3RhdHVzIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub2tlbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVmVyaWZpY2F0aW9uKHVzZXJJZDogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IFByb21pc2U8VG9rZW4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInVzZXJJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWNyZXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInNlY3JldFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvYWNjb3VudC92ZXJpZmljYXRpb24nO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgdXNlcklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndXNlcklkJ10gPSB1c2VySWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWNyZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWNyZXQnXSA9IHNlY3JldDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwdXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWRcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHBob25lIHZlcmlmaWNhdGlvblxuICAgICAqXG4gICAgICogVXNlIHRoaXMgZW5kcG9pbnQgdG8gc2VuZCBhIHZlcmlmaWNhdGlvbiBTTVMgdG8gdGhlIGN1cnJlbnRseSBsb2dnZWQgaW4gdXNlci4gVGhpcyBlbmRwb2ludCBpcyBtZWFudCBmb3IgdXNlIGFmdGVyIHVwZGF0aW5nIGEgdXNlciYjMDM5O3MgcGhvbmUgbnVtYmVyIHVzaW5nIHRoZSBbYWNjb3VudFVwZGF0ZVBob25lXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjdXBkYXRlUGhvbmUpIGVuZHBvaW50LiBMZWFybiBtb3JlIGFib3V0IGhvdyB0byBbY29tcGxldGUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvcmVmZXJlbmNlcy9jbG91ZC9jbGllbnQtd2ViL2FjY291bnQjdXBkYXRlUGhvbmVWZXJpZmljYXRpb24pLiBUaGUgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlciYjMDM5O3MgcGhvbmUgbnVtYmVyIGlzIHZhbGlkIGZvciAxNSBtaW51dGVzLlxuICAgICAqXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLlRva2VuPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVQaG9uZVZlcmlmaWNhdGlvbigpOiBQcm9taXNlPFRva2VuPiB7XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2FjY291bnQvdmVyaWZpY2F0aW9uL3Bob25lJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBwaG9uZSB2ZXJpZmljYXRpb24gKGNvbmZpcm1hdGlvbilcbiAgICAgKlxuICAgICAqIFVzZSB0aGlzIGVuZHBvaW50IHRvIGNvbXBsZXRlIHRoZSB1c2VyIHBob25lIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBVc2UgdGhlICoqdXNlcklkKiogYW5kICoqc2VjcmV0KiogdGhhdCB3ZXJlIHNlbnQgdG8geW91ciB1c2VyJiMwMzk7cyBwaG9uZSBudW1iZXIgdG8gdmVyaWZ5IHRoZSB1c2VyIGVtYWlsIG93bmVyc2hpcC4gSWYgY29uZmlybWVkIHRoaXMgcm91dGUgd2lsbCByZXR1cm4gYSAyMDAgc3RhdHVzIGNvZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlY3JldFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Ub2tlbj59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUGhvbmVWZXJpZmljYXRpb24odXNlcklkOiBzdHJpbmcsIHNlY3JldDogc3RyaW5nKTogUHJvbWlzZTxUb2tlbj4ge1xuICAgICAgICBpZiAodHlwZW9mIHVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidXNlcklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwic2VjcmV0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9hY2NvdW50L3ZlcmlmaWNhdGlvbi9waG9uZSc7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiB1c2VySWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd1c2VySWQnXSA9IHVzZXJJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNlY3JldCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3NlY3JldCddID0gc2VjcmV0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZFxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
|