payload-auth 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/better-auth/adapter/index.d.ts +2 -2
- package/dist/better-auth/adapter/index.d.ts.map +1 -1
- package/dist/better-auth/adapter/index.js +115 -69
- package/dist/better-auth/adapter/transform/index.d.ts +22 -10
- package/dist/better-auth/adapter/transform/index.d.ts.map +1 -1
- package/dist/better-auth/adapter/transform/index.js +387 -96
- package/dist/better-auth/adapter/types.d.ts +2 -1
- package/dist/better-auth/adapter/types.d.ts.map +1 -1
- package/dist/better-auth/adapter/types.js +1 -1
- package/dist/better-auth/plugin/helpers/check-passkey-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/helpers/check-passkey-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/check-passkey-plugin.js +5 -0
- package/dist/better-auth/plugin/helpers/check-username-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/helpers/check-username-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/check-username-plugin.js +5 -0
- package/dist/better-auth/plugin/helpers/generate-verify-email-url.d.ts.map +1 -1
- package/dist/better-auth/plugin/helpers/generate-verify-email-url.js +8 -8
- package/dist/better-auth/plugin/helpers/get-admin-access.d.ts +8 -0
- package/dist/better-auth/plugin/helpers/get-admin-access.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-admin-access.js +22 -0
- package/dist/better-auth/plugin/helpers/get-admin-routes.d.ts +14 -0
- package/dist/better-auth/plugin/helpers/get-admin-routes.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-admin-routes.js +6 -0
- package/dist/better-auth/plugin/helpers/get-all-roles.d.ts +6 -0
- package/dist/better-auth/plugin/helpers/get-all-roles.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-all-roles.js +20 -0
- package/dist/better-auth/plugin/helpers/get-ip.d.ts +1 -1
- package/dist/better-auth/plugin/helpers/get-ip.d.ts.map +1 -1
- package/dist/better-auth/plugin/helpers/get-ip.js +14 -14
- package/dist/better-auth/plugin/helpers/get-requst-collection.d.ts +3 -0
- package/dist/better-auth/plugin/helpers/get-requst-collection.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/get-requst-collection.js +14 -0
- package/dist/better-auth/plugin/helpers/index.d.ts +1 -1
- package/dist/better-auth/plugin/helpers/index.js +2 -2
- package/dist/better-auth/plugin/{lib → helpers}/prepare-session-data.d.ts +3 -3
- package/dist/better-auth/plugin/helpers/prepare-session-data.d.ts.map +1 -0
- package/dist/better-auth/plugin/helpers/prepare-session-data.js +42 -0
- package/dist/better-auth/plugin/helpers/serialize-cookie.d.ts +4 -4
- package/dist/better-auth/plugin/helpers/serialize-cookie.d.ts.map +1 -1
- package/dist/better-auth/plugin/helpers/serialize-cookie.js +34 -34
- package/dist/better-auth/plugin/index.d.ts +7 -7
- package/dist/better-auth/plugin/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/index.js +145 -37
- package/dist/better-auth/plugin/{collections → lib/build-collections}/accounts/hooks/sync-password-to-user.d.ts +1 -1
- package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/hooks/sync-password-to-user.js +47 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/accounts/index.js +159 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-after-read.js +11 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/hooks/get-url-before-change.js +8 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/admin-invitations/index.js +107 -0
- package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/api-keys.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/api-keys.js +196 -0
- package/dist/better-auth/plugin/lib/build-collections/index.d.ts +12 -0
- package/dist/better-auth/plugin/lib/build-collections/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/index.js +96 -0
- package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/invitations.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/invitations.js +91 -0
- package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/jwks.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/jwks.js +43 -0
- package/dist/better-auth/plugin/lib/build-collections/members.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/members.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/members.js +71 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-access-tokens.js +98 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-applications.js +113 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/oauth-consents.js +67 -0
- package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/organizations.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/organizations.js +59 -0
- package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/passkeys.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/passkeys.js +108 -0
- package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts +8 -0
- package/dist/better-auth/plugin/lib/build-collections/sessions.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/sessions.js +123 -0
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/sso-providers.js +83 -0
- package/dist/better-auth/plugin/lib/build-collections/teams.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/teams.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/teams.js +45 -0
- package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts +6 -0
- package/dist/better-auth/plugin/lib/build-collections/two-factors.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/two-factors.js +56 -0
- package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts +8 -0
- package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/better-auth-strategy.js +52 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/forgot-password.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/forgot-password.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/forgot-password.js +96 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts +13 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/generate-invite-url.js +67 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/login.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/login.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/login.js +115 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/refresh-token.js +110 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/reset-password.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/reset-password.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/reset-password.js +62 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/send-invite-url.js +42 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/set-admin-role.js +79 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.d.ts +4 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/endpoints/signup.js +153 -0
- package/dist/better-auth/plugin/{collections → lib/build-collections}/users/hooks/after-login.d.ts +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-login.js +75 -0
- package/dist/better-auth/plugin/{collections → lib/build-collections}/users/hooks/after-logout.d.ts +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/after-logout.js +74 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-delete.js +45 -0
- package/dist/better-auth/plugin/{collections → lib/build-collections}/users/hooks/before-login.d.ts +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/before-login.js +18 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts +3 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/on-verified-change.js +14 -0
- package/dist/better-auth/plugin/{collections → lib/build-collections}/users/hooks/sync-account.d.ts +1 -1
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/hooks/sync-account.js +82 -0
- package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts +8 -0
- package/dist/better-auth/plugin/lib/build-collections/users/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/users/index.js +345 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts +8 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/get-timestamp-fields.js +31 -0
- package/dist/better-auth/plugin/lib/{payload-access.d.ts → build-collections/utils/payload-access.d.ts} +1 -1
- package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/utils/payload-access.js +64 -0
- package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts +7 -0
- package/dist/better-auth/plugin/lib/build-collections/verifications.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/build-collections/verifications.js +63 -0
- package/dist/better-auth/plugin/lib/{config.d.ts → constants.d.ts} +13 -1
- package/dist/better-auth/plugin/lib/constants.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/constants.js +56 -0
- package/dist/better-auth/plugin/lib/get-payload-auth.d.ts +2 -2
- package/dist/better-auth/plugin/lib/get-payload-auth.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/get-payload-auth.js +2 -2
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts +4 -4
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.js +26 -43
- package/dist/better-auth/plugin/lib/init-better-auth.d.ts +4 -3
- package/dist/better-auth/plugin/lib/init-better-auth.d.ts.map +1 -1
- package/dist/better-auth/plugin/lib/init-better-auth.js +7 -7
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts +3 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/admin-plugin.js +8 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts +2 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/api-key-plugin.js +17 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts +10 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/index.js +118 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts +2 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/oidc-plugin.js +58 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts +2 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/organizations-plugin.js +86 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts +2 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/passkey-plugin.js +17 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts +2 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/sso-plugin.js +17 -0
- package/dist/better-auth/plugin/lib/{ensure-password-set-before-create.d.ts → sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts} +1 -1
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/ensure-password-set-before-create.js +23 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/password.js +62 -0
- package/dist/better-auth/plugin/lib/{respect-save-to-jwt-fields-middleware.d.ts → sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts} +6 -6
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.d.ts.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-better-auth-options/utils/save-to-jwt-middleware.js +30 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts +8 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons/index.js +115 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons/index.scss +31 -0
- package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts +11 -0
- package/dist/better-auth/plugin/payload/components/admin-invite-button/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/admin-invite-button/index.js +196 -0
- package/dist/better-auth/plugin/payload/components/admin-invite-button/index.scss +131 -0
- package/dist/better-auth/plugin/payload/components/admin-social-provider-buttons/index.d.ts +14 -0
- package/dist/better-auth/plugin/payload/components/admin-social-provider-buttons/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/admin-social-provider-buttons/index.js +111 -0
- package/dist/better-auth/plugin/payload/components/admin-social-provider-buttons/index.scss +51 -0
- package/dist/better-auth/plugin/payload/components/form-header/index.d.ts +9 -0
- package/dist/better-auth/plugin/payload/components/form-header/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/form-header/index.js +23 -0
- package/dist/better-auth/plugin/payload/components/form-header/index.scss +8 -0
- package/dist/better-auth/plugin/payload/components/icons.d.ts +9 -0
- package/dist/better-auth/plugin/payload/components/icons.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/icons.js +437 -0
- package/dist/better-auth/plugin/payload/components/logo.d.ts +3 -2
- package/dist/better-auth/plugin/payload/components/logo.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/components/logo.js +22 -34
- package/dist/better-auth/plugin/payload/components/logout-button.d.ts +6 -0
- package/dist/better-auth/plugin/payload/components/logout-button.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/logout-button.js +27 -0
- package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts +7 -0
- package/dist/better-auth/plugin/payload/components/rsc-redirect.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/rsc-redirect.js +8 -0
- package/dist/better-auth/plugin/payload/components/styles.css +2 -2
- package/dist/better-auth/plugin/payload/components/token-field.d.ts +5 -0
- package/dist/better-auth/plugin/payload/components/token-field.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/components/token-field.js +30 -0
- package/dist/better-auth/plugin/payload/exports/client.d.ts +6 -3
- package/dist/better-auth/plugin/payload/exports/client.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/exports/client.js +7 -4
- package/dist/better-auth/plugin/payload/exports/rsc.d.ts +9 -5
- package/dist/better-auth/plugin/payload/exports/rsc.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/exports/rsc.js +10 -6
- package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts +3 -0
- package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/utils/generate-admin-invite-url.js +8 -0
- package/dist/better-auth/plugin/payload/utils/generate-metadata.d.ts +15 -0
- package/dist/better-auth/plugin/payload/utils/generate-metadata.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/utils/generate-metadata.js +74 -0
- package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts +2 -0
- package/dist/better-auth/plugin/payload/utils/get-safe-redirect.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/utils/get-safe-redirect.js +23 -0
- package/dist/better-auth/plugin/payload/views/admin-invite/client.d.ts +12 -0
- package/dist/better-auth/plugin/payload/views/admin-invite/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/admin-invite/client.js +92 -0
- package/dist/better-auth/plugin/payload/views/admin-invite/index.d.ts +11 -0
- package/dist/better-auth/plugin/payload/views/admin-invite/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/admin-invite/index.js +84 -0
- package/dist/better-auth/plugin/payload/views/admin-invite/index.scss +25 -0
- package/dist/better-auth/plugin/payload/views/create-first-admin/client.d.ts +14 -0
- package/dist/better-auth/plugin/payload/views/create-first-admin/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/create-first-admin/client.js +95 -0
- package/dist/better-auth/plugin/payload/views/create-first-admin/index.d.ts +10 -4
- package/dist/better-auth/plugin/payload/views/create-first-admin/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/views/create-first-admin/index.js +124 -92
- package/dist/better-auth/plugin/payload/views/create-first-admin/index.scss +29 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts +8 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/client.js +119 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts +9 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/index.js +69 -0
- package/dist/better-auth/plugin/payload/views/forgot-password/index.scss +0 -0
- package/dist/better-auth/plugin/payload/views/inactivity/index.d.ts +5 -0
- package/dist/better-auth/plugin/payload/views/inactivity/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/inactivity/index.js +12 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/login-field.d.ts +9 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/login-field.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/login-field.js +54 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/password/index.d.ts +1 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/password/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/password/index.js +121 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/password/index.scss +31 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/password/types.d.ts +56 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/password/types.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/login/form/fields/password/types.js +3 -0
- package/dist/better-auth/plugin/payload/views/login/form/index.d.ts +17 -0
- package/dist/better-auth/plugin/payload/views/login/form/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/login/form/index.js +137 -0
- package/dist/better-auth/plugin/payload/views/login/form/index.scss +23 -0
- package/dist/better-auth/plugin/payload/views/login/index.d.ts +10 -5
- package/dist/better-auth/plugin/payload/views/login/index.d.ts.map +1 -1
- package/dist/better-auth/plugin/payload/views/login/index.js +81 -61
- package/dist/better-auth/plugin/payload/views/login/index.scss +10 -0
- package/dist/better-auth/plugin/payload/views/logout/client.d.ts +8 -0
- package/dist/better-auth/plugin/payload/views/logout/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/logout/client.js +76 -0
- package/dist/better-auth/plugin/payload/views/logout/index.d.ts +8 -0
- package/dist/better-auth/plugin/payload/views/logout/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/logout/index.js +14 -0
- package/dist/better-auth/plugin/payload/views/logout/index.scss +0 -0
- package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts +7 -0
- package/dist/better-auth/plugin/payload/views/reset-password/client.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/reset-password/client.js +72 -0
- package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts +5 -0
- package/dist/better-auth/plugin/payload/views/reset-password/index.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/reset-password/index.js +81 -0
- package/dist/better-auth/plugin/payload/views/reset-password/index.scss +9 -0
- package/dist/better-auth/plugin/payload/views/reset-password/metadata.d.ts +3 -0
- package/dist/better-auth/plugin/payload/views/reset-password/metadata.d.ts.map +1 -0
- package/dist/better-auth/plugin/payload/views/reset-password/metadata.js +11 -0
- package/dist/better-auth/plugin/types.d.ts +170 -33
- package/dist/better-auth/plugin/types.d.ts.map +1 -1
- package/dist/better-auth/plugin/types.js +1 -1
- package/dist/clerk/plugin/components/sync-clerk-users-button.d.ts +1 -1
- package/dist/clerk/plugin/components/sync-clerk-users-button.d.ts.map +1 -1
- package/dist/clerk/utils/clerk-user.d.ts +0 -3
- package/dist/clerk/utils/clerk-user.d.ts.map +1 -1
- package/dist/clerk/utils/clerk-user.js +1 -3
- package/dist/clerk/utils/load-clerk-instance.d.ts +1 -1
- package/dist/clerk/utils/load-clerk-instance.d.ts.map +1 -1
- package/package.json +13 -13
- package/LICENSE.md +0 -17
- package/dist/better-auth/adapter/dev/bin/run.d.ts +0 -2
- package/dist/better-auth/adapter/dev/bin/run.d.ts.map +0 -1
- package/dist/better-auth/adapter/dev/bin/run.js +0 -64
- package/dist/better-auth/adapter/dev/bin/schema.d.ts +0 -23
- package/dist/better-auth/adapter/dev/bin/schema.d.ts.map +0 -1
- package/dist/better-auth/adapter/dev/bin/schema.js +0 -160
- package/dist/better-auth/adapter/dev/collections.d.ts +0 -4
- package/dist/better-auth/adapter/dev/collections.d.ts.map +0 -1
- package/dist/better-auth/adapter/dev/collections.js +0 -212
- package/dist/better-auth/adapter/dev/index.d.ts +0 -4
- package/dist/better-auth/adapter/dev/index.d.ts.map +0 -1
- package/dist/better-auth/adapter/dev/index.js +0 -168
- package/dist/better-auth/adapter/test/adapter.test.d.ts +0 -2
- package/dist/better-auth/adapter/test/adapter.test.d.ts.map +0 -1
- package/dist/better-auth/adapter/test/adapter.test.js +0 -181
- package/dist/better-auth/adapter/test/better-auth-adapter-test.d.ts +0 -8
- package/dist/better-auth/adapter/test/better-auth-adapter-test.d.ts.map +0 -1
- package/dist/better-auth/adapter/test/better-auth-adapter-test.js +0 -425
- package/dist/better-auth/adapter/test/schema.test.d.ts +0 -2
- package/dist/better-auth/adapter/test/schema.test.d.ts.map +0 -1
- package/dist/better-auth/adapter/test/schema.test.js +0 -796
- package/dist/better-auth/adapter/test/test_payload1/schema.d.ts +0 -24
- package/dist/better-auth/adapter/test/test_payload1/schema.d.ts.map +0 -1
- package/dist/better-auth/adapter/test/test_payload1/schema.js +0 -177
- package/dist/better-auth/adapter/test/test_payload2/schema.d.ts +0 -24
- package/dist/better-auth/adapter/test/test_payload2/schema.d.ts.map +0 -1
- package/dist/better-auth/adapter/test/test_payload2/schema.js +0 -167
- package/dist/better-auth/adapter/test/test_payload3/schema.d.ts +0 -24
- package/dist/better-auth/adapter/test/test_payload3/schema.d.ts.map +0 -1
- package/dist/better-auth/adapter/test/test_payload3/schema.js +0 -198
- package/dist/better-auth/plugin/collections/accounts/hooks/sync-password-to-user.d.ts.map +0 -1
- package/dist/better-auth/plugin/collections/accounts/hooks/sync-password-to-user.js +0 -47
- package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.d.ts +0 -7
- package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.d.ts.map +0 -1
- package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.js +0 -106
- package/dist/better-auth/plugin/collections/users/hooks/after-login.d.ts.map +0 -1
- package/dist/better-auth/plugin/collections/users/hooks/after-login.js +0 -71
- package/dist/better-auth/plugin/collections/users/hooks/after-logout.d.ts.map +0 -1
- package/dist/better-auth/plugin/collections/users/hooks/after-logout.js +0 -49
- package/dist/better-auth/plugin/collections/users/hooks/before-login.d.ts.map +0 -1
- package/dist/better-auth/plugin/collections/users/hooks/before-login.js +0 -18
- package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.d.ts +0 -6
- package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.d.ts.map +0 -1
- package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.js +0 -33
- package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.d.ts +0 -3
- package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.d.ts.map +0 -1
- package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.js +0 -14
- package/dist/better-auth/plugin/collections/users/hooks/sync-account.d.ts.map +0 -1
- package/dist/better-auth/plugin/collections/users/hooks/sync-account.js +0 -82
- package/dist/better-auth/plugin/lib/auth-strategy.d.ts +0 -9
- package/dist/better-auth/plugin/lib/auth-strategy.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/auth-strategy.js +0 -48
- package/dist/better-auth/plugin/lib/build-collection-configs.d.ts +0 -12
- package/dist/better-auth/plugin/lib/build-collection-configs.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/build-collection-configs.js +0 -1558
- package/dist/better-auth/plugin/lib/config.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/config.js +0 -44
- package/dist/better-auth/plugin/lib/ensure-password-set-before-create.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/ensure-password-set-before-create.js +0 -24
- package/dist/better-auth/plugin/lib/password.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/password.js +0 -63
- package/dist/better-auth/plugin/lib/payload-access.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/payload-access.js +0 -64
- package/dist/better-auth/plugin/lib/prepare-session-data.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/prepare-session-data.js +0 -42
- package/dist/better-auth/plugin/lib/respect-save-to-jwt-fields-middleware.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/respect-save-to-jwt-fields-middleware.js +0 -30
- package/dist/better-auth/plugin/lib/sanitize-auth-options.d.ts +0 -6
- package/dist/better-auth/plugin/lib/sanitize-auth-options.d.ts.map +0 -1
- package/dist/better-auth/plugin/lib/sanitize-auth-options.js +0 -298
- package/dist/better-auth/plugin/payload/components/admin-buttons.d.ts +0 -7
- package/dist/better-auth/plugin/payload/components/admin-buttons.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/admin-buttons.js +0 -219
- package/dist/better-auth/plugin/payload/components/login-redirect.d.ts +0 -2
- package/dist/better-auth/plugin/payload/components/login-redirect.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/login-redirect.js +0 -6
- package/dist/better-auth/plugin/payload/components/logout.d.ts +0 -3
- package/dist/better-auth/plugin/payload/components/logout.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/logout.js +0 -61
- package/dist/better-auth/plugin/payload/components/sign-in.d.ts +0 -4
- package/dist/better-auth/plugin/payload/components/sign-in.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/sign-in.js +0 -384
- package/dist/better-auth/plugin/payload/components/sign-up.d.ts +0 -7
- package/dist/better-auth/plugin/payload/components/sign-up.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/sign-up.js +0 -503
- package/dist/better-auth/plugin/payload/components/ui/button.d.ts +0 -11
- package/dist/better-auth/plugin/payload/components/ui/button.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/ui/button.js +0 -42
- package/dist/better-auth/plugin/payload/components/ui/card.d.ts +0 -10
- package/dist/better-auth/plugin/payload/components/ui/card.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/ui/card.js +0 -55
- package/dist/better-auth/plugin/payload/components/ui/checkbox.d.ts +0 -5
- package/dist/better-auth/plugin/payload/components/ui/checkbox.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/ui/checkbox.js +0 -23
- package/dist/better-auth/plugin/payload/components/ui/cn.d.ts +0 -3
- package/dist/better-auth/plugin/payload/components/ui/cn.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/ui/cn.js +0 -7
- package/dist/better-auth/plugin/payload/components/ui/input.d.ts +0 -4
- package/dist/better-auth/plugin/payload/components/ui/input.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/ui/input.js +0 -14
- package/dist/better-auth/plugin/payload/components/ui/label.d.ts +0 -5
- package/dist/better-auth/plugin/payload/components/ui/label.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/ui/label.js +0 -15
- package/dist/better-auth/plugin/payload/components/ui/password-input.d.ts +0 -3
- package/dist/better-auth/plugin/payload/components/ui/password-input.d.ts.map +0 -1
- package/dist/better-auth/plugin/payload/components/ui/password-input.js +0 -55
- /package/dist/better-auth/plugin/lib/{password.d.ts → sanitize-better-auth-options/utils/password.d.ts} +0 -0
|
@@ -1,1558 +0,0 @@
|
|
|
1
|
-
import { baseCollectionSlugs, betterAuthPluginSlugs } from './config';
|
|
2
|
-
import { betterAuthStrategy } from './auth-strategy';
|
|
3
|
-
import { getAfterLogoutHook } from '../collections/users/hooks/after-logout';
|
|
4
|
-
import { getRefreshTokenEndpoint } from '../collections/users/endpoints/refresh-token';
|
|
5
|
-
import { isAdminOrCurrentUserUpdateWithAllowedFields, isAdminOrCurrentUserWithRoles, isAdminWithRoles } from './payload-access';
|
|
6
|
-
import { cleanUpUserAfterDelete } from '../collections/users/hooks/clean-up-user-after-delete';
|
|
7
|
-
import { getSyncPasswordToUserHook } from '../collections/accounts/hooks/sync-password-to-user';
|
|
8
|
-
import { getSyncAccountHook } from '../collections/users/hooks/sync-account';
|
|
9
|
-
import { onVerifiedChange } from '../collections/users/hooks/on-verified-change';
|
|
10
|
-
import { getAfterLoginHook } from '../collections/users/hooks/after-login';
|
|
11
|
-
import { getBeforeLoginHook } from '../collections/users/hooks/before-login';
|
|
12
|
-
/**
|
|
13
|
-
* Builds the required collections based on the BetterAuth options and plugins
|
|
14
|
-
*/ export function buildCollectionConfigs({ incomingCollections, requiredCollectionSlugs, pluginOptions, sanitizedBAOptions }) {
|
|
15
|
-
const userSlug = pluginOptions.users?.slug ?? baseCollectionSlugs.users;
|
|
16
|
-
const accountSlug = pluginOptions.accounts?.slug ?? baseCollectionSlugs.accounts;
|
|
17
|
-
const sessionSlug = pluginOptions.sessions?.slug ?? baseCollectionSlugs.sessions;
|
|
18
|
-
const verificationSlug = pluginOptions.verifications?.slug ?? baseCollectionSlugs.verifications;
|
|
19
|
-
const baPlugins = sanitizedBAOptions.plugins ?? null;
|
|
20
|
-
const adminRoles = pluginOptions.users?.adminRoles ?? [
|
|
21
|
-
'admin'
|
|
22
|
-
];
|
|
23
|
-
const getTimestampFields = ({ saveUpdatedAtToJWT = true, saveCreatedAtToJWT = true } = {})=>{
|
|
24
|
-
return [
|
|
25
|
-
{
|
|
26
|
-
name: 'updatedAt',
|
|
27
|
-
type: 'date',
|
|
28
|
-
saveToJWT: saveUpdatedAtToJWT,
|
|
29
|
-
admin: {
|
|
30
|
-
disableBulkEdit: true,
|
|
31
|
-
hidden: true
|
|
32
|
-
},
|
|
33
|
-
index: true,
|
|
34
|
-
label: ({ t })=>t('general:updatedAt')
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: 'createdAt',
|
|
38
|
-
saveToJWT: saveCreatedAtToJWT,
|
|
39
|
-
admin: {
|
|
40
|
-
disableBulkEdit: true,
|
|
41
|
-
hidden: true
|
|
42
|
-
},
|
|
43
|
-
type: 'date',
|
|
44
|
-
index: true,
|
|
45
|
-
label: ({ t })=>t('general:createdAt')
|
|
46
|
-
}
|
|
47
|
-
];
|
|
48
|
-
};
|
|
49
|
-
const enhancedCollections = [];
|
|
50
|
-
requiredCollectionSlugs.forEach((slug)=>{
|
|
51
|
-
switch(slug){
|
|
52
|
-
case baseCollectionSlugs.users:
|
|
53
|
-
const existingUserCollection = incomingCollections.find((collection)=>collection.slug === userSlug);
|
|
54
|
-
const allowedFields = pluginOptions.users?.allowedFields ?? [
|
|
55
|
-
'name'
|
|
56
|
-
];
|
|
57
|
-
let usersCollection = {
|
|
58
|
-
...existingUserCollection,
|
|
59
|
-
slug: userSlug,
|
|
60
|
-
admin: {
|
|
61
|
-
defaultColumns: [
|
|
62
|
-
'email'
|
|
63
|
-
],
|
|
64
|
-
useAsTitle: 'email',
|
|
65
|
-
...existingUserCollection?.admin,
|
|
66
|
-
hidden: pluginOptions.users?.hidden ?? false
|
|
67
|
-
},
|
|
68
|
-
access: {
|
|
69
|
-
admin: ({ req })=>adminRoles.includes(req.user?.role ?? 'user'),
|
|
70
|
-
read: isAdminOrCurrentUserWithRoles({
|
|
71
|
-
adminRoles,
|
|
72
|
-
idField: 'id'
|
|
73
|
-
}),
|
|
74
|
-
create: isAdminWithRoles({
|
|
75
|
-
adminRoles
|
|
76
|
-
}),
|
|
77
|
-
delete: isAdminOrCurrentUserWithRoles({
|
|
78
|
-
adminRoles,
|
|
79
|
-
idField: 'id'
|
|
80
|
-
}),
|
|
81
|
-
update: isAdminOrCurrentUserUpdateWithAllowedFields({
|
|
82
|
-
allowedFields,
|
|
83
|
-
adminRoles,
|
|
84
|
-
userSlug
|
|
85
|
-
}),
|
|
86
|
-
...existingUserCollection?.access ?? {}
|
|
87
|
-
},
|
|
88
|
-
endpoints: [
|
|
89
|
-
...existingUserCollection?.endpoints ? existingUserCollection.endpoints : [],
|
|
90
|
-
getRefreshTokenEndpoint({
|
|
91
|
-
userSlug
|
|
92
|
-
})
|
|
93
|
-
],
|
|
94
|
-
hooks: {
|
|
95
|
-
beforeChange: [
|
|
96
|
-
...existingUserCollection?.hooks?.beforeChange ?? [],
|
|
97
|
-
onVerifiedChange
|
|
98
|
-
],
|
|
99
|
-
afterChange: [
|
|
100
|
-
...existingUserCollection?.hooks?.afterChange ?? [],
|
|
101
|
-
getSyncAccountHook({
|
|
102
|
-
userSlug,
|
|
103
|
-
accountSlug
|
|
104
|
-
})
|
|
105
|
-
],
|
|
106
|
-
beforeLogin: [
|
|
107
|
-
...existingUserCollection?.hooks?.beforeLogin ?? [],
|
|
108
|
-
getBeforeLoginHook()
|
|
109
|
-
],
|
|
110
|
-
afterLogin: [
|
|
111
|
-
...existingUserCollection?.hooks?.afterLogin ?? [],
|
|
112
|
-
getAfterLoginHook({
|
|
113
|
-
sessionsCollectionSlug: sessionSlug,
|
|
114
|
-
usersCollectionSlug: userSlug
|
|
115
|
-
})
|
|
116
|
-
],
|
|
117
|
-
afterLogout: [
|
|
118
|
-
...existingUserCollection?.hooks?.afterLogout ?? [],
|
|
119
|
-
getAfterLogoutHook({
|
|
120
|
-
sessionsCollectionSlug: sessionSlug
|
|
121
|
-
})
|
|
122
|
-
],
|
|
123
|
-
afterDelete: [
|
|
124
|
-
...existingUserCollection?.hooks?.afterDelete ?? [],
|
|
125
|
-
(args)=>cleanUpUserAfterDelete(args)
|
|
126
|
-
]
|
|
127
|
-
},
|
|
128
|
-
auth: {
|
|
129
|
-
...existingUserCollection && typeof existingUserCollection.auth === 'object' ? existingUserCollection.auth : {},
|
|
130
|
-
//disableLocalStrategy: false,
|
|
131
|
-
strategies: [
|
|
132
|
-
betterAuthStrategy(adminRoles, userSlug)
|
|
133
|
-
]
|
|
134
|
-
},
|
|
135
|
-
fields: [
|
|
136
|
-
...existingUserCollection?.fields ?? [],
|
|
137
|
-
{
|
|
138
|
-
name: 'betterAuthAdminButtons',
|
|
139
|
-
type: 'ui',
|
|
140
|
-
admin: {
|
|
141
|
-
position: 'sidebar',
|
|
142
|
-
components: {
|
|
143
|
-
Field: {
|
|
144
|
-
path: 'payload-auth/better-auth/plugin/client#AdminButtons',
|
|
145
|
-
clientProps: ()=>{
|
|
146
|
-
return {
|
|
147
|
-
userSlug
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
condition: ()=>{
|
|
153
|
-
// Only show the impersonate button if the admin plugin is enabled
|
|
154
|
-
return (baPlugins && baPlugins.some((plugin)=>plugin.id === 'admin')) ?? false;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
},
|
|
158
|
-
{
|
|
159
|
-
name: 'name',
|
|
160
|
-
type: 'text',
|
|
161
|
-
label: 'Name',
|
|
162
|
-
saveToJWT: true,
|
|
163
|
-
admin: {
|
|
164
|
-
description: 'Users chosen display name'
|
|
165
|
-
}
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
name: 'email',
|
|
169
|
-
type: 'text',
|
|
170
|
-
required: true,
|
|
171
|
-
unique: true,
|
|
172
|
-
index: true,
|
|
173
|
-
label: 'Email',
|
|
174
|
-
admin: {
|
|
175
|
-
description: 'The email of the user'
|
|
176
|
-
}
|
|
177
|
-
},
|
|
178
|
-
{
|
|
179
|
-
name: 'emailVerified',
|
|
180
|
-
type: 'checkbox',
|
|
181
|
-
required: true,
|
|
182
|
-
defaultValue: false,
|
|
183
|
-
saveToJWT: true,
|
|
184
|
-
label: 'Email Verified',
|
|
185
|
-
admin: {
|
|
186
|
-
description: 'Whether the email of the user has been verified'
|
|
187
|
-
}
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
name: 'image',
|
|
191
|
-
type: 'text',
|
|
192
|
-
label: 'Image',
|
|
193
|
-
saveToJWT: true,
|
|
194
|
-
admin: {
|
|
195
|
-
description: 'The image of the user'
|
|
196
|
-
}
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
name: 'role',
|
|
200
|
-
type: 'select',
|
|
201
|
-
required: true,
|
|
202
|
-
defaultValue: 'user',
|
|
203
|
-
saveToJWT: true,
|
|
204
|
-
options: [
|
|
205
|
-
...(pluginOptions.users?.roles ?? [
|
|
206
|
-
{
|
|
207
|
-
label: 'Admin',
|
|
208
|
-
value: 'admin'
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
label: 'User',
|
|
212
|
-
value: 'user'
|
|
213
|
-
}
|
|
214
|
-
]).map((role)=>{
|
|
215
|
-
if (typeof role === 'string') {
|
|
216
|
-
return {
|
|
217
|
-
label: role.charAt(0).toUpperCase() + role.slice(1),
|
|
218
|
-
value: role
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
return role;
|
|
222
|
-
})
|
|
223
|
-
],
|
|
224
|
-
label: 'Role',
|
|
225
|
-
admin: {
|
|
226
|
-
description: 'The role of the user'
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
...getTimestampFields({
|
|
230
|
-
saveUpdatedAtToJWT: false,
|
|
231
|
-
saveCreatedAtToJWT: false
|
|
232
|
-
})
|
|
233
|
-
]
|
|
234
|
-
};
|
|
235
|
-
if (baPlugins) {
|
|
236
|
-
baPlugins.forEach((plugin)=>{
|
|
237
|
-
switch(plugin.id){
|
|
238
|
-
case 'two-factor':
|
|
239
|
-
usersCollection.fields.push({
|
|
240
|
-
name: 'twoFactorEnabled',
|
|
241
|
-
type: 'checkbox',
|
|
242
|
-
defaultValue: false,
|
|
243
|
-
label: 'Two Factor Enabled',
|
|
244
|
-
admin: {
|
|
245
|
-
description: 'Whether the user has two factor authentication enabled'
|
|
246
|
-
}
|
|
247
|
-
});
|
|
248
|
-
break;
|
|
249
|
-
case 'username':
|
|
250
|
-
usersCollection.fields.push({
|
|
251
|
-
name: 'username',
|
|
252
|
-
type: 'text',
|
|
253
|
-
unique: true,
|
|
254
|
-
required: false,
|
|
255
|
-
label: 'Username',
|
|
256
|
-
admin: {
|
|
257
|
-
description: 'The username of the user'
|
|
258
|
-
}
|
|
259
|
-
}, {
|
|
260
|
-
name: 'displayUsername',
|
|
261
|
-
type: 'text',
|
|
262
|
-
required: true,
|
|
263
|
-
label: 'Display Username',
|
|
264
|
-
admin: {
|
|
265
|
-
description: 'The display username of the user'
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
break;
|
|
269
|
-
case 'anonymous':
|
|
270
|
-
usersCollection.fields.push({
|
|
271
|
-
name: 'isAnonymous',
|
|
272
|
-
type: 'checkbox',
|
|
273
|
-
defaultValue: false,
|
|
274
|
-
label: 'Is Anonymous',
|
|
275
|
-
admin: {
|
|
276
|
-
description: 'Whether the user is anonymous.'
|
|
277
|
-
}
|
|
278
|
-
});
|
|
279
|
-
break;
|
|
280
|
-
case 'phone-number':
|
|
281
|
-
usersCollection.fields.push({
|
|
282
|
-
name: 'phoneNumber',
|
|
283
|
-
type: 'text',
|
|
284
|
-
label: 'Phone Number',
|
|
285
|
-
admin: {
|
|
286
|
-
description: 'The phone number of the user'
|
|
287
|
-
}
|
|
288
|
-
}, {
|
|
289
|
-
name: 'phoneNumberVerified',
|
|
290
|
-
type: 'checkbox',
|
|
291
|
-
defaultValue: false,
|
|
292
|
-
label: 'Phone Number Verified',
|
|
293
|
-
admin: {
|
|
294
|
-
description: 'Whether the phone number of the user has been verified'
|
|
295
|
-
}
|
|
296
|
-
});
|
|
297
|
-
break;
|
|
298
|
-
case 'admin':
|
|
299
|
-
usersCollection.fields.push({
|
|
300
|
-
name: 'banned',
|
|
301
|
-
type: 'checkbox',
|
|
302
|
-
defaultValue: false,
|
|
303
|
-
label: 'Banned',
|
|
304
|
-
admin: {
|
|
305
|
-
description: 'Whether the user is banned from the platform'
|
|
306
|
-
}
|
|
307
|
-
}, {
|
|
308
|
-
name: 'banReason',
|
|
309
|
-
type: 'text',
|
|
310
|
-
label: 'Ban Reason',
|
|
311
|
-
admin: {
|
|
312
|
-
description: 'The reason for the ban'
|
|
313
|
-
}
|
|
314
|
-
}, {
|
|
315
|
-
name: 'banExpires',
|
|
316
|
-
type: 'date',
|
|
317
|
-
label: 'Ban Expires',
|
|
318
|
-
admin: {
|
|
319
|
-
description: 'The date and time when the ban will expire'
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
break;
|
|
323
|
-
case 'harmony-email':
|
|
324
|
-
usersCollection.fields.push({
|
|
325
|
-
name: 'normalizedEmail',
|
|
326
|
-
type: 'text',
|
|
327
|
-
required: false,
|
|
328
|
-
unique: true,
|
|
329
|
-
admin: {
|
|
330
|
-
readOnly: true,
|
|
331
|
-
description: 'The normalized email of the user'
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
break;
|
|
335
|
-
default:
|
|
336
|
-
break;
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
if (pluginOptions.users?.collectionOverrides) {
|
|
341
|
-
usersCollection = pluginOptions.users.collectionOverrides({
|
|
342
|
-
collection: usersCollection
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
enhancedCollections.push(usersCollection);
|
|
346
|
-
break;
|
|
347
|
-
case baseCollectionSlugs.accounts:
|
|
348
|
-
const existingAccountCollection = incomingCollections.find((collection)=>collection.slug === accountSlug);
|
|
349
|
-
let accountCollection = {
|
|
350
|
-
slug: accountSlug,
|
|
351
|
-
admin: {
|
|
352
|
-
useAsTitle: 'accountId',
|
|
353
|
-
description: 'Accounts are used to store user accounts for authentication providers',
|
|
354
|
-
...existingAccountCollection?.admin,
|
|
355
|
-
hidden: pluginOptions.accounts?.hidden
|
|
356
|
-
},
|
|
357
|
-
hooks: {
|
|
358
|
-
afterChange: [
|
|
359
|
-
...existingAccountCollection?.hooks?.afterChange ?? [],
|
|
360
|
-
getSyncPasswordToUserHook({
|
|
361
|
-
userSlug,
|
|
362
|
-
accountSlug
|
|
363
|
-
})
|
|
364
|
-
]
|
|
365
|
-
},
|
|
366
|
-
access: {
|
|
367
|
-
create: isAdminWithRoles({
|
|
368
|
-
adminRoles
|
|
369
|
-
}),
|
|
370
|
-
delete: isAdminWithRoles({
|
|
371
|
-
adminRoles
|
|
372
|
-
}),
|
|
373
|
-
read: isAdminOrCurrentUserWithRoles({
|
|
374
|
-
adminRoles,
|
|
375
|
-
idField: 'user'
|
|
376
|
-
}),
|
|
377
|
-
update: isAdminWithRoles({
|
|
378
|
-
adminRoles
|
|
379
|
-
}),
|
|
380
|
-
...existingAccountCollection?.access ?? {}
|
|
381
|
-
},
|
|
382
|
-
fields: [
|
|
383
|
-
...existingAccountCollection?.fields ?? [],
|
|
384
|
-
{
|
|
385
|
-
name: 'user',
|
|
386
|
-
type: 'relationship',
|
|
387
|
-
relationTo: userSlug,
|
|
388
|
-
required: true,
|
|
389
|
-
index: true,
|
|
390
|
-
label: 'User',
|
|
391
|
-
admin: {
|
|
392
|
-
readOnly: true,
|
|
393
|
-
description: 'The user that the account belongs to'
|
|
394
|
-
}
|
|
395
|
-
},
|
|
396
|
-
{
|
|
397
|
-
name: 'accountId',
|
|
398
|
-
type: 'text',
|
|
399
|
-
label: 'Account ID',
|
|
400
|
-
required: true,
|
|
401
|
-
index: true,
|
|
402
|
-
admin: {
|
|
403
|
-
readOnly: true,
|
|
404
|
-
description: 'The id of the account as provided by the SSO or equal to userId for credential accounts'
|
|
405
|
-
}
|
|
406
|
-
},
|
|
407
|
-
{
|
|
408
|
-
name: 'providerId',
|
|
409
|
-
type: 'text',
|
|
410
|
-
required: true,
|
|
411
|
-
label: 'Provider ID',
|
|
412
|
-
admin: {
|
|
413
|
-
readOnly: true,
|
|
414
|
-
description: 'The id of the provider as provided by the SSO'
|
|
415
|
-
}
|
|
416
|
-
},
|
|
417
|
-
{
|
|
418
|
-
name: 'accessToken',
|
|
419
|
-
type: 'text',
|
|
420
|
-
label: 'Access Token',
|
|
421
|
-
admin: {
|
|
422
|
-
readOnly: true,
|
|
423
|
-
description: 'The access token of the account. Returned by the provider'
|
|
424
|
-
}
|
|
425
|
-
},
|
|
426
|
-
{
|
|
427
|
-
name: 'refreshToken',
|
|
428
|
-
type: 'text',
|
|
429
|
-
label: 'Refresh Token',
|
|
430
|
-
admin: {
|
|
431
|
-
readOnly: true,
|
|
432
|
-
description: 'The refresh token of the account. Returned by the provider'
|
|
433
|
-
}
|
|
434
|
-
},
|
|
435
|
-
{
|
|
436
|
-
name: 'accessTokenExpiresAt',
|
|
437
|
-
type: 'date',
|
|
438
|
-
label: 'Access Token Expires At',
|
|
439
|
-
admin: {
|
|
440
|
-
readOnly: true,
|
|
441
|
-
description: 'The date and time when the access token will expire'
|
|
442
|
-
}
|
|
443
|
-
},
|
|
444
|
-
{
|
|
445
|
-
name: 'refreshTokenExpiresAt',
|
|
446
|
-
type: 'date',
|
|
447
|
-
label: 'Refresh Token Expires At',
|
|
448
|
-
admin: {
|
|
449
|
-
readOnly: true,
|
|
450
|
-
description: 'The date and time when the refresh token will expire'
|
|
451
|
-
}
|
|
452
|
-
},
|
|
453
|
-
{
|
|
454
|
-
name: 'scope',
|
|
455
|
-
type: 'text',
|
|
456
|
-
label: 'Scope',
|
|
457
|
-
admin: {
|
|
458
|
-
readOnly: true,
|
|
459
|
-
description: 'The scope of the account. Returned by the provider'
|
|
460
|
-
}
|
|
461
|
-
},
|
|
462
|
-
{
|
|
463
|
-
name: 'idToken',
|
|
464
|
-
type: 'text',
|
|
465
|
-
label: 'ID Token',
|
|
466
|
-
admin: {
|
|
467
|
-
readOnly: true,
|
|
468
|
-
description: 'The id token for the account. Returned by the provider'
|
|
469
|
-
}
|
|
470
|
-
},
|
|
471
|
-
{
|
|
472
|
-
name: 'password',
|
|
473
|
-
type: 'text',
|
|
474
|
-
label: 'Password',
|
|
475
|
-
admin: {
|
|
476
|
-
readOnly: true,
|
|
477
|
-
hidden: true,
|
|
478
|
-
description: 'The hashed password of the account. Mainly used for email and password authentication'
|
|
479
|
-
}
|
|
480
|
-
},
|
|
481
|
-
...getTimestampFields()
|
|
482
|
-
],
|
|
483
|
-
...existingAccountCollection
|
|
484
|
-
};
|
|
485
|
-
if (pluginOptions.accounts?.collectionOverrides) {
|
|
486
|
-
accountCollection = pluginOptions.accounts.collectionOverrides({
|
|
487
|
-
collection: accountCollection
|
|
488
|
-
});
|
|
489
|
-
}
|
|
490
|
-
enhancedCollections.push(accountCollection);
|
|
491
|
-
break;
|
|
492
|
-
case baseCollectionSlugs.sessions:
|
|
493
|
-
const existingSessionCollection = incomingCollections.find((collection)=>collection.slug === sessionSlug);
|
|
494
|
-
let sessionCollection = {
|
|
495
|
-
slug: sessionSlug,
|
|
496
|
-
admin: {
|
|
497
|
-
...existingSessionCollection?.admin,
|
|
498
|
-
hidden: pluginOptions.sessions?.hidden,
|
|
499
|
-
description: 'Sessions are active sessions for users. They are used to authenticate users with a session token'
|
|
500
|
-
},
|
|
501
|
-
fields: [
|
|
502
|
-
...existingSessionCollection?.fields ?? [],
|
|
503
|
-
{
|
|
504
|
-
name: 'user',
|
|
505
|
-
type: 'relationship',
|
|
506
|
-
relationTo: userSlug,
|
|
507
|
-
required: true,
|
|
508
|
-
saveToJWT: true,
|
|
509
|
-
index: true,
|
|
510
|
-
admin: {
|
|
511
|
-
readOnly: true,
|
|
512
|
-
description: 'The user that the session belongs to'
|
|
513
|
-
}
|
|
514
|
-
},
|
|
515
|
-
{
|
|
516
|
-
name: 'token',
|
|
517
|
-
type: 'text',
|
|
518
|
-
required: true,
|
|
519
|
-
unique: true,
|
|
520
|
-
index: true,
|
|
521
|
-
saveToJWT: true,
|
|
522
|
-
label: 'Token',
|
|
523
|
-
admin: {
|
|
524
|
-
description: 'The unique session token',
|
|
525
|
-
readOnly: true
|
|
526
|
-
}
|
|
527
|
-
},
|
|
528
|
-
{
|
|
529
|
-
name: 'expiresAt',
|
|
530
|
-
type: 'date',
|
|
531
|
-
required: true,
|
|
532
|
-
label: 'Expires At',
|
|
533
|
-
saveToJWT: true,
|
|
534
|
-
admin: {
|
|
535
|
-
description: 'The date and time when the session will expire',
|
|
536
|
-
readOnly: true
|
|
537
|
-
}
|
|
538
|
-
},
|
|
539
|
-
{
|
|
540
|
-
name: 'ipAddress',
|
|
541
|
-
type: 'text',
|
|
542
|
-
label: 'IP Address',
|
|
543
|
-
saveToJWT: true,
|
|
544
|
-
admin: {
|
|
545
|
-
description: 'The IP address of the device',
|
|
546
|
-
readOnly: true
|
|
547
|
-
}
|
|
548
|
-
},
|
|
549
|
-
{
|
|
550
|
-
name: 'userAgent',
|
|
551
|
-
type: 'text',
|
|
552
|
-
label: 'User Agent',
|
|
553
|
-
saveToJWT: true,
|
|
554
|
-
admin: {
|
|
555
|
-
description: 'The user agent information of the device',
|
|
556
|
-
readOnly: true
|
|
557
|
-
}
|
|
558
|
-
},
|
|
559
|
-
...getTimestampFields()
|
|
560
|
-
],
|
|
561
|
-
...existingSessionCollection
|
|
562
|
-
};
|
|
563
|
-
if (baPlugins) {
|
|
564
|
-
baPlugins.forEach((plugin)=>{
|
|
565
|
-
switch(plugin.id){
|
|
566
|
-
case 'admin':
|
|
567
|
-
sessionCollection.fields.push({
|
|
568
|
-
name: 'impersonatedBy',
|
|
569
|
-
type: 'relationship',
|
|
570
|
-
relationTo: userSlug,
|
|
571
|
-
required: false,
|
|
572
|
-
label: 'Impersonated By',
|
|
573
|
-
admin: {
|
|
574
|
-
readOnly: true,
|
|
575
|
-
description: 'The admin who is impersonating this session'
|
|
576
|
-
}
|
|
577
|
-
});
|
|
578
|
-
break;
|
|
579
|
-
case 'organization':
|
|
580
|
-
sessionCollection.fields.push({
|
|
581
|
-
name: 'activeOrganization',
|
|
582
|
-
type: 'relationship',
|
|
583
|
-
relationTo: betterAuthPluginSlugs.organizations,
|
|
584
|
-
label: 'Active Organization',
|
|
585
|
-
admin: {
|
|
586
|
-
readOnly: true,
|
|
587
|
-
description: 'The currently active organization for the session'
|
|
588
|
-
}
|
|
589
|
-
});
|
|
590
|
-
break;
|
|
591
|
-
default:
|
|
592
|
-
break;
|
|
593
|
-
}
|
|
594
|
-
});
|
|
595
|
-
}
|
|
596
|
-
if (pluginOptions.sessions?.collectionOverrides) {
|
|
597
|
-
sessionCollection = pluginOptions.sessions.collectionOverrides({
|
|
598
|
-
collection: sessionCollection
|
|
599
|
-
});
|
|
600
|
-
}
|
|
601
|
-
enhancedCollections.push(sessionCollection);
|
|
602
|
-
break;
|
|
603
|
-
case baseCollectionSlugs.verifications:
|
|
604
|
-
const existingVerificationCollection = incomingCollections.find((collection)=>collection.slug === verificationSlug);
|
|
605
|
-
const verificationCollection = {
|
|
606
|
-
slug: verificationSlug,
|
|
607
|
-
admin: {
|
|
608
|
-
...existingVerificationCollection?.admin,
|
|
609
|
-
hidden: pluginOptions.verifications?.hidden,
|
|
610
|
-
useAsTitle: 'identifier',
|
|
611
|
-
description: 'Verifications are used to verify authentication requests'
|
|
612
|
-
},
|
|
613
|
-
fields: [
|
|
614
|
-
...existingVerificationCollection?.fields ?? [],
|
|
615
|
-
{
|
|
616
|
-
name: 'identifier',
|
|
617
|
-
type: 'text',
|
|
618
|
-
required: true,
|
|
619
|
-
index: true,
|
|
620
|
-
label: 'Identifier',
|
|
621
|
-
admin: {
|
|
622
|
-
description: 'The identifier of the verification request',
|
|
623
|
-
readOnly: true
|
|
624
|
-
}
|
|
625
|
-
},
|
|
626
|
-
{
|
|
627
|
-
name: 'value',
|
|
628
|
-
type: 'text',
|
|
629
|
-
required: true,
|
|
630
|
-
label: 'Value',
|
|
631
|
-
admin: {
|
|
632
|
-
description: 'The value to be verified',
|
|
633
|
-
readOnly: true
|
|
634
|
-
}
|
|
635
|
-
},
|
|
636
|
-
{
|
|
637
|
-
name: 'expiresAt',
|
|
638
|
-
type: 'date',
|
|
639
|
-
required: true,
|
|
640
|
-
label: 'Expires At',
|
|
641
|
-
admin: {
|
|
642
|
-
description: 'The date and time when the verification request will expire',
|
|
643
|
-
readOnly: true
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
],
|
|
647
|
-
timestamps: true,
|
|
648
|
-
...existingVerificationCollection
|
|
649
|
-
};
|
|
650
|
-
enhancedCollections.push(verificationCollection);
|
|
651
|
-
break;
|
|
652
|
-
case betterAuthPluginSlugs.organizations:
|
|
653
|
-
const organizationCollection = {
|
|
654
|
-
slug: betterAuthPluginSlugs.organizations,
|
|
655
|
-
admin: {
|
|
656
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
657
|
-
useAsTitle: 'name',
|
|
658
|
-
description: 'Organizations are groups of users that share access to certain resources.'
|
|
659
|
-
},
|
|
660
|
-
fields: [
|
|
661
|
-
{
|
|
662
|
-
name: 'name',
|
|
663
|
-
type: 'text',
|
|
664
|
-
required: true,
|
|
665
|
-
label: 'Name',
|
|
666
|
-
admin: {
|
|
667
|
-
description: 'The name of the organization.'
|
|
668
|
-
}
|
|
669
|
-
},
|
|
670
|
-
{
|
|
671
|
-
name: 'slug',
|
|
672
|
-
type: 'text',
|
|
673
|
-
unique: true,
|
|
674
|
-
index: true,
|
|
675
|
-
label: 'Slug',
|
|
676
|
-
admin: {
|
|
677
|
-
description: 'The slug of the organization.'
|
|
678
|
-
}
|
|
679
|
-
},
|
|
680
|
-
{
|
|
681
|
-
name: 'logo',
|
|
682
|
-
type: 'text',
|
|
683
|
-
label: 'Logo',
|
|
684
|
-
admin: {
|
|
685
|
-
description: 'The logo of the organization.'
|
|
686
|
-
}
|
|
687
|
-
},
|
|
688
|
-
{
|
|
689
|
-
name: 'metadata',
|
|
690
|
-
type: 'json',
|
|
691
|
-
label: 'Metadata',
|
|
692
|
-
admin: {
|
|
693
|
-
description: 'Additional metadata for the organization.'
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
],
|
|
697
|
-
timestamps: true
|
|
698
|
-
};
|
|
699
|
-
enhancedCollections.push(organizationCollection);
|
|
700
|
-
break;
|
|
701
|
-
case betterAuthPluginSlugs.members:
|
|
702
|
-
const memberCollection = {
|
|
703
|
-
slug: betterAuthPluginSlugs.members,
|
|
704
|
-
admin: {
|
|
705
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
706
|
-
useAsTitle: 'organization',
|
|
707
|
-
description: 'Members of an organization.'
|
|
708
|
-
},
|
|
709
|
-
fields: [
|
|
710
|
-
{
|
|
711
|
-
name: 'organization',
|
|
712
|
-
type: 'relationship',
|
|
713
|
-
relationTo: betterAuthPluginSlugs.organizations,
|
|
714
|
-
required: true,
|
|
715
|
-
index: true,
|
|
716
|
-
label: 'Organization',
|
|
717
|
-
admin: {
|
|
718
|
-
readOnly: true,
|
|
719
|
-
description: 'The organization that the member belongs to.'
|
|
720
|
-
}
|
|
721
|
-
},
|
|
722
|
-
{
|
|
723
|
-
name: 'user',
|
|
724
|
-
type: 'relationship',
|
|
725
|
-
relationTo: userSlug,
|
|
726
|
-
required: true,
|
|
727
|
-
index: true,
|
|
728
|
-
label: 'User',
|
|
729
|
-
admin: {
|
|
730
|
-
readOnly: true,
|
|
731
|
-
description: 'The user that is a member of the organization.'
|
|
732
|
-
}
|
|
733
|
-
},
|
|
734
|
-
{
|
|
735
|
-
name: 'team',
|
|
736
|
-
type: 'relationship',
|
|
737
|
-
relationTo: betterAuthPluginSlugs.teams,
|
|
738
|
-
required: false,
|
|
739
|
-
label: 'Team',
|
|
740
|
-
admin: {
|
|
741
|
-
description: 'The team that the member belongs to.'
|
|
742
|
-
}
|
|
743
|
-
},
|
|
744
|
-
{
|
|
745
|
-
name: 'role',
|
|
746
|
-
type: 'text',
|
|
747
|
-
required: true,
|
|
748
|
-
defaultValue: 'member',
|
|
749
|
-
label: 'Role',
|
|
750
|
-
admin: {
|
|
751
|
-
description: 'The role of the member in the organization.'
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
],
|
|
755
|
-
timestamps: true
|
|
756
|
-
};
|
|
757
|
-
enhancedCollections.push(memberCollection);
|
|
758
|
-
break;
|
|
759
|
-
case betterAuthPluginSlugs.invitations:
|
|
760
|
-
const invitationCollection = {
|
|
761
|
-
slug: betterAuthPluginSlugs.invitations,
|
|
762
|
-
admin: {
|
|
763
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
764
|
-
useAsTitle: 'email',
|
|
765
|
-
description: 'Invitations to join an organization'
|
|
766
|
-
},
|
|
767
|
-
fields: [
|
|
768
|
-
{
|
|
769
|
-
name: 'email',
|
|
770
|
-
type: 'text',
|
|
771
|
-
required: true,
|
|
772
|
-
index: true,
|
|
773
|
-
label: 'Email',
|
|
774
|
-
admin: {
|
|
775
|
-
description: 'The email of the user being invited.',
|
|
776
|
-
readOnly: true
|
|
777
|
-
}
|
|
778
|
-
},
|
|
779
|
-
{
|
|
780
|
-
name: 'inviter',
|
|
781
|
-
type: 'relationship',
|
|
782
|
-
relationTo: userSlug,
|
|
783
|
-
required: true,
|
|
784
|
-
label: 'Inviter',
|
|
785
|
-
admin: {
|
|
786
|
-
description: 'The user who invited the user.',
|
|
787
|
-
readOnly: true
|
|
788
|
-
}
|
|
789
|
-
},
|
|
790
|
-
{
|
|
791
|
-
name: 'organization',
|
|
792
|
-
type: 'relationship',
|
|
793
|
-
relationTo: betterAuthPluginSlugs.organizations,
|
|
794
|
-
required: true,
|
|
795
|
-
index: true,
|
|
796
|
-
label: 'Organization',
|
|
797
|
-
admin: {
|
|
798
|
-
description: 'The organization that the user is being invited to.',
|
|
799
|
-
readOnly: true
|
|
800
|
-
}
|
|
801
|
-
},
|
|
802
|
-
{
|
|
803
|
-
name: 'role',
|
|
804
|
-
type: 'text',
|
|
805
|
-
required: true,
|
|
806
|
-
label: 'Role',
|
|
807
|
-
admin: {
|
|
808
|
-
description: 'The role of the user being invited.',
|
|
809
|
-
readOnly: true
|
|
810
|
-
}
|
|
811
|
-
},
|
|
812
|
-
{
|
|
813
|
-
name: 'status',
|
|
814
|
-
type: 'text',
|
|
815
|
-
required: true,
|
|
816
|
-
defaultValue: 'pending',
|
|
817
|
-
label: 'Status',
|
|
818
|
-
admin: {
|
|
819
|
-
description: 'The status of the invitation.',
|
|
820
|
-
readOnly: true
|
|
821
|
-
}
|
|
822
|
-
},
|
|
823
|
-
{
|
|
824
|
-
name: 'expiresAt',
|
|
825
|
-
type: 'date',
|
|
826
|
-
required: true,
|
|
827
|
-
label: 'Expires At',
|
|
828
|
-
admin: {
|
|
829
|
-
description: 'The date and time when the invitation will expire.',
|
|
830
|
-
readOnly: true
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
],
|
|
834
|
-
timestamps: true
|
|
835
|
-
};
|
|
836
|
-
enhancedCollections.push(invitationCollection);
|
|
837
|
-
break;
|
|
838
|
-
case betterAuthPluginSlugs.teams:
|
|
839
|
-
const teamCollection = {
|
|
840
|
-
slug: betterAuthPluginSlugs.teams,
|
|
841
|
-
admin: {
|
|
842
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
843
|
-
useAsTitle: 'name',
|
|
844
|
-
description: 'Teams are groups of users that share access to certain resources.'
|
|
845
|
-
},
|
|
846
|
-
fields: [
|
|
847
|
-
{
|
|
848
|
-
name: 'name',
|
|
849
|
-
type: 'text',
|
|
850
|
-
required: true,
|
|
851
|
-
label: 'Name',
|
|
852
|
-
admin: {
|
|
853
|
-
description: 'The name of the team.'
|
|
854
|
-
}
|
|
855
|
-
},
|
|
856
|
-
{
|
|
857
|
-
name: 'organization',
|
|
858
|
-
type: 'relationship',
|
|
859
|
-
relationTo: betterAuthPluginSlugs.organizations,
|
|
860
|
-
required: true,
|
|
861
|
-
label: 'Organization',
|
|
862
|
-
admin: {
|
|
863
|
-
readOnly: true,
|
|
864
|
-
description: 'The organization that the team belongs to.'
|
|
865
|
-
}
|
|
866
|
-
}
|
|
867
|
-
],
|
|
868
|
-
timestamps: true
|
|
869
|
-
};
|
|
870
|
-
enhancedCollections.push(teamCollection);
|
|
871
|
-
break;
|
|
872
|
-
case betterAuthPluginSlugs.jwks:
|
|
873
|
-
const jwksCollection = {
|
|
874
|
-
slug: betterAuthPluginSlugs.jwks,
|
|
875
|
-
admin: {
|
|
876
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
877
|
-
useAsTitle: 'publicKey',
|
|
878
|
-
description: 'JWKS are used to verify the signature of the JWT token'
|
|
879
|
-
},
|
|
880
|
-
fields: [
|
|
881
|
-
{
|
|
882
|
-
name: 'publicKey',
|
|
883
|
-
type: 'text',
|
|
884
|
-
required: true,
|
|
885
|
-
index: true,
|
|
886
|
-
label: 'Public Key',
|
|
887
|
-
admin: {
|
|
888
|
-
description: 'The public part of the web key'
|
|
889
|
-
}
|
|
890
|
-
},
|
|
891
|
-
{
|
|
892
|
-
name: 'privateKey',
|
|
893
|
-
type: 'text',
|
|
894
|
-
required: true,
|
|
895
|
-
label: 'Private Key',
|
|
896
|
-
admin: {
|
|
897
|
-
description: 'The private part of the web key'
|
|
898
|
-
}
|
|
899
|
-
}
|
|
900
|
-
],
|
|
901
|
-
timestamps: true
|
|
902
|
-
};
|
|
903
|
-
enhancedCollections.push(jwksCollection);
|
|
904
|
-
break;
|
|
905
|
-
case betterAuthPluginSlugs.apiKeys:
|
|
906
|
-
const apiKeyCollection = {
|
|
907
|
-
slug: betterAuthPluginSlugs.apiKeys,
|
|
908
|
-
admin: {
|
|
909
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
910
|
-
useAsTitle: 'name',
|
|
911
|
-
description: 'API keys are used to authenticate requests to the API.'
|
|
912
|
-
},
|
|
913
|
-
fields: [
|
|
914
|
-
{
|
|
915
|
-
name: 'name',
|
|
916
|
-
type: 'text',
|
|
917
|
-
label: 'Name',
|
|
918
|
-
admin: {
|
|
919
|
-
readOnly: true,
|
|
920
|
-
description: 'The name of the API key.'
|
|
921
|
-
}
|
|
922
|
-
},
|
|
923
|
-
{
|
|
924
|
-
name: 'start',
|
|
925
|
-
type: 'text',
|
|
926
|
-
label: 'Starting Characters',
|
|
927
|
-
admin: {
|
|
928
|
-
readOnly: true,
|
|
929
|
-
description: 'The starting characters of the API key. Useful for showing the first few characters of the API key in the UI for the users to easily identify.'
|
|
930
|
-
}
|
|
931
|
-
},
|
|
932
|
-
{
|
|
933
|
-
name: 'prefix',
|
|
934
|
-
type: 'text',
|
|
935
|
-
label: 'Prefix',
|
|
936
|
-
admin: {
|
|
937
|
-
readOnly: true,
|
|
938
|
-
description: 'The API Key prefix. Stored as plain text.'
|
|
939
|
-
}
|
|
940
|
-
},
|
|
941
|
-
{
|
|
942
|
-
name: 'key',
|
|
943
|
-
type: 'text',
|
|
944
|
-
required: true,
|
|
945
|
-
label: 'API Key',
|
|
946
|
-
admin: {
|
|
947
|
-
readOnly: true,
|
|
948
|
-
description: 'The hashed API key itself.'
|
|
949
|
-
}
|
|
950
|
-
},
|
|
951
|
-
{
|
|
952
|
-
name: 'user',
|
|
953
|
-
type: 'relationship',
|
|
954
|
-
relationTo: userSlug,
|
|
955
|
-
required: true,
|
|
956
|
-
label: 'User',
|
|
957
|
-
admin: {
|
|
958
|
-
readOnly: true,
|
|
959
|
-
description: 'The user associated with the API key.'
|
|
960
|
-
}
|
|
961
|
-
},
|
|
962
|
-
{
|
|
963
|
-
name: 'refillInterval',
|
|
964
|
-
type: 'number',
|
|
965
|
-
label: 'Refill Interval',
|
|
966
|
-
admin: {
|
|
967
|
-
readOnly: true,
|
|
968
|
-
description: 'The interval to refill the key in milliseconds.'
|
|
969
|
-
}
|
|
970
|
-
},
|
|
971
|
-
{
|
|
972
|
-
name: 'refillAmount',
|
|
973
|
-
type: 'number',
|
|
974
|
-
label: 'Refill Amount',
|
|
975
|
-
admin: {
|
|
976
|
-
readOnly: true,
|
|
977
|
-
description: 'The amount to refill the remaining count of the key.'
|
|
978
|
-
}
|
|
979
|
-
},
|
|
980
|
-
{
|
|
981
|
-
name: 'lastRefillAt',
|
|
982
|
-
type: 'date',
|
|
983
|
-
label: 'Last Refill At',
|
|
984
|
-
admin: {
|
|
985
|
-
readOnly: true,
|
|
986
|
-
description: 'The date and time when the key was last refilled.'
|
|
987
|
-
}
|
|
988
|
-
},
|
|
989
|
-
{
|
|
990
|
-
name: 'enabled',
|
|
991
|
-
type: 'checkbox',
|
|
992
|
-
defaultValue: true,
|
|
993
|
-
label: 'Enabled',
|
|
994
|
-
admin: {
|
|
995
|
-
readOnly: true,
|
|
996
|
-
description: 'Whether the API key is enabled.'
|
|
997
|
-
}
|
|
998
|
-
},
|
|
999
|
-
{
|
|
1000
|
-
name: 'rateLimitEnabled',
|
|
1001
|
-
type: 'checkbox',
|
|
1002
|
-
defaultValue: true,
|
|
1003
|
-
label: 'Rate Limit Enabled',
|
|
1004
|
-
admin: {
|
|
1005
|
-
readOnly: true,
|
|
1006
|
-
description: 'Whether the API key has rate limiting enabled.'
|
|
1007
|
-
}
|
|
1008
|
-
},
|
|
1009
|
-
{
|
|
1010
|
-
name: 'rateLimitTimeWindow',
|
|
1011
|
-
type: 'number',
|
|
1012
|
-
label: 'Rate Limit Time Window',
|
|
1013
|
-
admin: {
|
|
1014
|
-
readOnly: true,
|
|
1015
|
-
description: 'The time window in milliseconds for the rate limit.'
|
|
1016
|
-
}
|
|
1017
|
-
},
|
|
1018
|
-
{
|
|
1019
|
-
name: 'rateLimitMax',
|
|
1020
|
-
type: 'number',
|
|
1021
|
-
label: 'The maximum number of requests allowed within the `rateLimitTimeWindow`.',
|
|
1022
|
-
admin: {
|
|
1023
|
-
readOnly: true,
|
|
1024
|
-
description: 'The maximum number of requests allowed within the rate limit time window.'
|
|
1025
|
-
}
|
|
1026
|
-
},
|
|
1027
|
-
{
|
|
1028
|
-
name: 'requstCount',
|
|
1029
|
-
type: 'number',
|
|
1030
|
-
label: 'Request Count',
|
|
1031
|
-
required: true,
|
|
1032
|
-
admin: {
|
|
1033
|
-
readOnly: true,
|
|
1034
|
-
description: 'The number of requests made within the rate limit time window.'
|
|
1035
|
-
}
|
|
1036
|
-
},
|
|
1037
|
-
{
|
|
1038
|
-
name: 'remaining',
|
|
1039
|
-
type: 'number',
|
|
1040
|
-
label: 'Remaining Requests',
|
|
1041
|
-
admin: {
|
|
1042
|
-
readOnly: true,
|
|
1043
|
-
description: 'The number of requests remaining.'
|
|
1044
|
-
}
|
|
1045
|
-
},
|
|
1046
|
-
{
|
|
1047
|
-
name: 'lastRequest',
|
|
1048
|
-
type: 'date',
|
|
1049
|
-
label: 'Last Request At',
|
|
1050
|
-
admin: {
|
|
1051
|
-
readOnly: true,
|
|
1052
|
-
description: 'The date and time of the last request made to the key.'
|
|
1053
|
-
}
|
|
1054
|
-
},
|
|
1055
|
-
{
|
|
1056
|
-
name: 'expiresAt',
|
|
1057
|
-
type: 'date',
|
|
1058
|
-
label: 'Expires At',
|
|
1059
|
-
admin: {
|
|
1060
|
-
readOnly: true,
|
|
1061
|
-
description: 'The date and time of when the API key will expire.'
|
|
1062
|
-
}
|
|
1063
|
-
},
|
|
1064
|
-
{
|
|
1065
|
-
name: 'permissions',
|
|
1066
|
-
type: 'text',
|
|
1067
|
-
label: 'Permissions',
|
|
1068
|
-
admin: {
|
|
1069
|
-
readOnly: true,
|
|
1070
|
-
description: 'The permissions for the API key.'
|
|
1071
|
-
}
|
|
1072
|
-
},
|
|
1073
|
-
{
|
|
1074
|
-
name: 'metadata',
|
|
1075
|
-
type: 'json',
|
|
1076
|
-
label: 'Metadata',
|
|
1077
|
-
admin: {
|
|
1078
|
-
readOnly: true,
|
|
1079
|
-
description: 'Any additional metadata you want to store with the key.'
|
|
1080
|
-
}
|
|
1081
|
-
}
|
|
1082
|
-
],
|
|
1083
|
-
timestamps: true
|
|
1084
|
-
};
|
|
1085
|
-
enhancedCollections.push(apiKeyCollection);
|
|
1086
|
-
break;
|
|
1087
|
-
case betterAuthPluginSlugs.twoFactors:
|
|
1088
|
-
const twoFactorCollection = {
|
|
1089
|
-
slug: betterAuthPluginSlugs.twoFactors,
|
|
1090
|
-
admin: {
|
|
1091
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
1092
|
-
useAsTitle: 'secret',
|
|
1093
|
-
description: 'Two factor authentication secrets'
|
|
1094
|
-
},
|
|
1095
|
-
fields: [
|
|
1096
|
-
{
|
|
1097
|
-
name: 'user',
|
|
1098
|
-
type: 'relationship',
|
|
1099
|
-
relationTo: userSlug,
|
|
1100
|
-
required: true,
|
|
1101
|
-
label: 'User',
|
|
1102
|
-
admin: {
|
|
1103
|
-
readOnly: true,
|
|
1104
|
-
description: 'The user that the two factor authentication secret belongs to'
|
|
1105
|
-
}
|
|
1106
|
-
},
|
|
1107
|
-
{
|
|
1108
|
-
name: 'secret',
|
|
1109
|
-
type: 'text',
|
|
1110
|
-
label: 'Secret',
|
|
1111
|
-
index: true,
|
|
1112
|
-
admin: {
|
|
1113
|
-
readOnly: true,
|
|
1114
|
-
description: 'The secret used to generate the TOTP code.'
|
|
1115
|
-
}
|
|
1116
|
-
},
|
|
1117
|
-
{
|
|
1118
|
-
name: 'backupCodes',
|
|
1119
|
-
type: 'text',
|
|
1120
|
-
required: true,
|
|
1121
|
-
label: 'Backup Codes',
|
|
1122
|
-
admin: {
|
|
1123
|
-
readOnly: true,
|
|
1124
|
-
description: 'The backup codes used to recover access to the account if the user loses access to their phone or email'
|
|
1125
|
-
}
|
|
1126
|
-
}
|
|
1127
|
-
],
|
|
1128
|
-
timestamps: true
|
|
1129
|
-
};
|
|
1130
|
-
enhancedCollections.push(twoFactorCollection);
|
|
1131
|
-
break;
|
|
1132
|
-
case betterAuthPluginSlugs.oauthAccessTokens:
|
|
1133
|
-
const oauthAccessTokenCollection = {
|
|
1134
|
-
slug: betterAuthPluginSlugs.oauthAccessTokens,
|
|
1135
|
-
admin: {
|
|
1136
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
1137
|
-
useAsTitle: 'accessToken',
|
|
1138
|
-
description: 'OAuth access tokens for custom OAuth clients'
|
|
1139
|
-
},
|
|
1140
|
-
fields: [
|
|
1141
|
-
{
|
|
1142
|
-
name: 'accessToken',
|
|
1143
|
-
type: 'text',
|
|
1144
|
-
required: true,
|
|
1145
|
-
index: true,
|
|
1146
|
-
label: 'Access Token',
|
|
1147
|
-
admin: {
|
|
1148
|
-
readOnly: true,
|
|
1149
|
-
description: 'Access token issued to the client'
|
|
1150
|
-
}
|
|
1151
|
-
},
|
|
1152
|
-
{
|
|
1153
|
-
name: 'refreshToken',
|
|
1154
|
-
type: 'text',
|
|
1155
|
-
required: true,
|
|
1156
|
-
label: 'Refresh Token',
|
|
1157
|
-
admin: {
|
|
1158
|
-
readOnly: true,
|
|
1159
|
-
description: 'Refresh token issued to the client'
|
|
1160
|
-
}
|
|
1161
|
-
},
|
|
1162
|
-
{
|
|
1163
|
-
name: 'accessTokenExpiresAt',
|
|
1164
|
-
type: 'date',
|
|
1165
|
-
required: true,
|
|
1166
|
-
label: 'Access Token Expires At',
|
|
1167
|
-
admin: {
|
|
1168
|
-
readOnly: true,
|
|
1169
|
-
description: 'Expiration date of the access token'
|
|
1170
|
-
}
|
|
1171
|
-
},
|
|
1172
|
-
{
|
|
1173
|
-
name: 'refreshTokenExpiresAt',
|
|
1174
|
-
type: 'date',
|
|
1175
|
-
required: true,
|
|
1176
|
-
label: 'Refresh Token Expires At',
|
|
1177
|
-
admin: {
|
|
1178
|
-
readOnly: true,
|
|
1179
|
-
description: 'Expiration date of the refresh token'
|
|
1180
|
-
}
|
|
1181
|
-
},
|
|
1182
|
-
{
|
|
1183
|
-
name: 'client',
|
|
1184
|
-
type: 'relationship',
|
|
1185
|
-
relationTo: betterAuthPluginSlugs.oauthApplications,
|
|
1186
|
-
required: true,
|
|
1187
|
-
label: 'Client',
|
|
1188
|
-
admin: {
|
|
1189
|
-
readOnly: true,
|
|
1190
|
-
description: 'OAuth application associated with the access token'
|
|
1191
|
-
}
|
|
1192
|
-
},
|
|
1193
|
-
{
|
|
1194
|
-
name: 'user',
|
|
1195
|
-
type: 'relationship',
|
|
1196
|
-
relationTo: userSlug,
|
|
1197
|
-
required: true,
|
|
1198
|
-
label: 'User',
|
|
1199
|
-
admin: {
|
|
1200
|
-
readOnly: true,
|
|
1201
|
-
description: 'User associated with the access token'
|
|
1202
|
-
}
|
|
1203
|
-
},
|
|
1204
|
-
{
|
|
1205
|
-
name: 'scopes',
|
|
1206
|
-
type: 'text',
|
|
1207
|
-
required: true,
|
|
1208
|
-
label: 'Scopes',
|
|
1209
|
-
admin: {
|
|
1210
|
-
description: 'Comma-separated list of scopes granted'
|
|
1211
|
-
}
|
|
1212
|
-
}
|
|
1213
|
-
],
|
|
1214
|
-
timestamps: true
|
|
1215
|
-
};
|
|
1216
|
-
enhancedCollections.push(oauthAccessTokenCollection);
|
|
1217
|
-
break;
|
|
1218
|
-
case betterAuthPluginSlugs.oauthApplications:
|
|
1219
|
-
const oauthApplicationCollection = {
|
|
1220
|
-
slug: betterAuthPluginSlugs.oauthApplications,
|
|
1221
|
-
admin: {
|
|
1222
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
1223
|
-
useAsTitle: 'name',
|
|
1224
|
-
description: 'OAuth applications are custom OAuth clients'
|
|
1225
|
-
},
|
|
1226
|
-
fields: [
|
|
1227
|
-
{
|
|
1228
|
-
name: 'clientId',
|
|
1229
|
-
type: 'text',
|
|
1230
|
-
unique: true,
|
|
1231
|
-
index: true,
|
|
1232
|
-
required: true,
|
|
1233
|
-
label: 'Client ID',
|
|
1234
|
-
admin: {
|
|
1235
|
-
readOnly: true,
|
|
1236
|
-
description: 'Unique identifier for each OAuth client'
|
|
1237
|
-
}
|
|
1238
|
-
},
|
|
1239
|
-
{
|
|
1240
|
-
name: 'clientSecret',
|
|
1241
|
-
type: 'text',
|
|
1242
|
-
required: true,
|
|
1243
|
-
label: 'Client Secret',
|
|
1244
|
-
admin: {
|
|
1245
|
-
readOnly: true,
|
|
1246
|
-
description: 'Secret key for the OAuth client'
|
|
1247
|
-
}
|
|
1248
|
-
},
|
|
1249
|
-
{
|
|
1250
|
-
name: 'name',
|
|
1251
|
-
type: 'text',
|
|
1252
|
-
required: true,
|
|
1253
|
-
index: true,
|
|
1254
|
-
label: 'Name',
|
|
1255
|
-
admin: {
|
|
1256
|
-
description: 'Name of the OAuth application'
|
|
1257
|
-
}
|
|
1258
|
-
},
|
|
1259
|
-
{
|
|
1260
|
-
name: 'redirectURLs',
|
|
1261
|
-
type: 'text',
|
|
1262
|
-
required: true,
|
|
1263
|
-
label: 'Redirect URLs',
|
|
1264
|
-
admin: {
|
|
1265
|
-
description: 'Comma-separated list of redirect URLs'
|
|
1266
|
-
}
|
|
1267
|
-
},
|
|
1268
|
-
{
|
|
1269
|
-
name: 'metadata',
|
|
1270
|
-
type: 'json',
|
|
1271
|
-
admin: {
|
|
1272
|
-
readOnly: true,
|
|
1273
|
-
description: 'Additional metadata for the OAuth application'
|
|
1274
|
-
}
|
|
1275
|
-
},
|
|
1276
|
-
{
|
|
1277
|
-
name: 'type',
|
|
1278
|
-
type: 'text',
|
|
1279
|
-
required: true,
|
|
1280
|
-
label: 'Type',
|
|
1281
|
-
admin: {
|
|
1282
|
-
readOnly: true,
|
|
1283
|
-
description: 'Type of OAuth client (e.g., web, mobile)'
|
|
1284
|
-
}
|
|
1285
|
-
},
|
|
1286
|
-
{
|
|
1287
|
-
name: 'disabled',
|
|
1288
|
-
type: 'checkbox',
|
|
1289
|
-
defaultValue: false,
|
|
1290
|
-
required: true,
|
|
1291
|
-
label: 'Disabled',
|
|
1292
|
-
admin: {
|
|
1293
|
-
description: 'Indicates if the client is disabled'
|
|
1294
|
-
}
|
|
1295
|
-
},
|
|
1296
|
-
{
|
|
1297
|
-
name: 'icon',
|
|
1298
|
-
type: 'text',
|
|
1299
|
-
label: 'Icon',
|
|
1300
|
-
admin: {
|
|
1301
|
-
description: 'Icon of the OAuth application'
|
|
1302
|
-
}
|
|
1303
|
-
},
|
|
1304
|
-
{
|
|
1305
|
-
name: 'user',
|
|
1306
|
-
type: 'relationship',
|
|
1307
|
-
relationTo: userSlug,
|
|
1308
|
-
required: false,
|
|
1309
|
-
label: 'User',
|
|
1310
|
-
admin: {
|
|
1311
|
-
readOnly: true,
|
|
1312
|
-
description: 'ID of the user who owns the client. (optional)'
|
|
1313
|
-
}
|
|
1314
|
-
}
|
|
1315
|
-
],
|
|
1316
|
-
timestamps: true
|
|
1317
|
-
};
|
|
1318
|
-
enhancedCollections.push(oauthApplicationCollection);
|
|
1319
|
-
break;
|
|
1320
|
-
case betterAuthPluginSlugs.oauthConsents:
|
|
1321
|
-
const oauthConsentCollection = {
|
|
1322
|
-
slug: betterAuthPluginSlugs.oauthConsents,
|
|
1323
|
-
admin: {
|
|
1324
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
1325
|
-
description: 'OAuth consents are used to store user consents for OAuth clients'
|
|
1326
|
-
},
|
|
1327
|
-
fields: [
|
|
1328
|
-
{
|
|
1329
|
-
name: 'client',
|
|
1330
|
-
type: 'relationship',
|
|
1331
|
-
relationTo: betterAuthPluginSlugs.oauthApplications,
|
|
1332
|
-
required: true,
|
|
1333
|
-
label: 'Client',
|
|
1334
|
-
admin: {
|
|
1335
|
-
readOnly: true,
|
|
1336
|
-
description: 'OAuth client associated with the consent'
|
|
1337
|
-
}
|
|
1338
|
-
},
|
|
1339
|
-
{
|
|
1340
|
-
name: 'user',
|
|
1341
|
-
type: 'relationship',
|
|
1342
|
-
relationTo: userSlug,
|
|
1343
|
-
required: true,
|
|
1344
|
-
label: 'User',
|
|
1345
|
-
admin: {
|
|
1346
|
-
readOnly: true,
|
|
1347
|
-
description: 'User associated with the consent'
|
|
1348
|
-
}
|
|
1349
|
-
},
|
|
1350
|
-
{
|
|
1351
|
-
name: 'scopes',
|
|
1352
|
-
type: 'text',
|
|
1353
|
-
required: true,
|
|
1354
|
-
label: 'Scopes',
|
|
1355
|
-
admin: {
|
|
1356
|
-
readOnly: true,
|
|
1357
|
-
description: 'Comma-separated list of scopes consented to'
|
|
1358
|
-
}
|
|
1359
|
-
},
|
|
1360
|
-
{
|
|
1361
|
-
name: 'consentGiven',
|
|
1362
|
-
type: 'checkbox',
|
|
1363
|
-
defaultValue: false,
|
|
1364
|
-
required: true,
|
|
1365
|
-
label: 'Consent Given',
|
|
1366
|
-
admin: {
|
|
1367
|
-
readOnly: true,
|
|
1368
|
-
description: ' Indicates if consent was given'
|
|
1369
|
-
}
|
|
1370
|
-
}
|
|
1371
|
-
],
|
|
1372
|
-
timestamps: true
|
|
1373
|
-
};
|
|
1374
|
-
enhancedCollections.push(oauthConsentCollection);
|
|
1375
|
-
break;
|
|
1376
|
-
case betterAuthPluginSlugs.passkeys:
|
|
1377
|
-
const passkeyCollection = {
|
|
1378
|
-
slug: betterAuthPluginSlugs.passkeys,
|
|
1379
|
-
admin: {
|
|
1380
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
1381
|
-
useAsTitle: 'name',
|
|
1382
|
-
description: 'Passkeys are used to authenticate users'
|
|
1383
|
-
},
|
|
1384
|
-
fields: [
|
|
1385
|
-
{
|
|
1386
|
-
name: 'name',
|
|
1387
|
-
type: 'text',
|
|
1388
|
-
label: 'Name',
|
|
1389
|
-
admin: {
|
|
1390
|
-
readOnly: true,
|
|
1391
|
-
description: 'The name of the passkey'
|
|
1392
|
-
}
|
|
1393
|
-
},
|
|
1394
|
-
{
|
|
1395
|
-
name: 'publicKey',
|
|
1396
|
-
type: 'text',
|
|
1397
|
-
required: true,
|
|
1398
|
-
index: true,
|
|
1399
|
-
label: 'Public Key',
|
|
1400
|
-
admin: {
|
|
1401
|
-
readOnly: true,
|
|
1402
|
-
description: 'The public key of the passkey'
|
|
1403
|
-
}
|
|
1404
|
-
},
|
|
1405
|
-
{
|
|
1406
|
-
name: 'user',
|
|
1407
|
-
type: 'relationship',
|
|
1408
|
-
relationTo: userSlug,
|
|
1409
|
-
required: true,
|
|
1410
|
-
index: true,
|
|
1411
|
-
label: 'User',
|
|
1412
|
-
admin: {
|
|
1413
|
-
readOnly: true,
|
|
1414
|
-
description: 'The user that the passkey belongs to'
|
|
1415
|
-
}
|
|
1416
|
-
},
|
|
1417
|
-
{
|
|
1418
|
-
name: 'credentialID',
|
|
1419
|
-
type: 'text',
|
|
1420
|
-
required: true,
|
|
1421
|
-
unique: true,
|
|
1422
|
-
label: 'Credential ID',
|
|
1423
|
-
admin: {
|
|
1424
|
-
readOnly: true,
|
|
1425
|
-
description: 'The unique identifier of the registered credential'
|
|
1426
|
-
}
|
|
1427
|
-
},
|
|
1428
|
-
{
|
|
1429
|
-
name: 'counter',
|
|
1430
|
-
type: 'number',
|
|
1431
|
-
required: true,
|
|
1432
|
-
label: 'Counter',
|
|
1433
|
-
admin: {
|
|
1434
|
-
readOnly: true,
|
|
1435
|
-
description: 'The counter of the passkey'
|
|
1436
|
-
}
|
|
1437
|
-
},
|
|
1438
|
-
{
|
|
1439
|
-
name: 'deviceType',
|
|
1440
|
-
type: 'text',
|
|
1441
|
-
required: true,
|
|
1442
|
-
label: 'Device Type',
|
|
1443
|
-
admin: {
|
|
1444
|
-
readOnly: true,
|
|
1445
|
-
description: 'The type of device used to register the passkey'
|
|
1446
|
-
}
|
|
1447
|
-
},
|
|
1448
|
-
{
|
|
1449
|
-
name: 'backedUp',
|
|
1450
|
-
type: 'checkbox',
|
|
1451
|
-
required: true,
|
|
1452
|
-
label: 'Backed Up',
|
|
1453
|
-
admin: {
|
|
1454
|
-
readOnly: true,
|
|
1455
|
-
description: 'Whether the passkey is backed up'
|
|
1456
|
-
}
|
|
1457
|
-
},
|
|
1458
|
-
{
|
|
1459
|
-
name: 'transports',
|
|
1460
|
-
type: 'text',
|
|
1461
|
-
required: true,
|
|
1462
|
-
label: 'Transports',
|
|
1463
|
-
admin: {
|
|
1464
|
-
readOnly: true,
|
|
1465
|
-
description: 'The transports used to register the passkey'
|
|
1466
|
-
}
|
|
1467
|
-
}
|
|
1468
|
-
],
|
|
1469
|
-
timestamps: true
|
|
1470
|
-
};
|
|
1471
|
-
enhancedCollections.push(passkeyCollection);
|
|
1472
|
-
break;
|
|
1473
|
-
case betterAuthPluginSlugs.ssoProviders:
|
|
1474
|
-
const ssoProviderCollection = {
|
|
1475
|
-
slug: betterAuthPluginSlugs.ssoProviders,
|
|
1476
|
-
admin: {
|
|
1477
|
-
hidden: pluginOptions.hidePluginCollections ?? false,
|
|
1478
|
-
useAsTitle: 'issuer',
|
|
1479
|
-
description: 'SSO providers are used to authenticate users with an external provider'
|
|
1480
|
-
},
|
|
1481
|
-
fields: [
|
|
1482
|
-
{
|
|
1483
|
-
name: 'issuer',
|
|
1484
|
-
type: 'text',
|
|
1485
|
-
required: true,
|
|
1486
|
-
index: true,
|
|
1487
|
-
label: 'Issuer',
|
|
1488
|
-
admin: {
|
|
1489
|
-
description: 'The issuer of the SSO provider'
|
|
1490
|
-
}
|
|
1491
|
-
},
|
|
1492
|
-
{
|
|
1493
|
-
name: 'domain',
|
|
1494
|
-
type: 'text',
|
|
1495
|
-
required: true,
|
|
1496
|
-
label: 'Domain',
|
|
1497
|
-
admin: {
|
|
1498
|
-
description: 'The domain of the SSO provider'
|
|
1499
|
-
}
|
|
1500
|
-
},
|
|
1501
|
-
{
|
|
1502
|
-
name: 'oidcConfig',
|
|
1503
|
-
type: 'text',
|
|
1504
|
-
required: true,
|
|
1505
|
-
label: 'OIDC Config',
|
|
1506
|
-
admin: {
|
|
1507
|
-
description: 'The OIDC config of the SSO provider'
|
|
1508
|
-
}
|
|
1509
|
-
},
|
|
1510
|
-
{
|
|
1511
|
-
name: 'user',
|
|
1512
|
-
type: 'relationship',
|
|
1513
|
-
relationTo: userSlug,
|
|
1514
|
-
required: true,
|
|
1515
|
-
label: 'User',
|
|
1516
|
-
admin: {
|
|
1517
|
-
description: 'The user associated with the SSO provider'
|
|
1518
|
-
}
|
|
1519
|
-
},
|
|
1520
|
-
{
|
|
1521
|
-
name: 'providerId',
|
|
1522
|
-
type: 'text',
|
|
1523
|
-
required: true,
|
|
1524
|
-
label: 'Provider ID',
|
|
1525
|
-
admin: {
|
|
1526
|
-
readOnly: true,
|
|
1527
|
-
description: 'The provider id. Used to identify a provider and to generate a redirect url'
|
|
1528
|
-
}
|
|
1529
|
-
},
|
|
1530
|
-
{
|
|
1531
|
-
name: 'organizationId',
|
|
1532
|
-
type: 'text',
|
|
1533
|
-
required: true,
|
|
1534
|
-
label: 'Organization ID',
|
|
1535
|
-
admin: {
|
|
1536
|
-
readOnly: true,
|
|
1537
|
-
description: 'The organization Id. If provider is linked to an organization'
|
|
1538
|
-
}
|
|
1539
|
-
}
|
|
1540
|
-
],
|
|
1541
|
-
timestamps: true
|
|
1542
|
-
};
|
|
1543
|
-
enhancedCollections.push(ssoProviderCollection);
|
|
1544
|
-
break;
|
|
1545
|
-
default:
|
|
1546
|
-
break;
|
|
1547
|
-
}
|
|
1548
|
-
});
|
|
1549
|
-
const restOfCollections = incomingCollections.filter((collection)=>{
|
|
1550
|
-
return !enhancedCollections.some((enhancedCollection)=>enhancedCollection.slug === collection.slug);
|
|
1551
|
-
});
|
|
1552
|
-
return [
|
|
1553
|
-
...enhancedCollections,
|
|
1554
|
-
...restOfCollections
|
|
1555
|
-
];
|
|
1556
|
-
}
|
|
1557
|
-
|
|
1558
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iZXR0ZXItYXV0aC9wbHVnaW4vbGliL2J1aWxkLWNvbGxlY3Rpb24tY29uZmlncy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBheWxvYWRCZXR0ZXJBdXRoUGx1Z2luT3B0aW9ucywgU2FuaXRpemVkQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tICcuLidcbmltcG9ydCB7IGJhc2VDb2xsZWN0aW9uU2x1Z3MsIGJldHRlckF1dGhQbHVnaW5TbHVncyB9IGZyb20gJy4vY29uZmlnJ1xuaW1wb3J0IHsgYmV0dGVyQXV0aFN0cmF0ZWd5IH0gZnJvbSAnLi9hdXRoLXN0cmF0ZWd5J1xuaW1wb3J0IHsgZ2V0QWZ0ZXJMb2dvdXRIb29rIH0gZnJvbSAnLi4vY29sbGVjdGlvbnMvdXNlcnMvaG9va3MvYWZ0ZXItbG9nb3V0J1xuaW1wb3J0IHsgZ2V0UmVmcmVzaFRva2VuRW5kcG9pbnQgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy91c2Vycy9lbmRwb2ludHMvcmVmcmVzaC10b2tlbidcbmltcG9ydCB7XG4gIGlzQWRtaW5PckN1cnJlbnRVc2VyVXBkYXRlV2l0aEFsbG93ZWRGaWVsZHMsXG4gIGlzQWRtaW5PckN1cnJlbnRVc2VyV2l0aFJvbGVzLFxuICBpc0FkbWluV2l0aFJvbGVzLFxufSBmcm9tICcuL3BheWxvYWQtYWNjZXNzJ1xuaW1wb3J0IHsgY2xlYW5VcFVzZXJBZnRlckRlbGV0ZSB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL3VzZXJzL2hvb2tzL2NsZWFuLXVwLXVzZXItYWZ0ZXItZGVsZXRlJ1xuaW1wb3J0IHsgZ2V0U3luY1Bhc3N3b3JkVG9Vc2VySG9vayB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL2FjY291bnRzL2hvb2tzL3N5bmMtcGFzc3dvcmQtdG8tdXNlcidcbmltcG9ydCB7IGdldFN5bmNBY2NvdW50SG9vayB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL3VzZXJzL2hvb2tzL3N5bmMtYWNjb3VudCdcbmltcG9ydCB7IG9uVmVyaWZpZWRDaGFuZ2UgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy91c2Vycy9ob29rcy9vbi12ZXJpZmllZC1jaGFuZ2UnXG5pbXBvcnQgeyBnZXRBZnRlckxvZ2luSG9vayB9IGZyb20gJy4uL2NvbGxlY3Rpb25zL3VzZXJzL2hvb2tzL2FmdGVyLWxvZ2luJ1xuaW1wb3J0IHsgZ2V0QmVmb3JlTG9naW5Ib29rIH0gZnJvbSAnLi4vY29sbGVjdGlvbnMvdXNlcnMvaG9va3MvYmVmb3JlLWxvZ2luJ1xuaW1wb3J0IHsgQ29sbGVjdGlvbkNvbmZpZywgRmllbGQgfSBmcm9tICdwYXlsb2FkJ1xuLyoqXG4gKiBCdWlsZHMgdGhlIHJlcXVpcmVkIGNvbGxlY3Rpb25zIGJhc2VkIG9uIHRoZSBCZXR0ZXJBdXRoIG9wdGlvbnMgYW5kIHBsdWdpbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29sbGVjdGlvbkNvbmZpZ3Moe1xuICBpbmNvbWluZ0NvbGxlY3Rpb25zLFxuICByZXF1aXJlZENvbGxlY3Rpb25TbHVncyxcbiAgcGx1Z2luT3B0aW9ucyxcbiAgc2FuaXRpemVkQkFPcHRpb25zLFxufToge1xuICBpbmNvbWluZ0NvbGxlY3Rpb25zOiBDb2xsZWN0aW9uQ29uZmlnW11cbiAgcmVxdWlyZWRDb2xsZWN0aW9uU2x1Z3M6IFNldDxzdHJpbmc+XG4gIHBsdWdpbk9wdGlvbnM6IFBheWxvYWRCZXR0ZXJBdXRoUGx1Z2luT3B0aW9uc1xuICBzYW5pdGl6ZWRCQU9wdGlvbnM6IFNhbml0aXplZEJldHRlckF1dGhPcHRpb25zXG59KTogQ29sbGVjdGlvbkNvbmZpZ1tdIHtcbiAgY29uc3QgdXNlclNsdWcgPSBwbHVnaW5PcHRpb25zLnVzZXJzPy5zbHVnID8/IGJhc2VDb2xsZWN0aW9uU2x1Z3MudXNlcnNcbiAgY29uc3QgYWNjb3VudFNsdWcgPSBwbHVnaW5PcHRpb25zLmFjY291bnRzPy5zbHVnID8/IGJhc2VDb2xsZWN0aW9uU2x1Z3MuYWNjb3VudHNcbiAgY29uc3Qgc2Vzc2lvblNsdWcgPSBwbHVnaW5PcHRpb25zLnNlc3Npb25zPy5zbHVnID8/IGJhc2VDb2xsZWN0aW9uU2x1Z3Muc2Vzc2lvbnNcbiAgY29uc3QgdmVyaWZpY2F0aW9uU2x1ZyA9IHBsdWdpbk9wdGlvbnMudmVyaWZpY2F0aW9ucz8uc2x1ZyA/PyBiYXNlQ29sbGVjdGlvblNsdWdzLnZlcmlmaWNhdGlvbnNcbiAgY29uc3QgYmFQbHVnaW5zID0gc2FuaXRpemVkQkFPcHRpb25zLnBsdWdpbnMgPz8gbnVsbFxuICBjb25zdCBhZG1pblJvbGVzID0gcGx1Z2luT3B0aW9ucy51c2Vycz8uYWRtaW5Sb2xlcyA/PyBbJ2FkbWluJ11cblxuICBjb25zdCBnZXRUaW1lc3RhbXBGaWVsZHMgPSAoe1xuICAgIHNhdmVVcGRhdGVkQXRUb0pXVCA9IHRydWUsXG4gICAgc2F2ZUNyZWF0ZWRBdFRvSldUID0gdHJ1ZSxcbiAgfToge1xuICAgIHNhdmVVcGRhdGVkQXRUb0pXVD86IGJvb2xlYW5cbiAgICBzYXZlQ3JlYXRlZEF0VG9KV1Q/OiBib29sZWFuXG4gIH0gPSB7fSk6IEZpZWxkW10gPT4ge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd1cGRhdGVkQXQnLFxuICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgIHNhdmVUb0pXVDogc2F2ZVVwZGF0ZWRBdFRvSldULFxuICAgICAgICBhZG1pbjoge1xuICAgICAgICAgIGRpc2FibGVCdWxrRWRpdDogdHJ1ZSxcbiAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICBsYWJlbDogKHsgdCB9KSA9PiB0KCdnZW5lcmFsOnVwZGF0ZWRBdCcpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2NyZWF0ZWRBdCcsXG4gICAgICAgIHNhdmVUb0pXVDogc2F2ZUNyZWF0ZWRBdFRvSldULFxuICAgICAgICBhZG1pbjoge1xuICAgICAgICAgIGRpc2FibGVCdWxrRWRpdDogdHJ1ZSxcbiAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgIGxhYmVsOiAoeyB0IH0pID0+IHQoJ2dlbmVyYWw6Y3JlYXRlZEF0JyksXG4gICAgICB9LFxuICAgIF1cbiAgfVxuXG4gIGNvbnN0IGVuaGFuY2VkQ29sbGVjdGlvbnM6IENvbGxlY3Rpb25Db25maWdbXSA9IFtdXG5cbiAgcmVxdWlyZWRDb2xsZWN0aW9uU2x1Z3MuZm9yRWFjaCgoc2x1ZykgPT4ge1xuICAgIHN3aXRjaCAoc2x1ZyBhcyBrZXlvZiB0eXBlb2YgYmFzZUNvbGxlY3Rpb25TbHVncyB8IGtleW9mIHR5cGVvZiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MpIHtcbiAgICAgIGNhc2UgYmFzZUNvbGxlY3Rpb25TbHVncy51c2VyczpcbiAgICAgICAgY29uc3QgZXhpc3RpbmdVc2VyQ29sbGVjdGlvbiA9IGluY29taW5nQ29sbGVjdGlvbnMuZmluZChcbiAgICAgICAgICAoY29sbGVjdGlvbikgPT4gY29sbGVjdGlvbi5zbHVnID09PSB1c2VyU2x1ZyxcbiAgICAgICAgKSBhcyBDb2xsZWN0aW9uQ29uZmlnIHwgdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IGFsbG93ZWRGaWVsZHMgPSBwbHVnaW5PcHRpb25zLnVzZXJzPy5hbGxvd2VkRmllbGRzID8/IFsnbmFtZSddXG4gICAgICAgIGxldCB1c2Vyc0NvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgLi4uZXhpc3RpbmdVc2VyQ29sbGVjdGlvbixcbiAgICAgICAgICBzbHVnOiB1c2VyU2x1ZyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgZGVmYXVsdENvbHVtbnM6IFsnZW1haWwnXSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdlbWFpbCcsXG4gICAgICAgICAgICAuLi5leGlzdGluZ1VzZXJDb2xsZWN0aW9uPy5hZG1pbixcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy51c2Vycz8uaGlkZGVuID8/IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWNjZXNzOiB7XG4gICAgICAgICAgICBhZG1pbjogKHsgcmVxIH0pID0+IGFkbWluUm9sZXMuaW5jbHVkZXMoKHJlcS51c2VyPy5yb2xlIGFzIHN0cmluZykgPz8gJ3VzZXInKSxcbiAgICAgICAgICAgIHJlYWQ6IGlzQWRtaW5PckN1cnJlbnRVc2VyV2l0aFJvbGVzKHsgYWRtaW5Sb2xlcywgaWRGaWVsZDogJ2lkJyB9KSxcbiAgICAgICAgICAgIGNyZWF0ZTogaXNBZG1pbldpdGhSb2xlcyh7IGFkbWluUm9sZXMgfSksXG4gICAgICAgICAgICBkZWxldGU6IGlzQWRtaW5PckN1cnJlbnRVc2VyV2l0aFJvbGVzKHsgYWRtaW5Sb2xlcywgaWRGaWVsZDogJ2lkJyB9KSxcbiAgICAgICAgICAgIHVwZGF0ZTogaXNBZG1pbk9yQ3VycmVudFVzZXJVcGRhdGVXaXRoQWxsb3dlZEZpZWxkcyh7XG4gICAgICAgICAgICAgIGFsbG93ZWRGaWVsZHMsXG4gICAgICAgICAgICAgIGFkbWluUm9sZXMsXG4gICAgICAgICAgICAgIHVzZXJTbHVnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi4oZXhpc3RpbmdVc2VyQ29sbGVjdGlvbj8uYWNjZXNzID8/IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVuZHBvaW50czogW1xuICAgICAgICAgICAgLi4uKGV4aXN0aW5nVXNlckNvbGxlY3Rpb24/LmVuZHBvaW50cyA/IGV4aXN0aW5nVXNlckNvbGxlY3Rpb24uZW5kcG9pbnRzIDogW10pLFxuICAgICAgICAgICAgZ2V0UmVmcmVzaFRva2VuRW5kcG9pbnQoeyB1c2VyU2x1ZyB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBiZWZvcmVDaGFuZ2U6IFtcbiAgICAgICAgICAgICAgLi4uKGV4aXN0aW5nVXNlckNvbGxlY3Rpb24/Lmhvb2tzPy5iZWZvcmVDaGFuZ2UgPz8gW10pLFxuICAgICAgICAgICAgICBvblZlcmlmaWVkQ2hhbmdlLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFmdGVyQ2hhbmdlOiBbXG4gICAgICAgICAgICAgIC4uLihleGlzdGluZ1VzZXJDb2xsZWN0aW9uPy5ob29rcz8uYWZ0ZXJDaGFuZ2UgPz8gW10pLFxuICAgICAgICAgICAgICBnZXRTeW5jQWNjb3VudEhvb2soe1xuICAgICAgICAgICAgICAgIHVzZXJTbHVnLFxuICAgICAgICAgICAgICAgIGFjY291bnRTbHVnLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBiZWZvcmVMb2dpbjogW1xuICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdVc2VyQ29sbGVjdGlvbj8uaG9va3M/LmJlZm9yZUxvZ2luID8/IFtdKSxcbiAgICAgICAgICAgICAgZ2V0QmVmb3JlTG9naW5Ib29rKCksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgYWZ0ZXJMb2dpbjogW1xuICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdVc2VyQ29sbGVjdGlvbj8uaG9va3M/LmFmdGVyTG9naW4gPz8gW10pLFxuICAgICAgICAgICAgICBnZXRBZnRlckxvZ2luSG9vayh7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbnNDb2xsZWN0aW9uU2x1Zzogc2Vzc2lvblNsdWcsXG4gICAgICAgICAgICAgICAgdXNlcnNDb2xsZWN0aW9uU2x1ZzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGFmdGVyTG9nb3V0OiBbXG4gICAgICAgICAgICAgIC4uLihleGlzdGluZ1VzZXJDb2xsZWN0aW9uPy5ob29rcz8uYWZ0ZXJMb2dvdXQgPz8gW10pLFxuICAgICAgICAgICAgICBnZXRBZnRlckxvZ291dEhvb2soeyBzZXNzaW9uc0NvbGxlY3Rpb25TbHVnOiBzZXNzaW9uU2x1ZyB9KSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhZnRlckRlbGV0ZTogW1xuICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdVc2VyQ29sbGVjdGlvbj8uaG9va3M/LmFmdGVyRGVsZXRlID8/IFtdKSxcbiAgICAgICAgICAgICAgKGFyZ3MpID0+IGNsZWFuVXBVc2VyQWZ0ZXJEZWxldGUoYXJncyBhcyBhbnkpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGF1dGg6IHtcbiAgICAgICAgICAgIC4uLihleGlzdGluZ1VzZXJDb2xsZWN0aW9uICYmIHR5cGVvZiBleGlzdGluZ1VzZXJDb2xsZWN0aW9uLmF1dGggPT09ICdvYmplY3QnXG4gICAgICAgICAgICAgID8gZXhpc3RpbmdVc2VyQ29sbGVjdGlvbi5hdXRoXG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgLy9kaXNhYmxlTG9jYWxTdHJhdGVneTogZmFsc2UsXG4gICAgICAgICAgICBzdHJhdGVnaWVzOiBbYmV0dGVyQXV0aFN0cmF0ZWd5KGFkbWluUm9sZXMsIHVzZXJTbHVnKV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIC4uLihleGlzdGluZ1VzZXJDb2xsZWN0aW9uPy5maWVsZHMgPz8gW10pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnYmV0dGVyQXV0aEFkbWluQnV0dG9ucycsXG4gICAgICAgICAgICAgIHR5cGU6ICd1aScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdzaWRlYmFyJyxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgICBGaWVsZDoge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAncGF5bG9hZC1hdXRoL2JldHRlci1hdXRoL3BsdWdpbi9jbGllbnQjQWRtaW5CdXR0b25zJyxcbiAgICAgICAgICAgICAgICAgICAgY2xpZW50UHJvcHM6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdXNlclNsdWcsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gT25seSBzaG93IHRoZSBpbXBlcnNvbmF0ZSBidXR0b24gaWYgdGhlIGFkbWluIHBsdWdpbiBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGJhUGx1Z2lucyAmJiBiYVBsdWdpbnMuc29tZSgocGx1Z2luKSA9PiBwbHVnaW4uaWQgPT09ICdhZG1pbicpKSA/PyBmYWxzZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdOYW1lJyxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlcnMgY2hvc2VuIGRpc3BsYXkgbmFtZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZW1haWwnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0VtYWlsJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBlbWFpbCBvZiB0aGUgdXNlcicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZW1haWxWZXJpZmllZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICBzYXZlVG9KV1Q6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnRW1haWwgVmVyaWZpZWQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgZW1haWwgb2YgdGhlIHVzZXIgaGFzIGJlZW4gdmVyaWZpZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2ltYWdlJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0ltYWdlJyxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGltYWdlIG9mIHRoZSB1c2VyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyb2xlJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgLi4uKFxuICAgICAgICAgICAgICAgICAgcGx1Z2luT3B0aW9ucy51c2Vycz8ucm9sZXMgPz8gW1xuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnQWRtaW4nLCB2YWx1ZTogJ2FkbWluJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IGxhYmVsOiAnVXNlcicsIHZhbHVlOiAndXNlcicgfSxcbiAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICApLm1hcCgocm9sZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByb2xlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByb2xlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcm9sZS5zbGljZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSb2xlJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSByb2xlIG9mIHRoZSB1c2VyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5nZXRUaW1lc3RhbXBGaWVsZHMoeyBzYXZlVXBkYXRlZEF0VG9KV1Q6IGZhbHNlLCBzYXZlQ3JlYXRlZEF0VG9KV1Q6IGZhbHNlIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJhUGx1Z2lucykge1xuICAgICAgICAgIGJhUGx1Z2lucy5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAocGx1Z2luLmlkKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3R3by1mYWN0b3InOlxuICAgICAgICAgICAgICAgIHVzZXJzQ29sbGVjdGlvbi5maWVsZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAndHdvRmFjdG9yRW5hYmxlZCcsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVHdvIEZhY3RvciBFbmFibGVkJyxcbiAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgdXNlciBoYXMgdHdvIGZhY3RvciBhdXRoZW50aWNhdGlvbiBlbmFibGVkJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlICd1c2VybmFtZSc6XG4gICAgICAgICAgICAgICAgdXNlcnNDb2xsZWN0aW9uLmZpZWxkcy5wdXNoKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndXNlcm5hbWUnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLCAvLyBUT0RPOiBkZWNpZGUgaWYgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQsIHdpbGwgaGF2ZSB0byB0ZWxsIHVzZXJzIHRoZXkgbmVlZCB0byBhZGQgdWkgZm9yIGl0LlxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1VzZXJuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1c2VybmFtZSBvZiB0aGUgdXNlcicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGlzcGxheVVzZXJuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdEaXNwbGF5IFVzZXJuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkaXNwbGF5IHVzZXJuYW1lIG9mIHRoZSB1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgJ2Fub255bW91cyc6XG4gICAgICAgICAgICAgICAgdXNlcnNDb2xsZWN0aW9uLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdpc0Fub255bW91cycsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnSXMgQW5vbnltb3VzJyxcbiAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgdXNlciBpcyBhbm9ueW1vdXMuJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICBjYXNlICdwaG9uZS1udW1iZXInOlxuICAgICAgICAgICAgICAgIHVzZXJzQ29sbGVjdGlvbi5maWVsZHMucHVzaChcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Bob25lTnVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1Bob25lIE51bWJlcicsXG4gICAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcGhvbmUgbnVtYmVyIG9mIHRoZSB1c2VyJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwaG9uZU51bWJlclZlcmlmaWVkJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQaG9uZSBOdW1iZXIgVmVyaWZpZWQnLFxuICAgICAgICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV2hldGhlciB0aGUgcGhvbmUgbnVtYmVyIG9mIHRoZSB1c2VyIGhhcyBiZWVuIHZlcmlmaWVkJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGNhc2UgJ2FkbWluJzpcbiAgICAgICAgICAgICAgICB1c2Vyc0NvbGxlY3Rpb24uZmllbGRzLnB1c2goXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdiYW5uZWQnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0Jhbm5lZCcsXG4gICAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSB1c2VyIGlzIGJhbm5lZCBmcm9tIHRoZSBwbGF0Zm9ybScsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYmFuUmVhc29uJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0JhbiBSZWFzb24nLFxuICAgICAgICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJlYXNvbiBmb3IgdGhlIGJhbicsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYmFuRXhwaXJlcycsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdCYW4gRXhwaXJlcycsXG4gICAgICAgICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBiYW4gd2lsbCBleHBpcmUnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSAnaGFybW9ueS1lbWFpbCc6XG4gICAgICAgICAgICAgICAgdXNlcnNDb2xsZWN0aW9uLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdub3JtYWxpemVkRW1haWwnLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5vcm1hbGl6ZWQgZW1haWwgb2YgdGhlIHVzZXInLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsdWdpbk9wdGlvbnMudXNlcnM/LmNvbGxlY3Rpb25PdmVycmlkZXMpIHtcbiAgICAgICAgICB1c2Vyc0NvbGxlY3Rpb24gPSBwbHVnaW5PcHRpb25zLnVzZXJzLmNvbGxlY3Rpb25PdmVycmlkZXMoeyBjb2xsZWN0aW9uOiB1c2Vyc0NvbGxlY3Rpb24gfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaCh1c2Vyc0NvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJhc2VDb2xsZWN0aW9uU2x1Z3MuYWNjb3VudHM6XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudENvbGxlY3Rpb24gPSBpbmNvbWluZ0NvbGxlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc2x1ZyA9PT0gYWNjb3VudFNsdWcsXG4gICAgICAgICkgYXMgQ29sbGVjdGlvbkNvbmZpZyB8IHVuZGVmaW5lZFxuICAgICAgICBsZXQgYWNjb3VudENvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgc2x1ZzogYWNjb3VudFNsdWcsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdhY2NvdW50SWQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBY2NvdW50cyBhcmUgdXNlZCB0byBzdG9yZSB1c2VyIGFjY291bnRzIGZvciBhdXRoZW50aWNhdGlvbiBwcm92aWRlcnMnLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdBY2NvdW50Q29sbGVjdGlvbj8uYWRtaW4sXG4gICAgICAgICAgICBoaWRkZW46IHBsdWdpbk9wdGlvbnMuYWNjb3VudHM/LmhpZGRlbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhvb2tzOiB7XG4gICAgICAgICAgICBhZnRlckNoYW5nZTogW1xuICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdBY2NvdW50Q29sbGVjdGlvbj8uaG9va3M/LmFmdGVyQ2hhbmdlID8/IFtdKSxcbiAgICAgICAgICAgICAgZ2V0U3luY1Bhc3N3b3JkVG9Vc2VySG9vayh7XG4gICAgICAgICAgICAgICAgdXNlclNsdWcsXG4gICAgICAgICAgICAgICAgYWNjb3VudFNsdWcsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFjY2Vzczoge1xuICAgICAgICAgICAgY3JlYXRlOiBpc0FkbWluV2l0aFJvbGVzKHsgYWRtaW5Sb2xlcyB9KSxcbiAgICAgICAgICAgIGRlbGV0ZTogaXNBZG1pbldpdGhSb2xlcyh7IGFkbWluUm9sZXMgfSksXG4gICAgICAgICAgICByZWFkOiBpc0FkbWluT3JDdXJyZW50VXNlcldpdGhSb2xlcyh7IGFkbWluUm9sZXMsIGlkRmllbGQ6ICd1c2VyJyB9KSxcbiAgICAgICAgICAgIHVwZGF0ZTogaXNBZG1pbldpdGhSb2xlcyh7IGFkbWluUm9sZXMgfSksXG4gICAgICAgICAgICAuLi4oZXhpc3RpbmdBY2NvdW50Q29sbGVjdGlvbj8uYWNjZXNzID8/IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgLi4uKGV4aXN0aW5nQWNjb3VudENvbGxlY3Rpb24/LmZpZWxkcyA/PyBbXSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVXNlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB0aGF0IHRoZSBhY2NvdW50IGJlbG9uZ3MgdG8nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2FjY291bnRJZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdBY2NvdW50IElEJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgJ1RoZSBpZCBvZiB0aGUgYWNjb3VudCBhcyBwcm92aWRlZCBieSB0aGUgU1NPIG9yIGVxdWFsIHRvIHVzZXJJZCBmb3IgY3JlZGVudGlhbCBhY2NvdW50cycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncHJvdmlkZXJJZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUHJvdmlkZXIgSUQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGlkIG9mIHRoZSBwcm92aWRlciBhcyBwcm92aWRlZCBieSB0aGUgU1NPJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdhY2Nlc3NUb2tlbicsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdBY2Nlc3MgVG9rZW4nLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFjY2VzcyB0b2tlbiBvZiB0aGUgYWNjb3VudC4gUmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyZWZyZXNoVG9rZW4nLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUmVmcmVzaCBUb2tlbicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgcmVmcmVzaCB0b2tlbiBvZiB0aGUgYWNjb3VudC4gUmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdhY2Nlc3NUb2tlbkV4cGlyZXNBdCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdBY2Nlc3MgVG9rZW4gRXhwaXJlcyBBdCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBhY2Nlc3MgdG9rZW4gd2lsbCBleHBpcmUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZnJlc2hUb2tlbkV4cGlyZXNBdCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZWZyZXNoIFRva2VuIEV4cGlyZXMgQXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcmVmcmVzaCB0b2tlbiB3aWxsIGV4cGlyZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnc2NvcGUnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnU2NvcGUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHNjb3BlIG9mIHRoZSBhY2NvdW50LiBSZXR1cm5lZCBieSB0aGUgcHJvdmlkZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2lkVG9rZW4nLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnSUQgVG9rZW4nLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGlkIHRva2VuIGZvciB0aGUgYWNjb3VudC4gUmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdwYXNzd29yZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdQYXNzd29yZCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgJ1RoZSBoYXNoZWQgcGFzc3dvcmQgb2YgdGhlIGFjY291bnQuIE1haW5seSB1c2VkIGZvciBlbWFpbCBhbmQgcGFzc3dvcmQgYXV0aGVudGljYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmdldFRpbWVzdGFtcEZpZWxkcygpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgLi4uZXhpc3RpbmdBY2NvdW50Q29sbGVjdGlvbixcbiAgICAgICAgfVxuICAgICAgICBpZiAocGx1Z2luT3B0aW9ucy5hY2NvdW50cz8uY29sbGVjdGlvbk92ZXJyaWRlcykge1xuICAgICAgICAgIGFjY291bnRDb2xsZWN0aW9uID0gcGx1Z2luT3B0aW9ucy5hY2NvdW50cy5jb2xsZWN0aW9uT3ZlcnJpZGVzKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGFjY291bnRDb2xsZWN0aW9uLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2goYWNjb3VudENvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJhc2VDb2xsZWN0aW9uU2x1Z3Muc2Vzc2lvbnM6XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU2Vzc2lvbkNvbGxlY3Rpb24gPSBpbmNvbWluZ0NvbGxlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgKGNvbGxlY3Rpb24pID0+IGNvbGxlY3Rpb24uc2x1ZyA9PT0gc2Vzc2lvblNsdWcsXG4gICAgICAgICkgYXMgQ29sbGVjdGlvbkNvbmZpZyB8IHVuZGVmaW5lZFxuICAgICAgICBsZXQgc2Vzc2lvbkNvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgc2x1Zzogc2Vzc2lvblNsdWcsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nU2Vzc2lvbkNvbGxlY3Rpb24/LmFkbWluLFxuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLnNlc3Npb25zPy5oaWRkZW4sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgJ1Nlc3Npb25zIGFyZSBhY3RpdmUgc2Vzc2lvbnMgZm9yIHVzZXJzLiBUaGV5IGFyZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB1c2VycyB3aXRoIGEgc2Vzc2lvbiB0b2tlbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIC4uLihleGlzdGluZ1Nlc3Npb25Db2xsZWN0aW9uPy5maWVsZHMgPz8gW10pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAndXNlcicsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiB1c2VyU2x1ZyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHNhdmVUb0pXVDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB0aGF0IHRoZSBzZXNzaW9uIGJlbG9uZ3MgdG8nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Rva2VuJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1Rva2VuJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1bmlxdWUgc2Vzc2lvbiB0b2tlbicsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdFeHBpcmVzIEF0JyxcbiAgICAgICAgICAgICAgc2F2ZVRvSldUOiB0cnVlLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgc2Vzc2lvbiB3aWxsIGV4cGlyZScsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnaXBBZGRyZXNzJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0lQIEFkZHJlc3MnLFxuICAgICAgICAgICAgICBzYXZlVG9KV1Q6IHRydWUsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlJyxcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyQWdlbnQnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVXNlciBBZ2VudCcsXG4gICAgICAgICAgICAgIHNhdmVUb0pXVDogdHJ1ZSxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1c2VyIGFnZW50IGluZm9ybWF0aW9uIG9mIHRoZSBkZXZpY2UnLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLmdldFRpbWVzdGFtcEZpZWxkcygpLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgLi4uZXhpc3RpbmdTZXNzaW9uQ29sbGVjdGlvbixcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmFQbHVnaW5zKSB7XG4gICAgICAgICAgYmFQbHVnaW5zLmZvckVhY2goKHBsdWdpbikgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChwbHVnaW4uaWQpIHtcbiAgICAgICAgICAgICAgY2FzZSAnYWRtaW4nOlxuICAgICAgICAgICAgICAgIHNlc3Npb25Db2xsZWN0aW9uLmZpZWxkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdpbXBlcnNvbmF0ZWRCeScsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6ICdJbXBlcnNvbmF0ZWQgQnknLFxuICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFkbWluIHdobyBpcyBpbXBlcnNvbmF0aW5nIHRoaXMgc2Vzc2lvbicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgY2FzZSAnb3JnYW5pemF0aW9uJzpcbiAgICAgICAgICAgICAgICBzZXNzaW9uQ29sbGVjdGlvbi5maWVsZHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiAnYWN0aXZlT3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICAgICAgcmVsYXRpb25UbzogYmV0dGVyQXV0aFBsdWdpblNsdWdzLm9yZ2FuaXphdGlvbnMsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogJ0FjdGl2ZSBPcmdhbml6YXRpb24nLFxuICAgICAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGN1cnJlbnRseSBhY3RpdmUgb3JnYW5pemF0aW9uIGZvciB0aGUgc2Vzc2lvbicsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGx1Z2luT3B0aW9ucy5zZXNzaW9ucz8uY29sbGVjdGlvbk92ZXJyaWRlcykge1xuICAgICAgICAgIHNlc3Npb25Db2xsZWN0aW9uID0gcGx1Z2luT3B0aW9ucy5zZXNzaW9ucy5jb2xsZWN0aW9uT3ZlcnJpZGVzKHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IHNlc3Npb25Db2xsZWN0aW9uLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2goc2Vzc2lvbkNvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJhc2VDb2xsZWN0aW9uU2x1Z3MudmVyaWZpY2F0aW9uczpcbiAgICAgICAgY29uc3QgZXhpc3RpbmdWZXJpZmljYXRpb25Db2xsZWN0aW9uID0gaW5jb21pbmdDb2xsZWN0aW9ucy5maW5kKFxuICAgICAgICAgIChjb2xsZWN0aW9uKSA9PiBjb2xsZWN0aW9uLnNsdWcgPT09IHZlcmlmaWNhdGlvblNsdWcsXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiB2ZXJpZmljYXRpb25TbHVnLFxuICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ1ZlcmlmaWNhdGlvbkNvbGxlY3Rpb24/LmFkbWluLFxuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLnZlcmlmaWNhdGlvbnM/LmhpZGRlbixcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdpZGVudGlmaWVyJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVmVyaWZpY2F0aW9ucyBhcmUgdXNlZCB0byB2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVxdWVzdHMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAuLi4oZXhpc3RpbmdWZXJpZmljYXRpb25Db2xsZWN0aW9uPy5maWVsZHMgPz8gW10pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnaWRlbnRpZmllcicsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0lkZW50aWZpZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGlkZW50aWZpZXIgb2YgdGhlIHZlcmlmaWNhdGlvbiByZXF1ZXN0JyxcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd2YWx1ZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVmFsdWUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHZhbHVlIHRvIGJlIHZlcmlmaWVkJyxcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdleHBpcmVzQXQnLFxuICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0V4cGlyZXMgQXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgdmVyaWZpY2F0aW9uIHJlcXVlc3Qgd2lsbCBleHBpcmUnLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpbWVzdGFtcHM6IHRydWUsXG4gICAgICAgICAgLi4uZXhpc3RpbmdWZXJpZmljYXRpb25Db2xsZWN0aW9uLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaCh2ZXJpZmljYXRpb25Db2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub3JnYW5pemF0aW9uczpcbiAgICAgICAgY29uc3Qgb3JnYW5pemF0aW9uQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub3JnYW5pemF0aW9ucyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICduYW1lJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAnT3JnYW5pemF0aW9ucyBhcmUgZ3JvdXBzIG9mIHVzZXJzIHRoYXQgc2hhcmUgYWNjZXNzIHRvIGNlcnRhaW4gcmVzb3VyY2VzLicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ25hbWUnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbi4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3NsdWcnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnU2x1ZycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgc2x1ZyBvZiB0aGUgb3JnYW5pemF0aW9uLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbG9nbycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdMb2dvJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBsb2dvIG9mIHRoZSBvcmdhbml6YXRpb24uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdtZXRhZGF0YScsXG4gICAgICAgICAgICAgIHR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdNZXRhZGF0YScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBZGRpdGlvbmFsIG1ldGFkYXRhIGZvciB0aGUgb3JnYW5pemF0aW9uLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2gob3JnYW5pemF0aW9uQ29sbGVjdGlvbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgYmV0dGVyQXV0aFBsdWdpblNsdWdzLm1lbWJlcnM6XG4gICAgICAgIGNvbnN0IG1lbWJlckNvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgc2x1ZzogYmV0dGVyQXV0aFBsdWdpblNsdWdzLm1lbWJlcnMsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy5oaWRlUGx1Z2luQ29sbGVjdGlvbnMgPz8gZmFsc2UsXG4gICAgICAgICAgICB1c2VBc1RpdGxlOiAnb3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTWVtYmVycyBvZiBhbiBvcmdhbml6YXRpb24uJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnb3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IGJldHRlckF1dGhQbHVnaW5TbHVncy5vcmdhbml6YXRpb25zLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnT3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBvcmdhbml6YXRpb24gdGhhdCB0aGUgbWVtYmVyIGJlbG9uZ3MgdG8uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVXNlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBvcmdhbml6YXRpb24uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd0ZWFtJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IGJldHRlckF1dGhQbHVnaW5TbHVncy50ZWFtcyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1RlYW0nLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHRlYW0gdGhhdCB0aGUgbWVtYmVyIGJlbG9uZ3MgdG8uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyb2xlJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnbWVtYmVyJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSb2xlJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSByb2xlIG9mIHRoZSBtZW1iZXIgaW4gdGhlIG9yZ2FuaXphdGlvbi4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpbWVzdGFtcHM6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgZW5oYW5jZWRDb2xsZWN0aW9ucy5wdXNoKG1lbWJlckNvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJldHRlckF1dGhQbHVnaW5TbHVncy5pbnZpdGF0aW9uczpcbiAgICAgICAgY29uc3QgaW52aXRhdGlvbkNvbGxlY3Rpb246IENvbGxlY3Rpb25Db25maWcgPSB7XG4gICAgICAgICAgc2x1ZzogYmV0dGVyQXV0aFBsdWdpblNsdWdzLmludml0YXRpb25zLFxuICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICBoaWRkZW46IHBsdWdpbk9wdGlvbnMuaGlkZVBsdWdpbkNvbGxlY3Rpb25zID8/IGZhbHNlLFxuICAgICAgICAgICAgdXNlQXNUaXRsZTogJ2VtYWlsJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSW52aXRhdGlvbnMgdG8gam9pbiBhbiBvcmdhbml6YXRpb24nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdlbWFpbCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0VtYWlsJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBlbWFpbCBvZiB0aGUgdXNlciBiZWluZyBpbnZpdGVkLicsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnaW52aXRlcicsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiB1c2VyU2x1ZyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnSW52aXRlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB3aG8gaW52aXRlZCB0aGUgdXNlci4nLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ29yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub3JnYW5pemF0aW9ucyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ09yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgb3JnYW5pemF0aW9uIHRoYXQgdGhlIHVzZXIgaXMgYmVpbmcgaW52aXRlZCB0by4nLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JvbGUnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1JvbGUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHJvbGUgb2YgdGhlIHVzZXIgYmVpbmcgaW52aXRlZC4nLFxuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3N0YXR1cycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ3BlbmRpbmcnLFxuICAgICAgICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgc3RhdHVzIG9mIHRoZSBpbnZpdGF0aW9uLicsXG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdFeHBpcmVzIEF0JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGludml0YXRpb24gd2lsbCBleHBpcmUuJyxcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aW1lc3RhbXBzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaChpbnZpdGF0aW9uQ29sbGVjdGlvbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgYmV0dGVyQXV0aFBsdWdpblNsdWdzLnRlYW1zOlxuICAgICAgICBjb25zdCB0ZWFtQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MudGVhbXMsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy5oaWRlUGx1Z2luQ29sbGVjdGlvbnMgPz8gZmFsc2UsXG4gICAgICAgICAgICB1c2VBc1RpdGxlOiAnbmFtZScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RlYW1zIGFyZSBncm91cHMgb2YgdXNlcnMgdGhhdCBzaGFyZSBhY2Nlc3MgdG8gY2VydGFpbiByZXNvdXJjZXMuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnTmFtZScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgbmFtZSBvZiB0aGUgdGVhbS4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ29yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub3JnYW5pemF0aW9ucyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnT3JnYW5pemF0aW9uJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBvcmdhbml6YXRpb24gdGhhdCB0aGUgdGVhbSBiZWxvbmdzIHRvLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2godGVhbUNvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJldHRlckF1dGhQbHVnaW5TbHVncy5qd2tzOlxuICAgICAgICBjb25zdCBqd2tzQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MuandrcyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdwdWJsaWNLZXknLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdKV0tTIGFyZSB1c2VkIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9mIHRoZSBKV1QgdG9rZW4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdwdWJsaWNLZXknLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdQdWJsaWMgS2V5JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwdWJsaWMgcGFydCBvZiB0aGUgd2ViIGtleScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncHJpdmF0ZUtleScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUHJpdmF0ZSBLZXknLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHByaXZhdGUgcGFydCBvZiB0aGUgd2ViIGtleScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2goandrc0NvbGxlY3Rpb24pXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlIGJldHRlckF1dGhQbHVnaW5TbHVncy5hcGlLZXlzOlxuICAgICAgICBjb25zdCBhcGlLZXlDb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgIHNsdWc6IGJldHRlckF1dGhQbHVnaW5TbHVncy5hcGlLZXlzLFxuICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICBoaWRkZW46IHBsdWdpbk9wdGlvbnMuaGlkZVBsdWdpbkNvbGxlY3Rpb25zID8/IGZhbHNlLFxuICAgICAgICAgICAgdXNlQXNUaXRsZTogJ25hbWUnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBUEkga2V5cyBhcmUgdXNlZCB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMgdG8gdGhlIEFQSS4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICduYW1lJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG5hbWUgb2YgdGhlIEFQSSBrZXkuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdzdGFydCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdTdGFydGluZyBDaGFyYWN0ZXJzJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICdUaGUgc3RhcnRpbmcgY2hhcmFjdGVycyBvZiB0aGUgQVBJIGtleS4gVXNlZnVsIGZvciBzaG93aW5nIHRoZSBmaXJzdCBmZXcgY2hhcmFjdGVycyBvZiB0aGUgQVBJIGtleSBpbiB0aGUgVUkgZm9yIHRoZSB1c2VycyB0byBlYXNpbHkgaWRlbnRpZnkuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdwcmVmaXgnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUHJlZml4JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBBUEkgS2V5IHByZWZpeC4gU3RvcmVkIGFzIHBsYWluIHRleHQuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdrZXknLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0FQSSBLZXknLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGhhc2hlZCBBUEkga2V5IGl0c2VsZi4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3VzZXInLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1VzZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBBUEkga2V5LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVmaWxsSW50ZXJ2YWwnLFxuICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZWZpbGwgSW50ZXJ2YWwnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGludGVydmFsIHRvIHJlZmlsbCB0aGUga2V5IGluIG1pbGxpc2Vjb25kcy4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZmlsbEFtb3VudCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICBsYWJlbDogJ1JlZmlsbCBBbW91bnQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGFtb3VudCB0byByZWZpbGwgdGhlIHJlbWFpbmluZyBjb3VudCBvZiB0aGUga2V5LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbGFzdFJlZmlsbEF0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0xhc3QgUmVmaWxsIEF0JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGtleSB3YXMgbGFzdCByZWZpbGxlZC4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2VuYWJsZWQnLFxuICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnRW5hYmxlZCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBBUEkga2V5IGlzIGVuYWJsZWQuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyYXRlTGltaXRFbmFibGVkJyxcbiAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcbiAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1JhdGUgTGltaXQgRW5hYmxlZCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBBUEkga2V5IGhhcyByYXRlIGxpbWl0aW5nIGVuYWJsZWQuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdyYXRlTGltaXRUaW1lV2luZG93JyxcbiAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUmF0ZSBMaW1pdCBUaW1lIFdpbmRvdycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdGltZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcmF0ZSBsaW1pdC4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JhdGVMaW1pdE1heCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICBsYWJlbDogJ1RoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhbGxvd2VkIHdpdGhpbiB0aGUgYHJhdGVMaW1pdFRpbWVXaW5kb3dgLicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAnVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGFsbG93ZWQgd2l0aGluIHRoZSByYXRlIGxpbWl0IHRpbWUgd2luZG93LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVxdXN0Q291bnQnLFxuICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZXF1ZXN0IENvdW50JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgbnVtYmVyIG9mIHJlcXVlc3RzIG1hZGUgd2l0aGluIHRoZSByYXRlIGxpbWl0IHRpbWUgd2luZG93LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVtYWluaW5nJyxcbiAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUmVtYWluaW5nIFJlcXVlc3RzJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBudW1iZXIgb2YgcmVxdWVzdHMgcmVtYWluaW5nLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbGFzdFJlcXVlc3QnLFxuICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgICAgIGxhYmVsOiAnTGFzdCBSZXF1ZXN0IEF0JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHJlcXVlc3QgbWFkZSB0byB0aGUga2V5LicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnZXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0V4cGlyZXMgQXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRhdGUgYW5kIHRpbWUgb2Ygd2hlbiB0aGUgQVBJIGtleSB3aWxsIGV4cGlyZS4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Blcm1pc3Npb25zJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ1Blcm1pc3Npb25zJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwZXJtaXNzaW9ucyBmb3IgdGhlIEFQSSBrZXkuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdtZXRhZGF0YScsXG4gICAgICAgICAgICAgIHR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdNZXRhZGF0YScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdBbnkgYWRkaXRpb25hbCBtZXRhZGF0YSB5b3Ugd2FudCB0byBzdG9yZSB3aXRoIHRoZSBrZXkuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aW1lc3RhbXBzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaChhcGlLZXlDb2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MudHdvRmFjdG9yczpcbiAgICAgICAgY29uc3QgdHdvRmFjdG9yQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MudHdvRmFjdG9ycyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICdzZWNyZXQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUd28gZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHNlY3JldHMnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdVc2VyJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1c2VyIHRoYXQgdGhlIHR3byBmYWN0b3IgYXV0aGVudGljYXRpb24gc2VjcmV0IGJlbG9uZ3MgdG8nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3NlY3JldCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdTZWNyZXQnLFxuICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzZWNyZXQgdXNlZCB0byBnZW5lcmF0ZSB0aGUgVE9UUCBjb2RlLicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnYmFja3VwQ29kZXMnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0JhY2t1cCBDb2RlcycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAnVGhlIGJhY2t1cCBjb2RlcyB1c2VkIHRvIHJlY292ZXIgYWNjZXNzIHRvIHRoZSBhY2NvdW50IGlmIHRoZSB1c2VyIGxvc2VzIGFjY2VzcyB0byB0aGVpciBwaG9uZSBvciBlbWFpbCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2godHdvRmFjdG9yQ29sbGVjdGlvbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgYmV0dGVyQXV0aFBsdWdpblNsdWdzLm9hdXRoQWNjZXNzVG9rZW5zOlxuICAgICAgICBjb25zdCBvYXV0aEFjY2Vzc1Rva2VuQ29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhBY2Nlc3NUb2tlbnMsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy5oaWRlUGx1Z2luQ29sbGVjdGlvbnMgPz8gZmFsc2UsXG4gICAgICAgICAgICB1c2VBc1RpdGxlOiAnYWNjZXNzVG9rZW4nLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPQXV0aCBhY2Nlc3MgdG9rZW5zIGZvciBjdXN0b20gT0F1dGggY2xpZW50cycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2FjY2Vzc1Rva2VuJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnQWNjZXNzIFRva2VuJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FjY2VzcyB0b2tlbiBpc3N1ZWQgdG8gdGhlIGNsaWVudCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVmcmVzaFRva2VuJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZWZyZXNoIFRva2VuJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1JlZnJlc2ggdG9rZW4gaXNzdWVkIHRvIHRoZSBjbGllbnQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2FjY2Vzc1Rva2VuRXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdBY2Nlc3MgVG9rZW4gRXhwaXJlcyBBdCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdFeHBpcmF0aW9uIGRhdGUgb2YgdGhlIGFjY2VzcyB0b2tlbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAncmVmcmVzaFRva2VuRXhwaXJlc0F0JyxcbiAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdSZWZyZXNoIFRva2VuIEV4cGlyZXMgQXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnRXhwaXJhdGlvbiBkYXRlIG9mIHRoZSByZWZyZXNoIHRva2VuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdjbGllbnQnLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogYmV0dGVyQXV0aFBsdWdpblNsdWdzLm9hdXRoQXBwbGljYXRpb25zLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdDbGllbnQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT0F1dGggYXBwbGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3VzZXInLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1VzZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnc2NvcGVzJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdTY29wZXMnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygc2NvcGVzIGdyYW50ZWQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpbWVzdGFtcHM6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgZW5oYW5jZWRDb2xsZWN0aW9ucy5wdXNoKG9hdXRoQWNjZXNzVG9rZW5Db2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhBcHBsaWNhdGlvbnM6XG4gICAgICAgIGNvbnN0IG9hdXRoQXBwbGljYXRpb25Db2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgIHNsdWc6IGJldHRlckF1dGhQbHVnaW5TbHVncy5vYXV0aEFwcGxpY2F0aW9ucyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICduYW1lJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT0F1dGggYXBwbGljYXRpb25zIGFyZSBjdXN0b20gT0F1dGggY2xpZW50cycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2NsaWVudElkJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICB1bmlxdWU6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdDbGllbnQgSUQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggT0F1dGggY2xpZW50JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdjbGllbnRTZWNyZXQnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0NsaWVudCBTZWNyZXQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU2VjcmV0IGtleSBmb3IgdGhlIE9BdXRoIGNsaWVudCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ05hbWUnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgT0F1dGggYXBwbGljYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3JlZGlyZWN0VVJMcycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgVVJMcycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWRpcmVjdCBVUkxzJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdtZXRhZGF0YScsXG4gICAgICAgICAgICAgIHR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgbWV0YWRhdGEgZm9yIHRoZSBPQXV0aCBhcHBsaWNhdGlvbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAndHlwZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVHlwZScsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUeXBlIG9mIE9BdXRoIGNsaWVudCAoZS5nLiwgd2ViLCBtb2JpbGUpJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdkaXNhYmxlZCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0Rpc2FibGVkJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0luZGljYXRlcyBpZiB0aGUgY2xpZW50IGlzIGRpc2FibGVkJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdpY29uJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICBsYWJlbDogJ0ljb24nLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnSWNvbiBvZiB0aGUgT0F1dGggYXBwbGljYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3VzZXInLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdVc2VyJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0lEIG9mIHRoZSB1c2VyIHdobyBvd25zIHRoZSBjbGllbnQuIChvcHRpb25hbCknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRpbWVzdGFtcHM6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgZW5oYW5jZWRDb2xsZWN0aW9ucy5wdXNoKG9hdXRoQXBwbGljYXRpb25Db2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhDb25zZW50czpcbiAgICAgICAgY29uc3Qgb2F1dGhDb25zZW50Q29sbGVjdGlvbjogQ29sbGVjdGlvbkNvbmZpZyA9IHtcbiAgICAgICAgICBzbHVnOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhDb25zZW50cyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT0F1dGggY29uc2VudHMgYXJlIHVzZWQgdG8gc3RvcmUgdXNlciBjb25zZW50cyBmb3IgT0F1dGggY2xpZW50cycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZWxhdGlvbnNoaXAnLFxuICAgICAgICAgICAgICByZWxhdGlvblRvOiBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3Mub2F1dGhBcHBsaWNhdGlvbnMsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0NsaWVudCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPQXV0aCBjbGllbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zZW50JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdVc2VyJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zZW50JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdzY29wZXMnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1Njb3BlcycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBzY29wZXMgY29uc2VudGVkIHRvJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdjb25zZW50R2l2ZW4nLFxuICAgICAgICAgICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdDb25zZW50IEdpdmVuJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1x0SW5kaWNhdGVzIGlmIGNvbnNlbnQgd2FzIGdpdmVuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aW1lc3RhbXBzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaChvYXV0aENvbnNlbnRDb2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBiZXR0ZXJBdXRoUGx1Z2luU2x1Z3MucGFzc2tleXM6XG4gICAgICAgIGNvbnN0IHBhc3NrZXlDb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgIHNsdWc6IGJldHRlckF1dGhQbHVnaW5TbHVncy5wYXNza2V5cyxcbiAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgaGlkZGVuOiBwbHVnaW5PcHRpb25zLmhpZGVQbHVnaW5Db2xsZWN0aW9ucyA/PyBmYWxzZSxcbiAgICAgICAgICAgIHVzZUFzVGl0bGU6ICduYW1lJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnUGFzc2tleXMgYXJlIHVzZWQgdG8gYXV0aGVudGljYXRlIHVzZXJzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnbmFtZScsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgbGFiZWw6ICdOYW1lJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBuYW1lIG9mIHRoZSBwYXNza2V5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdwdWJsaWNLZXknLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBpbmRleDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdQdWJsaWMgS2V5JyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwdWJsaWMga2V5IG9mIHRoZSBwYXNza2V5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICd1c2VyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgICAgIHJlbGF0aW9uVG86IHVzZXJTbHVnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5kZXg6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVXNlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdXNlciB0aGF0IHRoZSBwYXNza2V5IGJlbG9uZ3MgdG8nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2NyZWRlbnRpYWxJRCcsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdDcmVkZW50aWFsIElEJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVnaXN0ZXJlZCBjcmVkZW50aWFsJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdjb3VudGVyJyxcbiAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0NvdW50ZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGNvdW50ZXIgb2YgdGhlIHBhc3NrZXknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2RldmljZVR5cGUnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0RldmljZSBUeXBlJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0eXBlIG9mIGRldmljZSB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBwYXNza2V5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG5hbWU6ICdiYWNrZWRVcCcsXG4gICAgICAgICAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0JhY2tlZCBVcCcsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHRoZSBwYXNza2V5IGlzIGJhY2tlZCB1cCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAndHJhbnNwb3J0cycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnVHJhbnNwb3J0cycsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdHJhbnNwb3J0cyB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBwYXNza2V5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB0aW1lc3RhbXBzOiB0cnVlLFxuICAgICAgICB9XG4gICAgICAgIGVuaGFuY2VkQ29sbGVjdGlvbnMucHVzaChwYXNza2V5Q29sbGVjdGlvbilcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgYmV0dGVyQXV0aFBsdWdpblNsdWdzLnNzb1Byb3ZpZGVyczpcbiAgICAgICAgY29uc3Qgc3NvUHJvdmlkZXJDb2xsZWN0aW9uOiBDb2xsZWN0aW9uQ29uZmlnID0ge1xuICAgICAgICAgIHNsdWc6IGJldHRlckF1dGhQbHVnaW5TbHVncy5zc29Qcm92aWRlcnMsXG4gICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgIGhpZGRlbjogcGx1Z2luT3B0aW9ucy5oaWRlUGx1Z2luQ29sbGVjdGlvbnMgPz8gZmFsc2UsXG4gICAgICAgICAgICB1c2VBc1RpdGxlOiAnaXNzdWVyJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnU1NPIHByb3ZpZGVycyBhcmUgdXNlZCB0byBhdXRoZW50aWNhdGUgdXNlcnMgd2l0aCBhbiBleHRlcm5hbCBwcm92aWRlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2lzc3VlcicsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGluZGV4OiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ0lzc3VlcicsXG4gICAgICAgICAgICAgIGFkbWluOiB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgaXNzdWVyIG9mIHRoZSBTU08gcHJvdmlkZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2RvbWFpbicsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnRG9tYWluJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBkb21haW4gb2YgdGhlIFNTTyBwcm92aWRlcicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuYW1lOiAnb2lkY0NvbmZpZycsXG4gICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGxhYmVsOiAnT0lEQyBDb25maWcnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIE9JREMgY29uZmlnIG9mIHRoZSBTU08gcHJvdmlkZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3VzZXInLFxuICAgICAgICAgICAgICB0eXBlOiAncmVsYXRpb25zaGlwJyxcbiAgICAgICAgICAgICAgcmVsYXRpb25UbzogdXNlclNsdWcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1VzZXInLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBTU08gcHJvdmlkZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ3Byb3ZpZGVySWQnLFxuICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBsYWJlbDogJ1Byb3ZpZGVyIElEJyxcbiAgICAgICAgICAgICAgYWRtaW46IHtcbiAgICAgICAgICAgICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICdUaGUgcHJvdmlkZXIgaWQuIFVzZWQgdG8gaWRlbnRpZnkgYSBwcm92aWRlciBhbmQgdG8gZ2VuZXJhdGUgYSByZWRpcmVjdCB1cmwnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ29yZ2FuaXphdGlvbklkJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdPcmdhbml6YXRpb24gSUQnLFxuICAgICAgICAgICAgICBhZG1pbjoge1xuICAgICAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG9yZ2FuaXphdGlvbiBJZC4gSWYgcHJvdmlkZXIgaXMgbGlua2VkIHRvIGFuIG9yZ2FuaXphdGlvbicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdGltZXN0YW1wczogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICBlbmhhbmNlZENvbGxlY3Rpb25zLnB1c2goc3NvUHJvdmlkZXJDb2xsZWN0aW9uKVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH0pXG5cbiAgY29uc3QgcmVzdE9mQ29sbGVjdGlvbnMgPSBpbmNvbWluZ0NvbGxlY3Rpb25zLmZpbHRlcigoY29sbGVjdGlvbikgPT4ge1xuICAgIHJldHVybiAhZW5oYW5jZWRDb2xsZWN0aW9ucy5zb21lKFxuICAgICAgKGVuaGFuY2VkQ29sbGVjdGlvbikgPT4gZW5oYW5jZWRDb2xsZWN0aW9uLnNsdWcgPT09IGNvbGxlY3Rpb24uc2x1ZyxcbiAgICApXG4gIH0pXG5cbiAgcmV0dXJuIFsuLi5lbmhhbmNlZENvbGxlY3Rpb25zLCAuLi5yZXN0T2ZDb2xsZWN0aW9uc11cbn1cbiJdLCJuYW1lcyI6WyJiYXNlQ29sbGVjdGlvblNsdWdzIiwiYmV0dGVyQXV0aFBsdWdpblNsdWdzIiwiYmV0dGVyQXV0aFN0cmF0ZWd5IiwiZ2V0QWZ0ZXJMb2dvdXRIb29rIiwiZ2V0UmVmcmVzaFRva2VuRW5kcG9pbnQiLCJpc0FkbWluT3JDdXJyZW50VXNlclVwZGF0ZVdpdGhBbGxvd2VkRmllbGRzIiwiaXNBZG1pbk9yQ3VycmVudFVzZXJXaXRoUm9sZXMiLCJpc0FkbWluV2l0aFJvbGVzIiwiY2xlYW5VcFVzZXJBZnRlckRlbGV0ZSIsImdldFN5bmNQYXNzd29yZFRvVXNlckhvb2siLCJnZXRTeW5jQWNjb3VudEhvb2siLCJvblZlcmlmaWVkQ2hhbmdlIiwiZ2V0QWZ0ZXJMb2dpbkhvb2siLCJnZXRCZWZvcmVMb2dpbkhvb2siLCJidWlsZENvbGxlY3Rpb25Db25maWdzIiwiaW5jb21pbmdDb2xsZWN0aW9ucyIsInJlcXVpcmVkQ29sbGVjdGlvblNsdWdzIiwicGx1Z2luT3B0aW9ucyIsInNhbml0aXplZEJBT3B0aW9ucyIsInVzZXJTbHVnIiwidXNlcnMiLCJzbHVnIiwiYWNjb3VudFNsdWciLCJhY2NvdW50cyIsInNlc3Npb25TbHVnIiwic2Vzc2lvbnMiLCJ2ZXJpZmljYXRpb25TbHVnIiwidmVyaWZpY2F0aW9ucyIsImJhUGx1Z2lucyIsInBsdWdpbnMiLCJhZG1pblJvbGVzIiwiZ2V0VGltZXN0YW1wRmllbGRzIiwic2F2ZVVwZGF0ZWRBdFRvSldUIiwic2F2ZUNyZWF0ZWRBdFRvSldUIiwibmFtZSIsInR5cGUiLCJzYXZlVG9KV1QiLCJhZG1pbiIsImRpc2FibGVCdWxrRWRpdCIsImhpZGRlbiIsImluZGV4IiwibGFiZWwiLCJ0IiwiZW5oYW5jZWRDb2xsZWN0aW9ucyIsImZvckVhY2giLCJleGlzdGluZ1VzZXJDb2xsZWN0aW9uIiwiZmluZCIsImNvbGxlY3Rpb24iLCJhbGxvd2VkRmllbGRzIiwidXNlcnNDb2xsZWN0aW9uIiwiZGVmYXVsdENvbHVtbnMiLCJ1c2VBc1RpdGxlIiwiYWNjZXNzIiwicmVxIiwiaW5jbHVkZXMiLCJ1c2VyIiwicm9sZSIsInJlYWQiLCJpZEZpZWxkIiwiY3JlYXRlIiwiZGVsZXRlIiwidXBkYXRlIiwiZW5kcG9pbnRzIiwiaG9va3MiLCJiZWZvcmVDaGFuZ2UiLCJhZnRlckNoYW5nZSIsImJlZm9yZUxvZ2luIiwiYWZ0ZXJMb2dpbiIsInNlc3Npb25zQ29sbGVjdGlvblNsdWciLCJ1c2Vyc0NvbGxlY3Rpb25TbHVnIiwiYWZ0ZXJMb2dvdXQiLCJhZnRlckRlbGV0ZSIsImFyZ3MiLCJhdXRoIiwic3RyYXRlZ2llcyIsImZpZWxkcyIsInBvc2l0aW9uIiwiY29tcG9uZW50cyIsIkZpZWxkIiwicGF0aCIsImNsaWVudFByb3BzIiwiY29uZGl0aW9uIiwic29tZSIsInBsdWdpbiIsImlkIiwiZGVzY3JpcHRpb24iLCJyZXF1aXJlZCIsInVuaXF1ZSIsImRlZmF1bHRWYWx1ZSIsIm9wdGlvbnMiLCJyb2xlcyIsInZhbHVlIiwibWFwIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInB1c2giLCJyZWFkT25seSIsImNvbGxlY3Rpb25PdmVycmlkZXMiLCJleGlzdGluZ0FjY291bnRDb2xsZWN0aW9uIiwiYWNjb3VudENvbGxlY3Rpb24iLCJyZWxhdGlvblRvIiwiZXhpc3RpbmdTZXNzaW9uQ29sbGVjdGlvbiIsInNlc3Npb25Db2xsZWN0aW9uIiwib3JnYW5pemF0aW9ucyIsImV4aXN0aW5nVmVyaWZpY2F0aW9uQ29sbGVjdGlvbiIsInZlcmlmaWNhdGlvbkNvbGxlY3Rpb24iLCJ0aW1lc3RhbXBzIiwib3JnYW5pemF0aW9uQ29sbGVjdGlvbiIsImhpZGVQbHVnaW5Db2xsZWN0aW9ucyIsIm1lbWJlcnMiLCJtZW1iZXJDb2xsZWN0aW9uIiwidGVhbXMiLCJpbnZpdGF0aW9ucyIsImludml0YXRpb25Db2xsZWN0aW9uIiwidGVhbUNvbGxlY3Rpb24iLCJqd2tzIiwiandrc0NvbGxlY3Rpb24iLCJhcGlLZXlzIiwiYXBpS2V5Q29sbGVjdGlvbiIsInR3b0ZhY3RvcnMiLCJ0d29GYWN0b3JDb2xsZWN0aW9uIiwib2F1dGhBY2Nlc3NUb2tlbnMiLCJvYXV0aEFjY2Vzc1Rva2VuQ29sbGVjdGlvbiIsIm9hdXRoQXBwbGljYXRpb25zIiwib2F1dGhBcHBsaWNhdGlvbkNvbGxlY3Rpb24iLCJvYXV0aENvbnNlbnRzIiwib2F1dGhDb25zZW50Q29sbGVjdGlvbiIsInBhc3NrZXlzIiwicGFzc2tleUNvbGxlY3Rpb24iLCJzc29Qcm92aWRlcnMiLCJzc29Qcm92aWRlckNvbGxlY3Rpb24iLCJyZXN0T2ZDb2xsZWN0aW9ucyIsImZpbHRlciIsImVuaGFuY2VkQ29sbGVjdGlvbiJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsbUJBQW1CLEVBQUVDLHFCQUFxQixRQUFRLFdBQVU7QUFDckUsU0FBU0Msa0JBQWtCLFFBQVEsa0JBQWlCO0FBQ3BELFNBQVNDLGtCQUFrQixRQUFRLDBDQUF5QztBQUM1RSxTQUFTQyx1QkFBdUIsUUFBUSwrQ0FBOEM7QUFDdEYsU0FDRUMsMkNBQTJDLEVBQzNDQyw2QkFBNkIsRUFDN0JDLGdCQUFnQixRQUNYLG1CQUFrQjtBQUN6QixTQUFTQyxzQkFB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
|