@nlabs/reaktor 0.8.1 → 0.10.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/.prettierrc.js +4 -0
- package/README.md +10 -1
- package/coverage/actions/groups.ts.html +1039 -0
- package/coverage/actions/images.ts.html +2500 -0
- package/coverage/actions/index.html +131 -0
- package/coverage/actions/tags.ts.html +1000 -0
- package/coverage/adapters/arangoAdapter.ts.html +151 -0
- package/coverage/adapters/index.html +146 -0
- package/coverage/adapters/reaktorAdapter.ts.html +127 -0
- package/coverage/adapters/tagAdapter.ts.html +160 -0
- package/coverage/base.css +224 -0
- package/coverage/block-navigation.js +87 -0
- package/coverage/clover.xml +6 -0
- package/coverage/coverage-final.json +1 -0
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +221 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +101 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov.info +0 -0
- package/coverage/mocks/file.ts.html +118 -0
- package/coverage/mocks/group.ts.html +145 -0
- package/coverage/mocks/image.ts.html +136 -0
- package/coverage/mocks/index.html +146 -0
- package/coverage/mocks/post.ts.html +169 -0
- package/coverage/mocks/tag.ts.html +121 -0
- package/coverage/mocks/user.ts.html +268 -0
- package/coverage/prettify.css +1 -0
- package/coverage/prettify.js +2 -0
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +196 -0
- package/coverage/types/error.ts.html +145 -0
- package/coverage/types/index.html +116 -0
- package/coverage/utils/adapterUtils.ts.html +151 -0
- package/coverage/utils/analyticsUtils.ts.html +292 -0
- package/coverage/utils/arangodbUtils.ts.html +463 -0
- package/coverage/utils/index.html +146 -0
- package/dist/actions/apps.js +242 -0
- package/dist/actions/connections.js +90 -0
- package/dist/actions/conversations.js +350 -0
- package/dist/actions/dynamodb.js +150 -0
- package/dist/actions/email.js +152 -0
- package/dist/actions/files.js +283 -0
- package/dist/actions/groups.js +292 -0
- package/dist/actions/images.js +735 -0
- package/dist/actions/index.js +66 -0
- package/dist/actions/ios.js +164 -0
- package/dist/actions/locations.js +122 -0
- package/dist/actions/messages.js +208 -0
- package/dist/actions/notifications.js +59 -0
- package/dist/actions/payments.js +497 -0
- package/dist/actions/personas.js +110 -0
- package/dist/actions/posts.js +595 -0
- package/dist/actions/reactions.js +322 -0
- package/dist/actions/s3.js +133 -0
- package/dist/actions/search.js +90 -0
- package/dist/actions/sms.js +108 -0
- package/dist/actions/statistics.js +62 -0
- package/dist/actions/subscription.js +220 -0
- package/dist/actions/tags.js +292 -0
- package/dist/actions/users.js +784 -0
- package/dist/actions/websockets.js +174 -0
- package/dist/adapters/arangoAdapter.js +46 -0
- package/dist/adapters/fileAdapter.js +76 -0
- package/dist/adapters/imageAdapter.js +40 -0
- package/dist/adapters/messageAdapter.js +49 -0
- package/dist/adapters/postAdapter.js +70 -0
- package/dist/adapters/reaktorAdapter.js +44 -0
- package/dist/adapters/tagAdapter.js +50 -0
- package/dist/adapters/userAdapter.js +115 -0
- package/dist/config.js +125 -0
- package/dist/index.js +66 -0
- package/dist/lambdas/actions/websockets.js +132 -0
- package/dist/lambdas/authorizer.js +67 -0
- package/dist/lambdas/connection.js +91 -0
- package/dist/lambdas/utils/message.js +42 -0
- package/dist/lambdas/utils/websocket.js +105 -0
- package/dist/mocks/conversation.js +35 -0
- package/dist/mocks/file.js +38 -0
- package/dist/mocks/group.js +47 -0
- package/dist/mocks/image.js +44 -0
- package/dist/mocks/nlabs.png +0 -0
- package/dist/mocks/post.js +55 -0
- package/dist/mocks/tag.js +37 -0
- package/dist/mocks/user.js +88 -0
- package/dist/mutations/index.js +26 -0
- package/dist/mutations/locations.js +44 -0
- package/dist/mutations/messages.js +86 -0
- package/dist/mutations/personas.js +100 -0
- package/dist/mutations/posts.js +53 -0
- package/dist/mutations/reactions.js +51 -0
- package/dist/mutations/statistics.js +39 -0
- package/dist/mutations/subscriptions.js +56 -0
- package/dist/mutations/tags.js +120 -0
- package/dist/mutations/users.js +116 -0
- package/dist/objectTypes/app.js +173 -0
- package/dist/objectTypes/bankAccount.js +76 -0
- package/dist/objectTypes/connection.js +48 -0
- package/dist/objectTypes/conversation.js +77 -0
- package/dist/objectTypes/creditCard.js +86 -0
- package/dist/objectTypes/document.js +46 -0
- package/dist/objectTypes/error.js +46 -0
- package/dist/objectTypes/external.js +74 -0
- package/dist/objectTypes/file.js +100 -0
- package/dist/objectTypes/filter.js +43 -0
- package/dist/objectTypes/group.js +123 -0
- package/dist/objectTypes/iapSubscription.js +40 -0
- package/dist/objectTypes/image.js +129 -0
- package/dist/objectTypes/index.js +68 -0
- package/dist/objectTypes/location.js +109 -0
- package/dist/objectTypes/message.js +96 -0
- package/dist/objectTypes/passcode.js +42 -0
- package/dist/objectTypes/persona.js +87 -0
- package/dist/objectTypes/plan.js +95 -0
- package/dist/objectTypes/post.js +125 -0
- package/dist/objectTypes/reaction.js +61 -0
- package/dist/objectTypes/relation.js +49 -0
- package/dist/objectTypes/search.js +72 -0
- package/dist/objectTypes/statistics.js +39 -0
- package/dist/objectTypes/subscription.js +117 -0
- package/dist/objectTypes/tag.js +65 -0
- package/dist/objectTypes/user.js +144 -0
- package/dist/queries/index.js +33 -0
- package/dist/queries/locations.js +45 -0
- package/dist/queries/messages.js +52 -0
- package/dist/queries/posts.js +154 -0
- package/dist/queries/reactions.js +56 -0
- package/dist/queries/statistics.js +39 -0
- package/dist/queries/subscriptions.js +44 -0
- package/dist/queries/tags.js +75 -0
- package/dist/queries/users.js +64 -0
- package/dist/templates/email/layout.js +302 -0
- package/dist/templates/email/passwordForgot.js +38 -0
- package/dist/templates/email/passwordRecovery.js +35 -0
- package/dist/templates/email/verifyEmail.js +38 -0
- package/dist/templates/email/welcome.js +38 -0
- package/dist/templates/sms/passwordForgot.js +24 -0
- package/dist/templates/sms/passwordRecovery.js +24 -0
- package/dist/templates/sms/verifyEmail.js +24 -0
- package/dist/templates/sms/verifyPhone.js +24 -0
- package/dist/templates/sms/welcome.js +24 -0
- package/dist/types/apps.js +32 -0
- package/dist/types/arangodb.js +16 -0
- package/{lib → dist}/types/auth.js +1 -1
- package/{lib → dist}/types/connections.js +1 -1
- package/{lib → dist}/types/conversations.js +1 -1
- package/{lib → dist}/types/email.js +1 -1
- package/dist/types/error.js +44 -0
- package/{lib → dist}/types/files.js +1 -1
- package/dist/types/google.js +16 -0
- package/{lib → dist}/types/groups.js +1 -1
- package/dist/types/images.js +16 -0
- package/dist/types/index.js +60 -0
- package/{lib → dist}/types/locations.js +1 -1
- package/dist/types/messages.js +16 -0
- package/{lib → dist}/types/notifications.js +1 -1
- package/dist/types/payments.js +16 -0
- package/dist/types/personas.js +16 -0
- package/dist/types/posts.js +16 -0
- package/{lib → dist}/types/statistics.js +1 -1
- package/{lib → dist}/types/tags.js +1 -1
- package/dist/types/users.js +16 -0
- package/dist/types/websockets.js +16 -0
- package/dist/utils/adapterUtils.js +45 -0
- package/dist/utils/analyticsUtils.js +72 -0
- package/dist/utils/arangodbUtils.js +165 -0
- package/dist/utils/auth.js +57 -0
- package/dist/utils/index.js +30 -0
- package/dist/utils/session.js +60 -0
- package/jest.setup.js +0 -0
- package/jpg:- +0 -0
- package/lex.config.cjs +13 -0
- package/lib/actions/apps.d.ts +25 -0
- package/lib/actions/apps.js +242 -0
- package/lib/actions/connections.d.ts +4 -0
- package/lib/actions/connections.js +90 -0
- package/lib/actions/conversations.d.ts +12 -12
- package/lib/actions/conversations.js +147 -131
- package/lib/actions/dynamodb.d.ts +8 -8
- package/lib/actions/dynamodb.js +35 -32
- package/lib/actions/email.d.ts +3 -5
- package/lib/actions/email.js +33 -63
- package/lib/actions/files.d.ts +17 -14
- package/lib/actions/files.js +184 -202
- package/lib/actions/groups.d.ts +4 -4
- package/lib/actions/groups.js +47 -45
- package/lib/actions/images.d.ts +17 -13
- package/lib/actions/images.js +325 -264
- package/lib/actions/index.d.ts +3 -0
- package/lib/actions/index.js +7 -1
- package/lib/actions/ios.js +11 -10
- package/lib/actions/locations.d.ts +5 -2
- package/lib/actions/locations.js +41 -37
- package/lib/actions/messages.d.ts +4 -3
- package/lib/actions/messages.js +35 -32
- package/lib/actions/notifications.d.ts +2 -2
- package/lib/actions/notifications.js +1 -1
- package/lib/actions/payments.d.ts +2 -2
- package/lib/actions/payments.js +87 -83
- package/lib/actions/personas.d.ts +3 -0
- package/lib/actions/personas.js +110 -0
- package/lib/actions/posts.d.ts +11 -10
- package/lib/actions/posts.js +186 -152
- package/lib/actions/reactions.d.ts +5 -5
- package/lib/actions/reactions.js +30 -28
- package/lib/actions/s3.d.ts +7 -7
- package/lib/actions/s3.js +37 -32
- package/lib/actions/search.d.ts +3 -3
- package/lib/actions/search.js +13 -11
- package/lib/actions/sms.d.ts +9 -3
- package/lib/actions/sms.js +60 -34
- package/lib/actions/statistics.d.ts +3 -2
- package/lib/actions/statistics.js +21 -18
- package/lib/actions/subscription.d.ts +2 -2
- package/lib/actions/subscription.js +32 -39
- package/lib/actions/tags.d.ts +23 -20
- package/lib/actions/tags.js +161 -205
- package/lib/actions/users.d.ts +50 -22
- package/lib/actions/users.js +441 -217
- package/lib/actions/websockets.d.ts +19 -5
- package/lib/actions/websockets.js +89 -61
- package/lib/adapters/arangoAdapter.d.ts +2 -0
- package/lib/adapters/arangoAdapter.js +46 -0
- package/lib/adapters/fileAdapter.d.ts +3 -0
- package/lib/adapters/fileAdapter.js +76 -0
- package/lib/adapters/imageAdapter.d.ts +2 -0
- package/lib/adapters/imageAdapter.js +40 -0
- package/lib/adapters/messageAdapter.d.ts +2 -0
- package/lib/adapters/messageAdapter.js +49 -0
- package/lib/adapters/postAdapter.d.ts +2 -0
- package/lib/adapters/postAdapter.js +70 -0
- package/lib/adapters/reaktorAdapter.d.ts +6 -0
- package/lib/adapters/reaktorAdapter.js +44 -0
- package/lib/adapters/tagAdapter.d.ts +2 -0
- package/lib/adapters/tagAdapter.js +50 -0
- package/lib/adapters/userAdapter.d.ts +2 -0
- package/lib/adapters/userAdapter.js +115 -0
- package/lib/config.js +16 -17
- package/lib/index.d.ts +7 -0
- package/lib/index.js +44 -8
- package/lib/lambdas/actions/websockets.d.ts +7 -6
- package/lib/lambdas/actions/websockets.js +15 -11
- package/lib/lambdas/authorizer.js +4 -4
- package/lib/lambdas/connection.js +20 -20
- package/lib/lambdas/utils/message.js +1 -1
- package/lib/lambdas/utils/websocket.js +8 -7
- package/lib/mocks/conversation.d.ts +8 -0
- package/lib/mocks/conversation.js +35 -0
- package/lib/mocks/file.d.ts +11 -0
- package/lib/mocks/file.js +38 -0
- package/lib/mocks/group.d.ts +17 -0
- package/lib/mocks/group.js +47 -0
- package/lib/mocks/image.d.ts +3 -0
- package/lib/mocks/image.js +44 -0
- package/lib/mocks/nlabs.png +0 -0
- package/lib/mocks/post.d.ts +38 -0
- package/lib/mocks/post.js +55 -0
- package/lib/mocks/tag.d.ts +2 -0
- package/lib/mocks/tag.js +37 -0
- package/lib/mocks/user.d.ts +4 -0
- package/lib/mocks/user.js +88 -0
- package/lib/mutations/index.d.ts +3 -0
- package/lib/mutations/index.js +26 -0
- package/lib/mutations/locations.d.ts +2 -0
- package/lib/mutations/locations.js +44 -0
- package/lib/mutations/messages.d.ts +2 -0
- package/lib/mutations/messages.js +86 -0
- package/lib/mutations/personas.d.ts +2 -0
- package/lib/mutations/personas.js +100 -0
- package/lib/mutations/posts.d.ts +2 -0
- package/lib/mutations/posts.js +53 -0
- package/lib/mutations/reactions.d.ts +2 -0
- package/lib/mutations/reactions.js +51 -0
- package/lib/mutations/statistics.d.ts +2 -0
- package/lib/mutations/statistics.js +39 -0
- package/lib/mutations/subscriptions.d.ts +2 -0
- package/lib/mutations/subscriptions.js +56 -0
- package/lib/mutations/tags.d.ts +2 -0
- package/lib/mutations/tags.js +120 -0
- package/lib/mutations/users.d.ts +1 -0
- package/lib/mutations/users.js +116 -0
- package/lib/objectTypes/app.d.ts +3 -0
- package/lib/objectTypes/app.js +173 -0
- package/lib/objectTypes/bankAccount.d.ts +1 -0
- package/lib/objectTypes/bankAccount.js +76 -0
- package/lib/objectTypes/connection.d.ts +1 -0
- package/lib/objectTypes/connection.js +48 -0
- package/lib/objectTypes/conversation.d.ts +2 -0
- package/lib/objectTypes/conversation.js +77 -0
- package/lib/objectTypes/creditCard.d.ts +1 -0
- package/lib/objectTypes/creditCard.js +86 -0
- package/lib/objectTypes/document.d.ts +1 -0
- package/lib/objectTypes/document.js +46 -0
- package/lib/objectTypes/error.d.ts +1 -0
- package/lib/objectTypes/error.js +46 -0
- package/lib/objectTypes/external.d.ts +1 -0
- package/lib/objectTypes/external.js +74 -0
- package/lib/objectTypes/file.d.ts +2 -0
- package/lib/objectTypes/file.js +100 -0
- package/lib/objectTypes/filter.d.ts +1 -0
- package/lib/objectTypes/filter.js +43 -0
- package/lib/objectTypes/group.d.ts +3 -0
- package/lib/objectTypes/group.js +123 -0
- package/lib/objectTypes/iapSubscription.d.ts +1 -0
- package/lib/objectTypes/iapSubscription.js +40 -0
- package/lib/objectTypes/image.d.ts +2 -0
- package/lib/objectTypes/image.js +129 -0
- package/lib/objectTypes/index.d.ts +24 -0
- package/lib/objectTypes/index.js +68 -0
- package/lib/objectTypes/location.d.ts +2 -0
- package/lib/objectTypes/location.js +109 -0
- package/lib/objectTypes/message.d.ts +2 -0
- package/lib/objectTypes/message.js +96 -0
- package/lib/objectTypes/passcode.d.ts +1 -0
- package/lib/objectTypes/passcode.js +42 -0
- package/lib/objectTypes/persona.d.ts +3 -0
- package/lib/objectTypes/persona.js +87 -0
- package/lib/objectTypes/plan.d.ts +2 -0
- package/lib/objectTypes/plan.js +95 -0
- package/lib/objectTypes/post.d.ts +2 -0
- package/lib/objectTypes/post.js +125 -0
- package/lib/objectTypes/reaction.d.ts +2 -0
- package/lib/objectTypes/reaction.js +61 -0
- package/lib/objectTypes/relation.d.ts +1 -0
- package/lib/objectTypes/relation.js +49 -0
- package/lib/objectTypes/search.d.ts +1 -0
- package/lib/objectTypes/search.js +72 -0
- package/lib/objectTypes/statistics.d.ts +1 -0
- package/lib/objectTypes/statistics.js +39 -0
- package/lib/objectTypes/subscription.d.ts +2 -0
- package/lib/objectTypes/subscription.js +117 -0
- package/lib/objectTypes/tag.d.ts +2 -0
- package/lib/objectTypes/tag.js +65 -0
- package/lib/objectTypes/user.d.ts +4 -0
- package/lib/objectTypes/user.js +144 -0
- package/lib/queries/index.d.ts +3 -0
- package/lib/queries/index.js +33 -0
- package/lib/queries/locations.d.ts +2 -0
- package/lib/queries/locations.js +45 -0
- package/lib/queries/messages.d.ts +2 -0
- package/lib/queries/messages.js +52 -0
- package/lib/queries/posts.d.ts +2 -0
- package/lib/queries/posts.js +154 -0
- package/lib/queries/reactions.d.ts +2 -0
- package/lib/queries/reactions.js +56 -0
- package/lib/queries/statistics.d.ts +2 -0
- package/lib/queries/statistics.js +39 -0
- package/lib/queries/subscriptions.d.ts +2 -0
- package/lib/queries/subscriptions.js +44 -0
- package/lib/queries/tags.d.ts +2 -0
- package/lib/queries/tags.js +75 -0
- package/lib/queries/users.d.ts +1 -0
- package/lib/queries/users.js +64 -0
- package/lib/types/{apps.d.ts → apps.types.d.ts} +19 -17
- package/lib/types/apps.types.js +32 -0
- package/lib/types/arangodb.types.d.ts +34 -0
- package/lib/types/arangodb.types.js +16 -0
- package/lib/types/auth.types.d.ts +9 -0
- package/lib/types/auth.types.js +16 -0
- package/lib/types/connections.types.d.ts +5 -0
- package/lib/types/connections.types.js +16 -0
- package/lib/types/conversations.types.d.ts +27 -0
- package/lib/types/conversations.types.js +16 -0
- package/lib/types/email.types.d.ts +13 -0
- package/lib/types/email.types.js +16 -0
- package/lib/types/error.types.d.ts +20 -0
- package/lib/types/error.types.js +44 -0
- package/lib/types/{files.d.ts → files.types.d.ts} +9 -12
- package/lib/types/files.types.js +16 -0
- package/lib/types/google.types.d.ts +29 -0
- package/lib/types/google.types.js +16 -0
- package/lib/types/{groups.d.ts → groups.types.d.ts} +6 -10
- package/lib/types/groups.types.js +16 -0
- package/lib/types/images.types.d.ts +52 -0
- package/lib/types/images.types.js +16 -0
- package/lib/types/index.d.ts +20 -18
- package/lib/types/index.js +41 -37
- package/lib/types/{locations.d.ts → locations.types.d.ts} +4 -6
- package/lib/types/locations.types.js +16 -0
- package/lib/types/messages.types.d.ts +16 -0
- package/lib/types/messages.types.js +16 -0
- package/lib/types/notifications.types.d.ts +19 -0
- package/lib/types/notifications.types.js +16 -0
- package/lib/types/{payments.d.ts → payments.types.d.ts} +13 -19
- package/lib/types/payments.types.js +16 -0
- package/lib/types/personas.types.d.ts +32 -0
- package/lib/types/personas.types.js +16 -0
- package/lib/types/posts.types.d.ts +28 -0
- package/lib/types/posts.types.js +16 -0
- package/lib/types/statistics.types.d.ts +3 -0
- package/lib/types/statistics.types.js +16 -0
- package/lib/types/tags.types.d.ts +15 -0
- package/lib/types/tags.types.js +16 -0
- package/lib/types/{users.d.ts → users.types.d.ts} +21 -22
- package/lib/types/users.types.js +16 -0
- package/lib/types/{websocket.d.ts → websockets.types.d.ts} +7 -3
- package/lib/types/websockets.types.js +16 -0
- package/lib/utils/adapterUtils.d.ts +1 -0
- package/lib/utils/adapterUtils.js +45 -0
- package/lib/utils/analyticsUtils.d.ts +21 -0
- package/lib/utils/analyticsUtils.js +72 -0
- package/lib/utils/arangodbUtils.d.ts +66 -0
- package/lib/utils/arangodbUtils.js +165 -0
- package/lib/utils/auth.d.ts +19 -3
- package/lib/utils/auth.js +20 -30
- package/lib/utils/index.d.ts +3 -4
- package/lib/utils/index.js +7 -9
- package/lib/utils/session.d.ts +10 -10
- package/lib/utils/session.js +15 -3
- package/lib/utils/stripeUtils.d.ts +3 -0
- package/lib/utils/{graphql.js → stripeUtils.js} +12 -15
- package/package.json +38 -30
- package/lib/types/apps.js +0 -16
- package/lib/types/arangodb.d.ts +0 -17
- package/lib/types/arangodb.js +0 -16
- package/lib/types/auth.d.ts +0 -7
- package/lib/types/connections.d.ts +0 -8
- package/lib/types/conversations.d.ts +0 -16
- package/lib/types/email.d.ts +0 -12
- package/lib/types/google.d.ts +0 -27
- package/lib/types/google.js +0 -16
- package/lib/types/images.d.ts +0 -42
- package/lib/types/images.js +0 -16
- package/lib/types/messages.d.ts +0 -27
- package/lib/types/messages.js +0 -16
- package/lib/types/notifications.d.ts +0 -19
- package/lib/types/payments.js +0 -16
- package/lib/types/posts.d.ts +0 -47
- package/lib/types/posts.js +0 -16
- package/lib/types/statistics.d.ts +0 -3
- package/lib/types/tags.d.ts +0 -15
- package/lib/types/users.js +0 -16
- package/lib/types/websocket.js +0 -16
- package/lib/utils/analytics.d.ts +0 -14
- package/lib/utils/analytics.js +0 -88
- package/lib/utils/arangodb.d.ts +0 -9
- package/lib/utils/arangodb.js +0 -118
- package/lib/utils/graphql.d.ts +0 -1
- package/lib/utils/objects.d.ts +0 -3
- package/lib/utils/objects.js +0 -59
package/lib/actions/posts.js
CHANGED
|
@@ -18,7 +18,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
18
18
|
var posts_exports = {};
|
|
19
19
|
__export(posts_exports, {
|
|
20
20
|
addPost: () => addPost,
|
|
21
|
-
cleanPosts: () => cleanPosts,
|
|
22
21
|
createPostEdge: () => createPostEdge,
|
|
23
22
|
deletePost: () => deletePost,
|
|
24
23
|
getPost: () => getPost,
|
|
@@ -35,9 +34,11 @@ __export(posts_exports, {
|
|
|
35
34
|
module.exports = __toCommonJS(posts_exports);
|
|
36
35
|
var import_utils = require("@nlabs/utils");
|
|
37
36
|
var import_arangojs = require("arangojs");
|
|
38
|
-
var import_utils2 = require("../utils");
|
|
39
|
-
var import_files = require("./files");
|
|
40
37
|
var import_tags = require("./tags");
|
|
38
|
+
var import_postAdapter = require("../adapters/postAdapter");
|
|
39
|
+
var import_error = require("../types/error.types");
|
|
40
|
+
var import_analyticsUtils = require("../utils/analyticsUtils");
|
|
41
|
+
var import_arangodbUtils = require("../utils/arangodbUtils");
|
|
41
42
|
const MAX_CONTENT_LENGTH = 1e5;
|
|
42
43
|
const eventCategory = "posts";
|
|
43
44
|
const parsePostOptions = (options = {}) => {
|
|
@@ -50,12 +51,12 @@ const parsePostOptions = (options = {}) => {
|
|
|
50
51
|
} = options;
|
|
51
52
|
return {
|
|
52
53
|
latitude: (0, import_utils.parseNum)(latitude, 32),
|
|
53
|
-
limit: (0,
|
|
54
|
+
limit: (0, import_arangodbUtils.getLimit)(from, to),
|
|
54
55
|
longitude: (0, import_utils.parseNum)(longitude, 32),
|
|
55
56
|
type: (0, import_utils.parseChar)(type, 32)
|
|
56
57
|
};
|
|
57
58
|
};
|
|
58
|
-
const getPostOptional = (fields, sessionId) => fields.reduce((selects, field) => {
|
|
59
|
+
const getPostOptional = (fields, sessionId) => (fields || []).reduce((selects, field) => {
|
|
59
60
|
switch (field) {
|
|
60
61
|
case "hasRsvp": {
|
|
61
62
|
selects.queries.push(`LET hasRsvp = TO_BOOL(FIRST(
|
|
@@ -111,10 +112,10 @@ const getPostOptional = (fields, sessionId) => fields.reduce((selects, field) =>
|
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
114
|
}, { objects: [], queries: [] });
|
|
114
|
-
const getPost = (context,
|
|
115
|
+
const getPost = async (context, postId, options) => {
|
|
115
116
|
const action = "getPost";
|
|
116
117
|
const { database, fields, session: { userId: sessionId } } = context;
|
|
117
|
-
const formatItemId = (0, import_utils.parseId)(
|
|
118
|
+
const formatItemId = (0, import_utils.parseId)(postId);
|
|
118
119
|
const { type } = parsePostOptions(options);
|
|
119
120
|
const db = database;
|
|
120
121
|
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
@@ -122,19 +123,23 @@ const getPost = (context, itemId, options) => {
|
|
|
122
123
|
FILTER p._key == ${formatItemId} && p.type == ${type}
|
|
123
124
|
LIMIT 1
|
|
124
125
|
RETURN p`;
|
|
125
|
-
return db.query(aqlQry).then((cursor) => cursor.next()).then((post
|
|
126
|
+
return db.query(aqlQry).then((cursor) => cursor.next()).then((post) => {
|
|
126
127
|
const {
|
|
127
128
|
_id: postDocId,
|
|
129
|
+
userId,
|
|
128
130
|
groupId,
|
|
129
131
|
privacy = "default"
|
|
130
132
|
} = post;
|
|
131
133
|
let privacyAqlQry;
|
|
134
|
+
if (userId === sessionId) {
|
|
135
|
+
return post;
|
|
136
|
+
}
|
|
132
137
|
if (groupId && privacy === "group") {
|
|
133
138
|
privacyAqlQry = `LET p = DOCUMENT("${postDocId}")
|
|
134
139
|
${selectQueries.join("\n")}
|
|
135
140
|
FOR group IN groups
|
|
136
141
|
FILTER group._key == p.groupId
|
|
137
|
-
FOR u, e IN OUTBOUND group._id
|
|
142
|
+
FOR u, e IN OUTBOUND group._id hasConnection
|
|
138
143
|
FILTER u._key == "${sessionId}"
|
|
139
144
|
LIMIT 1
|
|
140
145
|
RETURN MERGE(p, {${selectObjects.join(", ")}})`;
|
|
@@ -145,20 +150,21 @@ const getPost = (context, itemId, options) => {
|
|
|
145
150
|
RETURN MERGE(p, {${selectObjects.join(", ")}})`;
|
|
146
151
|
}
|
|
147
152
|
if (privacyAqlQry) {
|
|
148
|
-
return db.query(privacyAqlQry).then((cursor) => cursor.next()
|
|
153
|
+
return db.query(privacyAqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
149
154
|
action,
|
|
150
155
|
category: eventCategory,
|
|
151
|
-
label:
|
|
152
|
-
}, error, context)
|
|
156
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
157
|
+
}, error, context));
|
|
153
158
|
}
|
|
154
159
|
return {};
|
|
155
|
-
}).catch((error) => (0,
|
|
160
|
+
}).catch((error) => (0, import_analyticsUtils.logError)({
|
|
156
161
|
action,
|
|
157
162
|
category: eventCategory,
|
|
158
|
-
label:
|
|
159
|
-
}, error, context)
|
|
163
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
164
|
+
}, error, context));
|
|
160
165
|
};
|
|
161
166
|
const getPostsByArea = (context, latitude, longitude, options) => {
|
|
167
|
+
const action = "getPostsByArea";
|
|
162
168
|
const { database, fields, session: { userId: sessionId } } = context;
|
|
163
169
|
const { limit, type } = parsePostOptions(options);
|
|
164
170
|
const formatLatitude = (0, import_utils.parseNum)(latitude);
|
|
@@ -178,11 +184,15 @@ const getPostsByArea = (context, latitude, longitude, options) => {
|
|
|
178
184
|
SORT distance, p.added
|
|
179
185
|
RETURN DISTINCT MERGE(p, {${selectObjects.join(", ")}})`;
|
|
180
186
|
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
|
|
181
|
-
|
|
187
|
+
(0, import_analyticsUtils.logError)({
|
|
188
|
+
action,
|
|
189
|
+
category: eventCategory,
|
|
190
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
191
|
+
}, error, context);
|
|
192
|
+
return [];
|
|
182
193
|
});
|
|
183
194
|
};
|
|
184
195
|
const getPostsByLatest = (context, options) => {
|
|
185
|
-
console.log("getPostsByLatest::options", options);
|
|
186
196
|
const { database, fields, session: { userId: sessionId } } = context;
|
|
187
197
|
const { limit, type } = parsePostOptions(options);
|
|
188
198
|
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
@@ -192,7 +202,6 @@ const getPostsByLatest = (context, options) => {
|
|
|
192
202
|
${limit.aql}
|
|
193
203
|
SORT p.added DESC
|
|
194
204
|
RETURN DISTINCT MERGE(p, {${selectObjects.join(", ")}})`;
|
|
195
|
-
console.log("getPostsByLatest::aqlQry", aqlQry);
|
|
196
205
|
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
|
|
197
206
|
throw error;
|
|
198
207
|
});
|
|
@@ -241,13 +250,17 @@ const getPostsByReactions = (context, reactions = [], options) => {
|
|
|
241
250
|
FILTER ${filters.join(" && ")}
|
|
242
251
|
${limit.aql}
|
|
243
252
|
RETURN DISTINCT MERGE(p, {${selectObjects.join(", ")}})`;
|
|
244
|
-
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) =>
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
253
|
+
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
|
|
254
|
+
(0, import_analyticsUtils.logError)({
|
|
255
|
+
action,
|
|
256
|
+
category: eventCategory,
|
|
257
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
258
|
+
}, error, context);
|
|
259
|
+
return [];
|
|
260
|
+
});
|
|
249
261
|
};
|
|
250
262
|
const getPostsByTags = (context, tags = [], options) => {
|
|
263
|
+
const action = "getPostsByTags";
|
|
251
264
|
const { database, fields, session: { userId: sessionId } } = context;
|
|
252
265
|
const { latitude, limit, longitude, type } = parsePostOptions(options);
|
|
253
266
|
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
@@ -290,10 +303,17 @@ const getPostsByTags = (context, tags = [], options) => {
|
|
|
290
303
|
${limit.aql}
|
|
291
304
|
SORT ${sortBy.join(", ")}
|
|
292
305
|
RETURN DISTINCT MERGE(p, {${selectObjects.join(", ")}})`;
|
|
293
|
-
|
|
294
|
-
|
|
306
|
+
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
|
|
307
|
+
(0, import_analyticsUtils.logError)({
|
|
308
|
+
action,
|
|
309
|
+
category: eventCategory,
|
|
310
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
311
|
+
}, error, context);
|
|
312
|
+
return [];
|
|
313
|
+
});
|
|
295
314
|
};
|
|
296
315
|
const getPostsByUser = (context, userId, options) => {
|
|
316
|
+
const action = "getPostsByUser";
|
|
297
317
|
const { database, fields, session: { userId: sessionId } } = context;
|
|
298
318
|
const { limit, type } = parsePostOptions(options);
|
|
299
319
|
const formatUserId = (0, import_utils.parseId)(userId);
|
|
@@ -305,23 +325,28 @@ const getPostsByUser = (context, userId, options) => {
|
|
|
305
325
|
SORT p.added
|
|
306
326
|
RETURN DISTINCT MERGE(p, {${selectObjects.join(", ")}})`;
|
|
307
327
|
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => {
|
|
308
|
-
|
|
328
|
+
(0, import_analyticsUtils.logError)({
|
|
329
|
+
action,
|
|
330
|
+
category: eventCategory,
|
|
331
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
332
|
+
}, error, context);
|
|
333
|
+
return [];
|
|
309
334
|
});
|
|
310
335
|
};
|
|
311
|
-
const getPostComments = (context,
|
|
336
|
+
const getPostComments = (context, postId, options) => {
|
|
337
|
+
const action = "getPostComments";
|
|
312
338
|
const { database, session: { userId: sessionId } } = context;
|
|
313
339
|
const { limit, type } = parsePostOptions(options);
|
|
314
|
-
const formatItemId = (0, import_utils.parseId)(
|
|
315
|
-
const db = database;
|
|
340
|
+
const formatItemId = (0, import_utils.parseId)(postId);
|
|
316
341
|
const aqlQry = import_arangojs.aql`FOR p IN posts
|
|
317
342
|
FILTER p.type == ${type} && p._key == ${formatItemId}
|
|
318
343
|
LIMIT 1
|
|
319
344
|
RETURN p`;
|
|
320
|
-
return
|
|
345
|
+
return database.query(aqlQry).then((cursor) => cursor.next()).then((post) => {
|
|
321
346
|
const {
|
|
322
347
|
_key,
|
|
323
348
|
groupId,
|
|
324
|
-
privacy = "
|
|
349
|
+
privacy = "default"
|
|
325
350
|
} = post;
|
|
326
351
|
let privacyAqlQry;
|
|
327
352
|
if (groupId && privacy === "group") {
|
|
@@ -335,7 +360,7 @@ const getPostComments = (context, itemId, options) => {
|
|
|
335
360
|
)
|
|
336
361
|
FOR group IN groups
|
|
337
362
|
FILTER group._key == p.groupId
|
|
338
|
-
FOR u, e IN OUTBOUND group._id
|
|
363
|
+
FOR u, e IN OUTBOUND group._id hasConnection
|
|
339
364
|
FILTER u._key == "${sessionId}"
|
|
340
365
|
SORT p.added
|
|
341
366
|
${limit.aql}
|
|
@@ -354,34 +379,46 @@ const getPostComments = (context, itemId, options) => {
|
|
|
354
379
|
RETURN MERGE(p, {user: user, reactions: reactions})`;
|
|
355
380
|
}
|
|
356
381
|
if (privacyAqlQry) {
|
|
357
|
-
return
|
|
358
|
-
|
|
382
|
+
return database.query(privacyAqlQry).then((cursor) => cursor.all()).catch((error) => {
|
|
383
|
+
(0, import_analyticsUtils.logError)({
|
|
384
|
+
action,
|
|
385
|
+
category: eventCategory,
|
|
386
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
387
|
+
}, error, context);
|
|
388
|
+
return [];
|
|
359
389
|
});
|
|
360
390
|
}
|
|
361
391
|
return [];
|
|
362
392
|
}).catch((error) => {
|
|
363
|
-
|
|
393
|
+
(0, import_analyticsUtils.logError)({
|
|
394
|
+
action,
|
|
395
|
+
category: eventCategory,
|
|
396
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
397
|
+
}, error, context);
|
|
398
|
+
return [];
|
|
364
399
|
});
|
|
365
400
|
};
|
|
366
|
-
const addPost = async (context,
|
|
401
|
+
const addPost = async (context, {
|
|
402
|
+
content = "",
|
|
403
|
+
endDate,
|
|
404
|
+
groupId = "",
|
|
405
|
+
location,
|
|
406
|
+
latitude,
|
|
407
|
+
longitude,
|
|
408
|
+
name = "",
|
|
409
|
+
parentId = null,
|
|
410
|
+
privacy = "public",
|
|
411
|
+
tags = [],
|
|
412
|
+
startDate,
|
|
413
|
+
type = "default"
|
|
414
|
+
}) => {
|
|
415
|
+
const action = "addPost";
|
|
367
416
|
const { database, session: { userId: sessionId } } = context;
|
|
368
|
-
const {
|
|
369
|
-
content = "",
|
|
370
|
-
endDate,
|
|
371
|
-
groupId = "",
|
|
372
|
-
location,
|
|
373
|
-
latitude,
|
|
374
|
-
longitude,
|
|
375
|
-
name = "",
|
|
376
|
-
parentId = null,
|
|
377
|
-
privacy = "public",
|
|
378
|
-
tags = [],
|
|
379
|
-
startDate,
|
|
380
|
-
type = "default"
|
|
381
|
-
} = post;
|
|
382
417
|
const now = Date.now();
|
|
418
|
+
const postId = (0, import_utils.createHash)(`post-${sessionId}`);
|
|
383
419
|
const insert = {
|
|
384
|
-
|
|
420
|
+
_id: `posts/${postId}`,
|
|
421
|
+
_key: postId,
|
|
385
422
|
added: now,
|
|
386
423
|
content: (0, import_utils.parseString)(content, MAX_CONTENT_LENGTH),
|
|
387
424
|
endDate: endDate ? (0, import_utils.parseNum)(endDate, 13) : void 0,
|
|
@@ -392,24 +429,34 @@ const addPost = async (context, post) => {
|
|
|
392
429
|
modified: now,
|
|
393
430
|
name: (0, import_utils.parseString)(name, 160),
|
|
394
431
|
parentId: parentId ? (0, import_utils.parseId)(parentId) : void 0,
|
|
395
|
-
privacy:
|
|
432
|
+
privacy: (0, import_utils.parseVarChar)(privacy, 16),
|
|
396
433
|
startDate: startDate ? (0, import_utils.parseNum)(startDate, 13) : void 0,
|
|
397
434
|
type: (0, import_utils.parseChar)(type, 32),
|
|
398
435
|
userId: sessionId
|
|
399
436
|
};
|
|
400
|
-
const db = database;
|
|
401
437
|
const aqlQry = import_arangojs.aql`INSERT ${insert} IN posts RETURN NEW`;
|
|
402
438
|
try {
|
|
403
|
-
const savedPost = await
|
|
439
|
+
const savedPost = await database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
440
|
+
action,
|
|
441
|
+
category: eventCategory,
|
|
442
|
+
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
443
|
+
}, error, context));
|
|
404
444
|
const { _id: postDocId } = savedPost;
|
|
405
|
-
|
|
406
|
-
if (tags
|
|
407
|
-
const
|
|
408
|
-
|
|
409
|
-
await (0, import_tags.
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
445
|
+
const contentTagNames = await (0, import_tags.extractTags)(insert.content);
|
|
446
|
+
if (tags.length || contentTagNames.length) {
|
|
447
|
+
const userTags = (await (0, import_tags.getTagsByName)(context, tags.map(({ name: name2 }) => name2))).map((tag) => ({ ...tag, tagBy: sessionId }));
|
|
448
|
+
const contentTags = (await (0, import_tags.getTagsByName)(context, contentTagNames)).map((tag) => ({ ...tag, tagBy: "extract" }));
|
|
449
|
+
const updatedTags = await (0, import_tags.updateTagsInItem)(
|
|
450
|
+
context,
|
|
451
|
+
{
|
|
452
|
+
itemDocId: postDocId,
|
|
453
|
+
tags: [...contentTags, ...userTags]
|
|
454
|
+
}
|
|
455
|
+
);
|
|
456
|
+
return {
|
|
457
|
+
...savedPost,
|
|
458
|
+
tags: updatedTags
|
|
459
|
+
};
|
|
413
460
|
}
|
|
414
461
|
return savedPost;
|
|
415
462
|
} catch (error) {
|
|
@@ -417,134 +464,121 @@ const addPost = async (context, post) => {
|
|
|
417
464
|
}
|
|
418
465
|
};
|
|
419
466
|
const updatePost = async (context, post) => {
|
|
467
|
+
const action = "updatePost";
|
|
420
468
|
const { database, session: { userId: sessionId } } = context;
|
|
421
469
|
const now = Date.now();
|
|
470
|
+
const parsedPost = (0, import_postAdapter.parsePost)(post);
|
|
422
471
|
const {
|
|
423
|
-
content,
|
|
424
|
-
endDate,
|
|
425
|
-
groupId,
|
|
426
|
-
name,
|
|
427
|
-
parentId,
|
|
428
472
|
postId,
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
tags = [],
|
|
432
|
-
type
|
|
433
|
-
} = post;
|
|
473
|
+
tags = []
|
|
474
|
+
} = parsedPost;
|
|
434
475
|
const update = {
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
modified: now,
|
|
438
|
-
name: name ? (0, import_utils.parseString)(name, 160) : void 0,
|
|
439
|
-
parentId: parentId ? (0, import_utils.parseString)(parentId, 160) : void 0,
|
|
440
|
-
privacy: privacy ? (0, import_utils.parseVarChar)(privacy, 16) : void 0,
|
|
441
|
-
startDate: startDate ? (0, import_utils.parseNum)(startDate, 13) : void 0,
|
|
442
|
-
type: type !== void 0 ? (0, import_utils.parseChar)(type, 16) : void 0
|
|
476
|
+
...parsedPost,
|
|
477
|
+
modified: now
|
|
443
478
|
};
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
479
|
+
if (!postId) {
|
|
480
|
+
return (0, import_analyticsUtils.logException)({
|
|
481
|
+
action,
|
|
482
|
+
category: eventCategory,
|
|
483
|
+
value: import_error.ErrorTypes.INVALID_ID
|
|
484
|
+
}, {});
|
|
485
|
+
}
|
|
447
486
|
const insert = {
|
|
448
487
|
...update,
|
|
449
|
-
_key:
|
|
488
|
+
_key: postId,
|
|
450
489
|
added: now,
|
|
451
|
-
groupId: formatGroupId,
|
|
452
|
-
privacy,
|
|
453
490
|
userId: sessionId
|
|
454
491
|
};
|
|
455
|
-
const
|
|
456
|
-
const aqlQry = import_arangojs.aql`UPSERT {_key: ${formatId}, userId: ${sessionId}}
|
|
492
|
+
const aqlQry = import_arangojs.aql`UPSERT {_key: ${postId}, userId: ${sessionId}}
|
|
457
493
|
INSERT ${insert}
|
|
458
494
|
UPDATE ${update}
|
|
459
495
|
IN posts RETURN NEW`;
|
|
460
496
|
try {
|
|
461
|
-
const updatedPost = await
|
|
497
|
+
const updatedPost = await database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
498
|
+
action,
|
|
499
|
+
category: eventCategory,
|
|
500
|
+
value: import_error.ErrorTypes.DATABASE_ERROR
|
|
501
|
+
}, error, {}));
|
|
462
502
|
const { _id: updatedPostId } = updatedPost;
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
const
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
updatedPost.files = fileList;
|
|
479
|
-
} else {
|
|
480
|
-
updatedPost.files = [];
|
|
503
|
+
const contentTagNames = await (0, import_tags.extractTags)(insert.content);
|
|
504
|
+
if (tags?.length || contentTagNames?.length) {
|
|
505
|
+
const userTags = tags?.length ? (await (0, import_tags.getTagsByName)(context, tags.map(({ name }) => name))).map((tag) => ({ ...tag, tagBy: sessionId })) : [];
|
|
506
|
+
const contentTags = contentTagNames?.length ? (await (0, import_tags.getTagsByName)(context, contentTagNames)).map((tag) => ({ ...tag, tagBy: "extract" })) : [];
|
|
507
|
+
const updatedTags = await (0, import_tags.updateTagsInItem)(
|
|
508
|
+
context,
|
|
509
|
+
{
|
|
510
|
+
itemDocId: updatedPostId,
|
|
511
|
+
tags: [...contentTags, ...userTags]
|
|
512
|
+
}
|
|
513
|
+
);
|
|
514
|
+
return {
|
|
515
|
+
...updatedPost,
|
|
516
|
+
tags: updatedTags
|
|
517
|
+
};
|
|
481
518
|
}
|
|
482
519
|
return updatedPost;
|
|
483
520
|
} catch (error) {
|
|
484
521
|
throw error;
|
|
485
522
|
}
|
|
486
523
|
};
|
|
487
|
-
const deletePost = (context,
|
|
524
|
+
const deletePost = async (context, postDocId) => {
|
|
525
|
+
const action = "deletePost";
|
|
488
526
|
const { database, session: { userId: sessionId } } = context;
|
|
489
|
-
const
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
});
|
|
508
|
-
}).catch((error) => {
|
|
509
|
-
throw error;
|
|
510
|
-
});
|
|
511
|
-
}
|
|
512
|
-
return {};
|
|
513
|
-
}).catch((error) => {
|
|
527
|
+
const formatPostId = (0, import_utils.parseArangoId)(postDocId);
|
|
528
|
+
if (!formatPostId) {
|
|
529
|
+
return (0, import_analyticsUtils.logException)({
|
|
530
|
+
action,
|
|
531
|
+
category: eventCategory,
|
|
532
|
+
value: import_error.ErrorTypes.INVALID_ID
|
|
533
|
+
}, {});
|
|
534
|
+
}
|
|
535
|
+
const edgeAqlQry = import_arangojs.aql`FOR t IN isTagged
|
|
536
|
+
FILTER t._to == ${formatPostId}
|
|
537
|
+
REMOVE t IN isTagged`;
|
|
538
|
+
await database.query(edgeAqlQry).catch((error) => {
|
|
539
|
+
throw error;
|
|
540
|
+
});
|
|
541
|
+
const fileAqlQry = import_arangojs.aql`FOR f IN hasFile
|
|
542
|
+
FILTER f._to == ${formatPostId}
|
|
543
|
+
REMOVE f IN hasFile`;
|
|
544
|
+
await database.query(fileAqlQry).catch((error) => {
|
|
514
545
|
throw error;
|
|
515
546
|
});
|
|
516
|
-
};
|
|
517
|
-
const cleanPosts = (database) => {
|
|
518
547
|
const aqlQry = import_arangojs.aql`FOR p IN posts
|
|
519
|
-
FILTER p.
|
|
548
|
+
FILTER p._id == ${formatPostId} && p.userId == ${sessionId}
|
|
549
|
+
LIMIT 1
|
|
520
550
|
REMOVE p IN posts
|
|
521
551
|
RETURN OLD`;
|
|
522
|
-
return database.query(aqlQry).then((cursor) => cursor.
|
|
552
|
+
return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => {
|
|
523
553
|
throw error;
|
|
524
554
|
});
|
|
525
555
|
};
|
|
526
|
-
const createPostEdge = (
|
|
527
|
-
const
|
|
528
|
-
const {
|
|
529
|
-
const
|
|
530
|
-
const
|
|
531
|
-
const
|
|
532
|
-
|
|
556
|
+
const createPostEdge = (context, postDocId, itemDocId, edgeType = "isPosted", props = {}) => {
|
|
557
|
+
const action = "createPostEdge";
|
|
558
|
+
const { database } = context;
|
|
559
|
+
const edgeCollection = database.collection(edgeType);
|
|
560
|
+
const formatPostId = (0, import_utils.parseArangoId)(postDocId);
|
|
561
|
+
const formatDocId = (0, import_utils.parseArangoId)(itemDocId);
|
|
562
|
+
if (!formatDocId || !formatPostId) {
|
|
563
|
+
return Promise.reject(new Error(import_error.ErrorTypes.INVALID_ID));
|
|
564
|
+
}
|
|
565
|
+
const edgeId = (0, import_utils.createHash)(`postEdge-${formatPostId}-${formatDocId}`);
|
|
533
566
|
const edge = {
|
|
534
|
-
_from:
|
|
567
|
+
_from: formatPostId,
|
|
535
568
|
_key: edgeId,
|
|
536
|
-
_to:
|
|
569
|
+
_to: formatDocId,
|
|
537
570
|
added: Date.now(),
|
|
538
|
-
|
|
571
|
+
...props
|
|
539
572
|
};
|
|
540
|
-
return edgeCollection.save(edge, { returnNew: true }).
|
|
541
|
-
|
|
542
|
-
|
|
573
|
+
return edgeCollection.save(edge, { returnNew: true }).catch((error) => (0, import_analyticsUtils.logError)({
|
|
574
|
+
action,
|
|
575
|
+
category: eventCategory,
|
|
576
|
+
value: import_error.ErrorTypes.DATABASE_ERROR
|
|
577
|
+
}, error, {}));
|
|
543
578
|
};
|
|
544
579
|
// Annotate the CommonJS export names for ESM import in node:
|
|
545
580
|
0 && (module.exports = {
|
|
546
581
|
addPost,
|
|
547
|
-
cleanPosts,
|
|
548
582
|
createPostEdge,
|
|
549
583
|
deletePost,
|
|
550
584
|
getPost,
|
|
@@ -558,4 +592,4 @@ const createPostEdge = (db, file, postId) => {
|
|
|
558
592
|
parsePostOptions,
|
|
559
593
|
updatePost
|
|
560
594
|
});
|
|
561
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcG9zdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2NyZWF0ZUhhc2gsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbCwgRGF0YWJhc2V9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5cbmltcG9ydCB7QXBpQ29udGV4dCwgRmlsZVR5cGUsIFBvc3RJbnB1dFR5cGUsIFBvc3RPcHRpb25zLCBQb3N0VHlwZSwgVGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgbG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7dXBkYXRlRmlsZXN9IGZyb20gJy4vZmlsZXMnO1xuaW1wb3J0IHtleHRyYWN0VGFncywgbGlua1RhZ3N9IGZyb20gJy4vdGFncyc7XG5cbmNvbnN0IE1BWF9DT05URU5UX0xFTkdUSDogbnVtYmVyID0gMTAwMDAwO1xuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3Bvc3RzJztcblxuZXhwb3J0IGNvbnN0IHBhcnNlUG9zdE9wdGlvbnMgPSAob3B0aW9uczogUG9zdE9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgbGF0aXR1ZGUgPSAwLFxuICAgIGxvbmdpdHVkZSA9IDAsXG4gICAgdG8gPSAzMCxcbiAgICB0eXBlID0gJ3Bvc3QnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSwgc2Vzc2lvbklkOiBzdHJpbmcpID0+XG4gIGZpZWxkcy5yZWR1Y2UoKHNlbGVjdHM6IGFueSwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIHN3aXRjaChmaWVsZCkge1xuICAgICAgY2FzZSAnaGFzUnN2cCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCBoYXNSc3ZwID0gVE9fQk9PTChGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInJzdnBcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiICYmIHIuX2Zyb20gPT0gXCJ1c2Vycy8ke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgICkpYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdoYXNSc3ZwOmhhc1JzdnAnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdpc1NhdmVkJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIGlzU2F2ZWQgPSBUT19CT09MKEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwicGluXCIgJiYgci50eXBlID09IFwicG9zdHNcIiAmJiByLl9mcm9tID09IFwidXNlcnMvJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjb3VudFxuICAgICAgICAgIFJFVFVSTiBjb3VudFxuICAgICAgICApKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgnaXNTYXZlZDppc1NhdmVkJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAncmVhY3Rpb25zJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdyc3ZwQ291bnQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcnN2cENvdW50ID0gRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJyc3ZwXCIgJiYgci50eXBlID09IFwicG9zdHNcIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3JzdnBDb3VudDpyc3ZwQ291bnQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICd2aWV3Q291bnQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgdmlld0NvdW50ID0gRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJ2aWV3XCIgJiYgci50eXBlID09IFwicG9zdHNcIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgIClgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ3ZpZXdDb3VudDp2aWV3Q291bnQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgIH1cbiAgfSwge29iamVjdHM6IFtdLCBxdWVyaWVzOiBbXX0pO1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZywgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQYXJ0aWFsPFBvc3RUeXBlPj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKGl0ZW1JZCk7XG4gIGNvbnN0IHt0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGRiID0gZGF0YWJhc2U7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC5fa2V5ID09ICR7Zm9ybWF0SXRlbUlkfSAmJiBwLnR5cGUgPT0gJHt0eXBlfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gcGA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBfaWQ6IHBvc3REb2NJZCxcbiAgICAgICAgZ3JvdXBJZCxcbiAgICAgICAgcHJpdmFjeSA9ICdkZWZhdWx0J1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBMRVQgcCA9IERPQ1VNRU5UKFwiJHtwb3N0RG9jSWR9XCIpXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIEZPUiBncm91cCBJTiBncm91cHNcbiAgICAgICAgICBGSUxURVIgZ3JvdXAuX2tleSA9PSBwLmdyb3VwSWRcbiAgICAgICAgICBGT1IgdSwgZSBJTiBPVVRCT1VORCBncm91cC5faWQgaXNHcm91cGVkXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBcIiR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgTEVUIHAgPSBET0NVTUVOVChcIiR7cG9zdERvY0lkfVwiKVxuICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkgfHwge30pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiAoe30pKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gKHt9KSkpO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RMaXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuLy8gICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlBcHAnO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuLy8gICBjb25zb2xlLmxvZygnZ2V0UG9zdExpc3Q6OmNvbnRleHQnLCBjb250ZXh0KTtcbi8vICAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4vLyAgIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4vLyAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4vLyAgICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudCA9PSBudWxsXG4vLyAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuLy8gICAgICR7bGltaXQuYXFsfVxuLy8gICAgIFNPUlQgcC5hZGRlZFxuLy8gICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4vLyAgIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4vLyAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuLy8gICAgICAgY29uc29sZS5sb2coJ2dldFBvc3RMaXN0OjplcnJvcicsIGVycm9yKTtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlBcmVhID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBsYXRpdHVkZTogbnVtYmVyLFxuICBsb25naXR1ZGU6IG51bWJlcixcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgYCk7XG4gIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcblxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50SWQgPT0gbnVsbFxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgZGlzdGFuY2UsIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlHcm91cCA9IChcbi8vICAgY29udGV4dDogQXBpQ29udGV4dCxcbi8vICAgZ3JvdXBJZDogc3RyaW5nLFxuLy8gICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbi8vICk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuLy8gICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlHcm91cCc7XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4vLyAgIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG5cbi8vICAgLy8gR3JvdXAgaWRcbi8vICAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbi8vICAgY29uc3QgZGIgPSBkYXRhYmFzZTtcbi8vICAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHUsIGcgSU4gSU5CT1VORCAke2Zvcm1hdEdyb3VwSWR9IGhhc0dyb3VwXG4vLyAgICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuLy8gICAgICAgUkVUVVJOIGdgO1xuXG4vLyAgIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4vLyAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbi8vICAgICAudGhlbigoZ3JvdXBzOiBHcm91cFR5cGVbXSA9IFtdKSA9PiB7XG4vLyAgICAgICBpZihncm91cHMubGVuZ3RoKSB7XG4vLyAgICAgICAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuLy8gICAgICAgICBjb25zdCBwb3N0QXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbi8vICAgICAgICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAuZ3JvdXBJZCA9PSBcIiR7Zm9ybWF0R3JvdXBJZH1cIiAmJiBwLnBhcmVudCA9PSBudWxsXG4vLyAgICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuLy8gICAgICAgICAgICR7bGltaXQuYXFsfVxuLy8gICAgICAgICAgIFNPUlQgcC5hZGRlZFxuLy8gICAgICAgICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4vLyAgICAgICAgIHJldHVybiBkYi5xdWVyeShwb3N0QXFsUXJ5KVxuLy8gICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgICAgICAgIH0pO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICByZXR1cm4gW107XG4vLyAgICAgfSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuLy8gICAgICAgdGhyb3cgZXJyb3I7XG4vLyAgICAgfSk7XG4vLyB9O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5TGF0ZXN0JztcbiAgY29uc29sZS5sb2coJ2dldFBvc3RzQnlMYXRlc3Q6Om9wdGlvbnMnLCBvcHRpb25zKTtcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgY29uc29sZS5sb2coJ2dldFBvc3RzQnlMYXRlc3Q6OmFxbFFyeScsIGFxbFFyeSk7XG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcmVhY3Rpb25zOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0c0J5UmVhY3Rpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsaW1pdCwgbG9uZ2l0dWRlLCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmVhY3Rpb25zLm1hcCgocmVhY3Rpb24pID0+IHBhcnNlQ2hhcihyZWFjdGlvbiwgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZihyZWFjdGlvbnMubGVuZ3RoKSB7XG4gICAgc29ydEJ5LnB1c2goJ21hdGNoZWRUYWdzIERFU0MnKTtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBtYXRjaGVkUmVhY3Rpb25zID0gTEVOR1RIKFxuICAgICAgRk9SIG1yIElOIHJlYWN0aW9uc1xuICAgICAgRklMVEVSIG1yLm1hdGNoZWQgPT0gdHJ1ZVxuICAgICAgUkVUVVJOIG1yXG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFJlYWN0aW9uczptYXRjaGVkUmVhY3Rpb25zJyk7XG4gICAgZmlsdGVycy5wdXNoKCdtYXRjaGVkUmVhY3Rpb25zID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwLCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgRk9SIHJlYWN0aW9uLCBociBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRSZWFjdGlvbnN9KSA+IDAgJiYgUE9TSVRJT04oJHtmb3JtYXRSZWFjdGlvbnN9LCByZWFjdGlvbi5uYW1lKVxuICAgICAgU09SVCByZWFjdGlvbi5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UocmVhY3Rpb24sIHttYXRjaGVkOm1hdGNoZWR9KVxuICAgIClcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VGFncyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbGltaXQsIGxvbmdpdHVkZSwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBmb3JtYXRUYWdOYW1lczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGFncy5tYXAoKHRhZykgPT4gcGFyc2VDaGFyKHRhZywgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZih0YWdzLmxlbmd0aCkge1xuICAgIHNvcnRCeS5wdXNoKCdtYXRjaGVkVGFncyBERVNDJyk7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgbWF0Y2hlZFRhZ3MgPSBMRU5HVEgoXG4gICAgICBGT1IgdCBJTiB0YWdzXG4gICAgICBGSUxURVIgdC5tYXRjaGVkID09IHRydWVcbiAgICAgIFJFVFVSTiB0XG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFRhZ3M6bWF0Y2hlZFRhZ3MnKTtcbiAgICBmaWx0ZXJzLnB1c2goJ21hdGNoZWRUYWdzID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3RhZ3M6dGFncycpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgTEVUIHRhZ3MgPSAoXG4gICAgICBGT1IgdGFnLCBpdCBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRUYWdOYW1lc30pID4gMCAmJiBQT1NJVElPTigke2Zvcm1hdFRhZ05hbWVzfSwgdGFnLm5hbWUpXG4gICAgICBTT1JUIHRhZy5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UodGFnLCB7bWF0Y2hlZDptYXRjaGVkfSlcbiAgICApXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgJHtzb3J0Qnkuam9pbignLCAnKX1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICBjb25zb2xlLmxvZyh7YXFsUXJ5LCBvcHRpb25zfSk7XG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKCkgPT4gW10pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RDb21tZW50cyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBpdGVtSWQ6IHN0cmluZywgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldENvbW1lbnRzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQoaXRlbUlkKTtcblxuICAvLyBHZXQgdGhlIHBhcmVudCBwb3N0IHRvIGdldCByZXN0cmljdGlvbnNcbiAgY29uc3QgZGIgPSBkYXRhYmFzZTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXksXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAncHVibGljJ1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBpc0dyb3VwZWRcbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGT1IgdXNlciBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnBhcmVudCA9PSBcIiR7X2tleX1cIiAmJiB1c2VyLl9rZXkgPT0gcC51c2VySWRcbiAgICAgICAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgICAgKVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbXTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3Q6IFBvc3RJbnB1dFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGNvbnN0IHtcbiAgICBjb250ZW50ID0gJycsXG4gICAgZW5kRGF0ZSxcbiAgICBncm91cElkID0gJycsXG4gICAgbG9jYXRpb24sXG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIG5hbWUgPSAnJyxcbiAgICBwYXJlbnRJZCA9IG51bGwsXG4gICAgcHJpdmFjeSA9ICdwdWJsaWMnLFxuICAgIHRhZ3MgPSBbXSxcbiAgICBzdGFydERhdGUsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9ID0gcG9zdDtcblxuICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG5cbiAgY29uc3QgaW5zZXJ0OiBQb3N0VHlwZSA9IHtcbiAgICBfa2V5OiBjcmVhdGVIYXNoKGBwb3N0LSR7c2Vzc2lvbklkfWApLFxuICAgIGFkZGVkOiBub3csXG4gICAgY29udGVudDogcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSxcbiAgICBlbmREYXRlOiBlbmREYXRlID8gcGFyc2VOdW0oZW5kRGF0ZSwgMTMpIDogdW5kZWZpbmVkLFxuICAgIGdyb3VwSWQ6IGdyb3VwSWQgPyBwYXJzZUlkKGdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obGF0aXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/IHBhcnNlU3RyaW5nKGxvY2F0aW9uLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsb25naXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VTdHJpbmcobmFtZSwgMTYwKSxcbiAgICBwYXJlbnRJZDogcGFyZW50SWQgPyBwYXJzZUlkKHBhcmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiBwcml2YWN5ID8gcGFyc2VWYXJDaGFyKHByaXZhY3ksIDE2KSA6IHVuZGVmaW5lZCxcbiAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZSA/IHBhcnNlTnVtKHN0YXJ0RGF0ZSwgMTMpIDogdW5kZWZpbmVkLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMiksXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcblxuICBjb25zdCBkYjogRGF0YWJhc2UgPSBkYXRhYmFzZTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHBvc3RzIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWRQb3N0OiBQb3N0VHlwZSA9IGF3YWl0IGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpIHx8IHt9KTtcblxuICAgIGNvbnN0IHtfaWQ6IHBvc3REb2NJZH0gPSBzYXZlZFBvc3Q7XG5cbiAgICBjb25zb2xlLmxvZyh7dGFnc30pO1xuICAgIGlmKHRhZ3MgJiYgdGFncy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRhZ05hbWVzOiBzdHJpbmdbXSA9IHRhZ3MubWFwKCh7bmFtZX0pID0+IHBhcnNlQ2hhcihuYW1lLCAzMikpO1xuICAgICAgY29uc29sZS5sb2coe3RhZ05hbWVzLCBwb3N0RG9jSWR9KTtcbiAgICAgIGF3YWl0IGxpbmtUYWdzKGRiLCB0YWdOYW1lcywgcG9zdERvY0lkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzIHdpdGhpbiBwb3N0c1xuICAgICAgY29uc3QgdGFnTGlzdDogVGFnVHlwZVtdID0gYXdhaXQgZXh0cmFjdFRhZ3MoZGIsIHBvc3REb2NJZCwgaW5zZXJ0LmNvbnRlbnQpO1xuICAgICAgc2F2ZWRQb3N0LnRhZ3MgPSB0YWdMaXN0O1xuICAgIH1cblxuICAgIHJldHVybiBzYXZlZFBvc3Q7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVBvc3QgPSBhc3luYyAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdDogUG9zdElucHV0VHlwZSk6IFByb21pc2U8UG9zdFR5cGU+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAndXBkYXRlJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3Qge1xuICAgIGNvbnRlbnQsXG4gICAgZW5kRGF0ZSxcbiAgICBncm91cElkLFxuICAgIG5hbWUsXG4gICAgcGFyZW50SWQsXG4gICAgcG9zdElkLFxuICAgIHByaXZhY3ksXG4gICAgc3RhcnREYXRlLFxuICAgIHRhZ3MgPSBbXSxcbiAgICB0eXBlXG4gIH0gPSBwb3N0O1xuXG4gIGNvbnN0IHVwZGF0ZTogUG9zdFR5cGUgPSB7XG4gICAgY29udGVudDogY29udGVudCA/IHBhcnNlU3RyaW5nKGNvbnRlbnQsIE1BWF9DT05URU5UX0xFTkdUSCkgOiB1bmRlZmluZWQsXG4gICAgZW5kRGF0ZTogZW5kRGF0ZSA/IHBhcnNlTnVtKGVuZERhdGUsIDEzKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IG5hbWUgPyBwYXJzZVN0cmluZyhuYW1lLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlU3RyaW5nKHBhcmVudElkLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHByaXZhY3kgPyBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpIDogdW5kZWZpbmVkLFxuICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlID8gcGFyc2VOdW0oc3RhcnREYXRlLCAxMykgOiB1bmRlZmluZWQsXG4gICAgdHlwZTogdHlwZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VDaGFyKHR5cGUsIDE2KSA6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGxldCBmb3JtYXRJZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBmb3JtYXRJZCA9IGZvcm1hdElkID09PSAnJyA/IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCkgOiBmb3JtYXRJZDtcbiAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbiAgY29uc3QgaW5zZXJ0OiBhbnkgPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IGZvcm1hdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgZ3JvdXBJZDogZm9ybWF0R3JvdXBJZCxcbiAgICBwcml2YWN5LFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGRiOiBEYXRhYmFzZSA9IGRhdGFiYXNlO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7X2tleTogJHtmb3JtYXRJZH0sIHVzZXJJZDogJHtzZXNzaW9uSWR9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkUG9zdDogUG9zdFR5cGUgPSBhd2FpdCBkYi5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSB8fCB7fSk7XG5cbiAgICBjb25zdCB7X2lkOiB1cGRhdGVkUG9zdElkfSA9IHVwZGF0ZWRQb3N0O1xuXG4gICAgaWYodGFncyAmJiB0YWdzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdGFnTmFtZXM6IHN0cmluZ1tdID0gdGFncy5tYXAoKHtuYW1lfSkgPT4gcGFyc2VDaGFyKG5hbWUsIDMyKSk7XG4gICAgICBjb25zdCB0YWdRdWVyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHQgSU4gdGFnc1xuICAgICAgICBGSUxURVIgUE9TSVRJT04oJHtKU09OLnN0cmluZ2lmeSh0YWdOYW1lcyl9LCB0Lm5hbWUpXG4gICAgICAgIFJFVFVSTiB0YDtcblxuICAgICAgY29uc3QgZXhpc3RpbmdUYWdzID0gYXdhaXQgZGIucXVlcnkodGFnUXVlcnkpLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSk7XG4gICAgICBjb25zdCB0YWdJZHM6IHN0cmluZ1tdID0gZXhpc3RpbmdUYWdzLm1hcCgoe19pZDogdGFnSWR9KSA9PiB0YWdJZCk7XG4gICAgICBhd2FpdCBsaW5rVGFncyhkYiwgdGFnSWRzLCB1cGRhdGVkUG9zdElkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXBkYXRlIGxpbmtlZCB0YWdzXG4gICAgICBjb25zdCB0YWdMaXN0ID0gYXdhaXQgZXh0cmFjdFRhZ3MoZGIsIHVwZGF0ZWRQb3N0SWQsIHVwZGF0ZS5jb250ZW50IHx8ICcnKSB8fCBbXTtcbiAgICAgIHVwZGF0ZWRQb3N0LnRhZ3MgPSB0YWdMaXN0O1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBsaW5rZWQgZmlsZXNcbiAgICBjb25zdCBmaWxlczogRmlsZVR5cGVbXSA9IHVwZGF0ZWRQb3N0LmZpbGVzIHx8IFtdO1xuXG4gICAgaWYoZmlsZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBmaWxlTGlzdCA9IGF3YWl0IHVwZGF0ZUZpbGVzKGRiLCBmb3JtYXRJZCwgZmlsZXMpIHx8IFtdO1xuICAgICAgdXBkYXRlZFBvc3QuZmlsZXMgPSBmaWxlTGlzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXBkYXRlZFBvc3QuZmlsZXMgPSBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlZFBvc3Q7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVBvc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdElkOiBzdHJpbmcpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgY29uc3QgZGI6IERhdGFiYXNlID0gZGF0YWJhc2U7XG4gIGNvbnN0IGFxbFFyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUgPSB7fSkgPT4ge1xuICAgICAgaWYocG9zdCkge1xuICAgICAgICAvLyBSZW1vdmUgdGFnIGxpbmtzXG4gICAgICAgIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gICAgICAgICAgICBGSUxURVIgdC5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgICAgICAgICBSRU1PVkUgdCBJTiBpc1RhZ2dlZGA7XG5cbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGF0dGFjaGVkIGZpbGVzXG4gICAgICAgICAgICBjb25zdCBmaWxlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgZiBJTiBoYXNGaWxlXG4gICAgICAgICAgICAgICAgRklMVEVSIGYuX3RvID09ICR7Zm9ybWF0SXRlbUlkfVxuICAgICAgICAgICAgICAgIFJFTU9WRSBmIElOIGhhc0ZpbGVgO1xuXG4gICAgICAgICAgICByZXR1cm4gZGIucXVlcnkoZmlsZUFxbFFyeSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gcG9zdClcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY2xlYW5Qb3N0cyA9IChkYXRhYmFzZTogRGF0YWJhc2UpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAvLyBSZW1vdmUgYWxsIG1lc3NhZ2VzIHRoYXQgYXJlIG92ZXIgNjAgZGF5cyBhbmQgbm90IHNhdmVkXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHAgSU4gcG9zdHNcbiAgICAgIEZJTFRFUiBwLmFkZGVkIDwgREFURV9USU1FU1RBTVAoREFURV9TVUJUUkFDVChEQVRFX05PVygpLCA2MCwgJ2RheScpKSAmJiBwLnR5cGUgPT0gXCJkZWZhdWx0XCJcbiAgICAgIFJFTU9WRSBwIElOIHBvc3RzXG4gICAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKHJlc3VsdHM6IFBvc3RUeXBlW10gPSBbXSkgPT4gcmVzdWx0cy5sZW5ndGgpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvc3RFZGdlID0gKGRiOiBEYXRhYmFzZSwgZmlsZTogRmlsZVR5cGUsIHBvc3RJZDogc3RyaW5nKTogUHJvbWlzZTxGaWxlVHlwZT4gPT4ge1xuICBjb25zdCBlZGdlQ29sbGVjdGlvbjogRWRnZUNvbGxlY3Rpb24gPSBkYi5jb2xsZWN0aW9uKCdpc1Bvc3RlZCcpO1xuICBjb25zdCB7ZmlsZUlkfSA9IGZpbGU7XG4gIGNvbnN0IGZvcm1hdEZpbGVJZDogc3RyaW5nID0gcGFyc2VJZChmaWxlSWQpO1xuICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYGZpbGUtJHtwb3N0SWR9LSR7Zm9ybWF0RmlsZUlkfWApO1xuICBjb25zdCBmb3JtYXRQb3N0SWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgY29uc3QgZmlsZVR5cGU6IHN0cmluZyA9IHBhcnNlQ2hhcihmaWxlLmZpbGVUeXBlLCAxNik7XG5cbiAgY29uc3QgZWRnZTogYW55ID0ge1xuICAgIF9mcm9tOiBgcG9zdHMvJHtmb3JtYXRQb3N0SWR9YCxcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgX3RvOiBgZmlsZXMvJHtmb3JtYXRGaWxlSWR9YCxcbiAgICBhZGRlZDogRGF0ZS5ub3coKSxcbiAgICB0eXBlOiBmaWxlVHlwZVxuICB9O1xuXG4gIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KVxuICAgIC50aGVuKCgpID0+IGZpbGUpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEsbUJBQWtGO0FBQ2xGLHNCQUE0QjtBQU01QixJQUFBQSxnQkFBaUM7QUFDakMsbUJBQTBCO0FBQzFCLGtCQUFvQztBQUVwQyxNQUFNLHFCQUE2QjtBQUNuQyxNQUFNLGdCQUF3QjtBQUV2QixNQUFNLG1CQUFtQixDQUFDLFVBQXVCLENBQUMsTUFBTTtBQUM3RCxRQUFNO0FBQUEsSUFDSixPQUFPO0FBQUEsSUFDUCxXQUFXO0FBQUEsSUFDWCxZQUFZO0FBQUEsSUFDWixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsRUFDVCxJQUFJO0FBRUosU0FBTztBQUFBLElBQ0wsY0FBVSx1QkFBUyxVQUFVLEVBQUU7QUFBQSxJQUMvQixXQUFPLHdCQUFTLE1BQU0sRUFBRTtBQUFBLElBQ3hCLGVBQVcsdUJBQVMsV0FBVyxFQUFFO0FBQUEsSUFDakMsVUFBTSx3QkFBVSxNQUFNLEVBQUU7QUFBQSxFQUMxQjtBQUNGO0FBRU8sTUFBTSxrQkFBa0IsQ0FBQyxRQUFrQixjQUNoRCxPQUFPLE9BQU8sQ0FBQyxTQUFjLFVBQWtCO0FBQzdDLFVBQU8sT0FBTztBQUFBLElBQ1osS0FBSyxXQUFXO0FBQ2QsY0FBUSxRQUFRLEtBQUs7QUFBQTtBQUFBLDhF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VUFBVSxFQUN2QixLQUFLLE1BQU07QUFFVixjQUFNLGFBQXVCO0FBQUEsa0NBQ1AsWUFBWTtBQUFBO0FBR2xDLGVBQU8sR0FBRyxNQUFNLFVBQVUsRUFDdkIsS0FBSyxNQUFNLElBQUksRUFDZixNQUFNLENBQUMsVUFBaUI7QUFDdkIsZ0JBQU07QUFBQSxRQUNSLENBQUM7QUFBQSxNQUNMLENBQUMsRUFDQSxNQUFNLENBQUMsVUFBaUI7QUFDdkIsY0FBTTtBQUFBLE1BQ1IsQ0FBQztBQUFBLElBQ0w7QUFDQSxXQUFPLENBQUM7QUFBQSxFQUNWLENBQUMsRUFDQSxNQUFNLENBQUMsVUFBaUI7QUFDdkIsVUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNMO0FBRU8sTUFBTSxhQUFhLENBQUMsYUFBd0M7QUFFakUsUUFBTSxTQUFtQjtBQUFBO0FBQUE7QUFBQTtBQUt6QixTQUFPLFNBQVMsTUFBTSxNQUFNLEVBQ3pCLEtBQUssQ0FBQyxXQUF3QixPQUFPLElBQUksQ0FBQyxFQUMxQyxLQUFLLENBQUMsVUFBc0IsQ0FBQyxNQUFNLFFBQVEsTUFBTSxFQUNqRCxNQUFNLENBQUMsVUFBaUI7QUFDdkIsVUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNMO0FBRU8sTUFBTSxpQkFBaUIsQ0FBQyxJQUFjLE1BQWdCLFdBQXNDO0FBQ2pHLFFBQU0saUJBQWlDLEdBQUcsV0FBVyxVQUFVO0FBQy9ELFFBQU0sRUFBQyxPQUFNLElBQUk7QUFDakIsUUFBTSxtQkFBdUIsc0JBQVEsTUFBTTtBQUMzQyxRQUFNLGFBQWlCLHlCQUFXLFFBQVEsTUFBTSxJQUFJLFlBQVksRUFBRTtBQUNsRSxRQUFNLG1CQUF1QixzQkFBUSxNQUFNO0FBQzNDLFFBQU0sZUFBbUIsd0JBQVUsS0FBSyxVQUFVLEVBQUU7QUFFcEQsUUFBTSxPQUFZO0FBQUEsSUFDaEIsT0FBTyxTQUFTLFlBQVk7QUFBQSxJQUM1QixNQUFNO0FBQUEsSUFDTixLQUFLLFNBQVMsWUFBWTtBQUFBLElBQzFCLE9BQU8sS0FBSyxJQUFJO0FBQUEsSUFDaEIsTUFBTTtBQUFBLEVBQ1I7QUFFQSxTQUFPLGVBQWUsS0FBSyxNQUFNLEVBQUMsV0FBVyxLQUFJLENBQUMsRUFDL0MsS0FBSyxNQUFNLElBQUksRUFDZixNQUFNLENBQUMsVUFBaUI7QUFDdkIsVUFBTTtBQUFBLEVBQ1IsQ0FBQztBQUNMOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfdXRpbHMiLCAibmFtZSJdCn0K
|
|
595
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcG9zdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtLCBwYXJzZVN0cmluZywgcGFyc2VWYXJDaGFyXG59IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtleHRyYWN0VGFncywgZ2V0VGFnc0J5TmFtZSwgdXBkYXRlVGFnc0luSXRlbX0gZnJvbSAnLi90YWdzJztcbmltcG9ydCB7cGFyc2VQb3N0fSBmcm9tICcuLi9hZGFwdGVycy9wb3N0QWRhcHRlcic7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXRMaW1pdH0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscyc7XG5cbmltcG9ydCB0eXBlIHtBcGlDb250ZXh0LCBBcmFuZ29EYkxpbWl0LCBGaWxlVHlwZSwgUG9zdElucHV0VHlwZSwgUG9zdE9wdGlvbnMsIFBvc3RUeXBlLCBUYWdUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb25zJztcblxuY29uc3QgTUFYX0NPTlRFTlRfTEVOR1RIOiBudW1iZXIgPSAxMDAwMDA7XG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAncG9zdHMnO1xuXG5leHBvcnQgY29uc3QgcGFyc2VQb3N0T3B0aW9ucyA9IChvcHRpb25zOiBQb3N0T3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICBsYXRpdHVkZSA9IDAsXG4gICAgbG9uZ2l0dWRlID0gMCxcbiAgICB0byA9IDMwLFxuICAgIHR5cGUgPSAncG9zdCdcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VOdW0obGF0aXR1ZGUsIDMyKSxcbiAgICBsaW1pdDogZ2V0TGltaXQoZnJvbSwgdG8pIGFzIEFyYW5nb0RiTGltaXQsXG4gICAgbG9uZ2l0dWRlOiBwYXJzZU51bShsb25naXR1ZGUsIDMyKSxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdE9wdGlvbmFsID0gKGZpZWxkczogc3RyaW5nW10sIHNlc3Npb25JZDogc3RyaW5nKSA9PlxuICAoZmllbGRzIHx8IFtdKS5yZWR1Y2UoKHNlbGVjdHMsIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBzd2l0Y2goZmllbGQpIHtcbiAgICAgIGNhc2UgJ2hhc1JzdnAnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgaGFzUnN2cCA9IFRPX0JPT0woRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJyc3ZwXCIgJiYgci50eXBlID09IFwicG9zdHNcIiAmJiByLl9mcm9tID09IFwidXNlcnMvJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjb3VudFxuICAgICAgICAgIFJFVFVSTiBjb3VudFxuICAgICAgICApKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgnaGFzUnN2cDpoYXNSc3ZwJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAnaXNTYXZlZCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCBpc1NhdmVkID0gVE9fQk9PTChGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInBpblwiICYmIHIudHlwZSA9PSBcInBvc3RzXCIgJiYgci5fZnJvbSA9PSBcInVzZXJzLyR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKSlgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ2lzU2F2ZWQ6aXNTYXZlZCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlYWN0aW9ucyc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdyZWFjdGlvbnM6cmVhY3Rpb25zJyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAncnN2cENvdW50Jzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHJzdnBDb3VudCA9IEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwicnN2cFwiICYmIHIudHlwZSA9PSBcInBvc3RzXCJcbiAgICAgICAgICBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjb3VudFxuICAgICAgICAgIFJFVFVSTiBjb3VudFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdyc3ZwQ291bnQ6cnN2cENvdW50Jyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgY2FzZSAndmlld0NvdW50Jzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIHZpZXdDb3VudCA9IEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwidmlld1wiICYmIHIudHlwZSA9PSBcInBvc3RzXCJcbiAgICAgICAgICBDT0xMRUNUIFdJVEggQ09VTlQgSU5UTyBjb3VudFxuICAgICAgICAgIFJFVFVSTiBjb3VudFxuICAgICAgICApYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCd2aWV3Q291bnQ6dmlld0NvdW50Jyk7XG4gICAgICAgIHJldHVybiBzZWxlY3RzO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtvYmplY3RzOiBbXSwgcXVlcmllczogW119KTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHBvc3RJZDogc3RyaW5nLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VJZChwb3N0SWQpO1xuICBjb25zdCB7dHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBkYiA9IGRhdGFiYXNlO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAuX2tleSA9PSAke2Zvcm1hdEl0ZW1JZH0gJiYgcC50eXBlID09ICR7dHlwZX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHBgO1xuXG4gIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgX2lkOiBwb3N0RG9jSWQsXG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgZ3JvdXBJZCxcbiAgICAgICAgcHJpdmFjeSA9ICdkZWZhdWx0J1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZih1c2VySWQgPT09IHNlc3Npb25JZCkge1xuICAgICAgICByZXR1cm4gcG9zdDtcbiAgICAgIH1cblxuICAgICAgaWYoZ3JvdXBJZCAmJiBwcml2YWN5ID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgTEVUIHAgPSBET0NVTUVOVChcIiR7cG9zdERvY0lkfVwiKVxuICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAgICAgICBGT1IgZ3JvdXAgSU4gZ3JvdXBzXG4gICAgICAgICAgRklMVEVSIGdyb3VwLl9rZXkgPT0gcC5ncm91cElkXG4gICAgICAgICAgRk9SIHUsIGUgSU4gT1VUQk9VTkQgZ3JvdXAuX2lkIGhhc0Nvbm5lY3Rpb25cbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9IGVsc2UgaWYocHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBMRVQgcCA9IERPQ1VNRU5UKFwiJHtwb3N0RG9jSWR9XCIpXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIExJTUlUIDFcbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcbiAgICAgIH1cblxuICAgICAgaWYocHJpdmFjeUFxbFFyeSkge1xuICAgICAgICByZXR1cm4gZGIucXVlcnkocHJpdmFjeUFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHt9O1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuXG4vLyBleHBvcnQgY29uc3QgZ2V0UG9zdExpc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4vLyAgIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeUFwcCc7XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4vLyAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuLy8gICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuLy8gICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuLy8gICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbi8vICAgICAke2xpbWl0LmFxbH1cbi8vICAgICBTT1JUIHAuYWRkZWRcbi8vICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuLy8gICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuLy8gICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuLy8gICAgICAgdGhyb3cgZXJyb3I7XG4vLyAgICAgfSk7XG4vLyB9O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeUFyZWEgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGxhdGl0dWRlOiBudW1iZXIsXG4gIGxvbmdpdHVkZTogbnVtYmVyLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0c0J5QXJlYSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIGRpc3RhbmNlID0gRElTVEFOQ0UoXG4gICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgIE5PVF9OVUxMKHAubGF0aXR1ZGUsIDApLFxuICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgYCk7XG4gIHNlbGVjdE9iamVjdHMucHVzaCgnZGlzdGFuY2U6ZGlzdGFuY2UnKTtcblxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50SWQgPT0gbnVsbFxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgZGlzdGFuY2UsIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFBvc3RUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFBvc3RUeXBlW107XG4gICAgfSk7XG59O1xuXG4vLyBleHBvcnQgY29uc3QgZ2V0UG9zdHNCeUdyb3VwID0gKFxuLy8gICBjb250ZXh0OiBBcGlDb250ZXh0LFxuLy8gICBncm91cElkOiBzdHJpbmcsXG4vLyAgIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuLy8gKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4vLyAgIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeUdyb3VwJztcbi8vICAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbi8vICAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcblxuLy8gICAvLyBHcm91cCBpZFxuLy8gICBjb25zdCBmb3JtYXRHcm91cElkOiBzdHJpbmcgPSBwYXJzZUlkKGdyb3VwSWQpO1xuLy8gICBjb25zdCBkYiA9IGRhdGFiYXNlO1xuLy8gICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdSwgZyBJTiBJTkJPVU5EICR7Zm9ybWF0R3JvdXBJZH0gaGFzR3JvdXBcbi8vICAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHtzZXNzaW9uSWR9XG4vLyAgICAgICBSRVRVUk4gZ2A7XG5cbi8vICAgcmV0dXJuIGRiLnF1ZXJ5KGFxbFFyeSlcbi8vICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgLnRoZW4oKGdyb3VwczogR3JvdXBUeXBlW10gPSBbXSkgPT4ge1xuLy8gICAgICAgaWYoZ3JvdXBzLmxlbmd0aCkge1xuLy8gICAgICAgICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbi8vICAgICAgICAgY29uc3QgcG9zdEFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4vLyAgICAgICAgICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLmdyb3VwSWQgPT0gXCIke2Zvcm1hdEdyb3VwSWR9XCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuLy8gICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbi8vICAgICAgICAgICAke2xpbWl0LmFxbH1cbi8vICAgICAgICAgICBTT1JUIHAuYWRkZWRcbi8vICAgICAgICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuLy8gICAgICAgICByZXR1cm4gZGIucXVlcnkocG9zdEFxbFFyeSlcbi8vICAgICAgICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgICAgICAgIH0pO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICByZXR1cm4gW107XG4vLyAgICAgfSlcbi8vICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuLy8gICAgICAgdGhyb3cgZXJyb3I7XG4vLyAgICAgfSk7XG4vLyB9O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeUxhdGVzdCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5TGF0ZXN0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgcC5hZGRlZCBERVNDXG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlSZWFjdGlvbnMgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHJlYWN0aW9uczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeVJlYWN0aW9ucyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbGltaXQsIGxvbmdpdHVkZSwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBmb3JtYXRTZXNzaW9uSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbnM6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHJlYWN0aW9ucy5tYXAoKHJlYWN0aW9uKSA9PiBwYXJzZUNoYXIocmVhY3Rpb24sIDMyKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IHNvcnRCeTogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbYHAudHlwZSA9PSBcIiR7dHlwZX1cImAsICdwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiddO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG5cbiAgaWYoZm9ybWF0TGF0aXR1ZGUgJiYgZm9ybWF0TG9uZ2l0dWRlKSB7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAgICR7Zm9ybWF0TGF0aXR1ZGV9LFxuICAgICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgICBOT1RfTlVMTChwLmxvbmdpdHVkZSwgMCkpXG4gICAgYCk7XG4gICAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuICAgIHNvcnRCeS5wdXNoKCdkaXN0YW5jZScpO1xuICB9XG5cbiAgaWYocmVhY3Rpb25zLmxlbmd0aCkge1xuICAgIHNvcnRCeS5wdXNoKCdtYXRjaGVkVGFncyBERVNDJyk7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgbWF0Y2hlZFJlYWN0aW9ucyA9IExFTkdUSChcbiAgICAgIEZPUiBtciBJTiByZWFjdGlvbnNcbiAgICAgIEZJTFRFUiBtci5tYXRjaGVkID09IHRydWVcbiAgICAgIFJFVFVSTiBtclxuICAgIClgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ21hdGNoZWRSZWFjdGlvbnM6bWF0Y2hlZFJlYWN0aW9ucycpO1xuICAgIGZpbHRlcnMucHVzaCgnbWF0Y2hlZFJlYWN0aW9ucyA+IDAnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkIERFU0MnKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCdyZWFjdGlvbnM6cmVhY3Rpb25zJyk7XG5cbiAgLy8gR2V0IGRhdGEgZnJvbSBkYXRhYmFzZVxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0U2Vzc2lvbklkfVwiIGhhc1JlYWN0aW9uXG4gICAgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgIEZPUiByZWFjdGlvbiwgaHIgSU4gMS4uMSBJTkJPVU5EIHAgaXNUYWdnZWRcbiAgICAgIExFVCBtYXRjaGVkID0gTEVOR1RIKCR7Zm9ybWF0UmVhY3Rpb25zfSkgPiAwICYmIFBPU0lUSU9OKCR7Zm9ybWF0UmVhY3Rpb25zfSwgcmVhY3Rpb24ubmFtZSlcbiAgICAgIFNPUlQgcmVhY3Rpb24ubmFtZVxuICAgICAgUkVUVVJOIE1FUkdFKHJlYWN0aW9uLCB7bWF0Y2hlZDptYXRjaGVkfSlcbiAgICApXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeVRhZ3MnO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGF0aXR1ZGUsIGxpbWl0LCBsb25naXR1ZGUsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgZm9ybWF0VGFnTmFtZXM6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRhZ3MubWFwKCh0YWcpID0+IHBhcnNlQ2hhcih0YWcsIDMyKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IHNvcnRCeTogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbYHAudHlwZSA9PSBcIiR7dHlwZX1cImAsICdwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiddO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG5cbiAgaWYoZm9ybWF0TGF0aXR1ZGUgJiYgZm9ybWF0TG9uZ2l0dWRlKSB7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAgICR7Zm9ybWF0TGF0aXR1ZGV9LFxuICAgICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgICBOT1RfTlVMTChwLmxvbmdpdHVkZSwgMCkpXG4gICAgYCk7XG4gICAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuICAgIHNvcnRCeS5wdXNoKCdkaXN0YW5jZScpO1xuICB9XG5cbiAgaWYodGFncy5sZW5ndGgpIHtcbiAgICBzb3J0QnkucHVzaCgnbWF0Y2hlZFRhZ3MgREVTQycpO1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIG1hdGNoZWRUYWdzID0gTEVOR1RIKFxuICAgICAgRk9SIHQgSU4gdGFnc1xuICAgICAgRklMVEVSIHQubWF0Y2hlZCA9PSB0cnVlXG4gICAgICBSRVRVUk4gdFxuICAgIClgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ21hdGNoZWRUYWdzOm1hdGNoZWRUYWdzJyk7XG4gICAgZmlsdGVycy5wdXNoKCdtYXRjaGVkVGFncyA+IDAnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkIERFU0MnKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcblxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIExFVCB0YWdzID0gKFxuICAgICAgRk9SIHRhZywgaXQgSU4gMS4uMSBJTkJPVU5EIHAgaXNUYWdnZWRcbiAgICAgIExFVCBtYXRjaGVkID0gTEVOR1RIKCR7Zm9ybWF0VGFnTmFtZXN9KSA+IDAgJiYgUE9TSVRJT04oJHtmb3JtYXRUYWdOYW1lc30sIHRhZy5uYW1lKVxuICAgICAgU09SVCB0YWcubmFtZVxuICAgICAgUkVUVVJOIE1FUkdFKHRhZywge21hdGNoZWQ6bWF0Y2hlZH0pXG4gICAgKVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUICR7c29ydEJ5LmpvaW4oJywgJyl9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBQb3N0VHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBQb3N0VHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlVc2VyID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHVzZXJJZDogc3RyaW5nLCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZm9ybWF0VXNlcklkOiBzdHJpbmcgPSBwYXJzZUlkKHVzZXJJZCk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgRklMVEVSIHAudXNlcklkID09IFwiJHtmb3JtYXRVc2VySWR9XCIgJiYgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50ID09IG51bGxcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBwLmFkZGVkXG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBQb3N0VHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBQb3N0VHlwZVtdO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RDb21tZW50cyA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBwb3N0SWQ6IHN0cmluZywgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RDb21tZW50cyc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKHBvc3RJZCk7XG5cbiAgLy8gR2V0IHRoZSBwYXJlbnQgcG9zdCB0byBnZXQgcmVzdHJpY3Rpb25zXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC50eXBlID09ICR7dHlwZX0gJiYgcC5fa2V5ID09ICR7Zm9ybWF0SXRlbUlkfVxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gcGA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBfa2V5LFxuICAgICAgICBncm91cElkLFxuICAgICAgICBwcml2YWN5ID0gJ2RlZmF1bHQnXG4gICAgICB9OiBQb3N0VHlwZSA9IHBvc3Q7XG5cbiAgICAgIC8vIFF1ZXJ5IGJhc2VkIG9uIHByaXZhY3kgbGV2ZWxcbiAgICAgIGxldCBwcml2YWN5QXFsUXJ5OiBzdHJpbmc7XG5cbiAgICAgIGlmKGdyb3VwSWQgJiYgcHJpdmFjeSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgRk9SIHVzZXIgSU4gdXNlcnNcbiAgICAgICAgICBGSUxURVIgcC5wYXJlbnQgPT0gXCIke19rZXl9XCIgJiYgdXNlci5fa2V5ID09IHAudXNlcklkXG4gICAgICAgICAgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICAgIClcbiAgICAgICAgICBGT1IgZ3JvdXAgSU4gZ3JvdXBzXG4gICAgICAgICAgRklMVEVSIGdyb3VwLl9rZXkgPT0gcC5ncm91cElkXG4gICAgICAgICAgRk9SIHUsIGUgSU4gT1VUQk9VTkQgZ3JvdXAuX2lkIGhhc0Nvbm5lY3Rpb25cbiAgICAgICAgICBGSUxURVIgdS5fa2V5ID09IFwiJHtzZXNzaW9uSWR9XCJcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAgICAgICBGT1IgdXNlciBJTiB1c2Vyc1xuICAgICAgICAgIEZJTFRFUiBwLnBhcmVudCA9PSBcIiR7X2tleX1cIiAmJiB1c2VyLl9rZXkgPT0gcC51c2VySWRcbiAgICAgICAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCByZWFjdGlvbnNcbiAgICAgICAgICAgIENPTExFQ1QgcmVhY3Rpb25OYW1lID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgICAgICAgIFJFVFVSTiB7bmFtZTogcmVhY3Rpb25OYW1lLCBjb3VudDogTEVOR1RIKHJlYWN0aW9uSXRlbXNbKl0uci52YWx1ZSl9XG4gICAgICAgICAgKVxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdIGFzIFBvc3RUeXBlW107XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udGVudCA9ICcnLFxuICAgIGVuZERhdGUsXG4gICAgZ3JvdXBJZCA9ICcnLFxuICAgIGxvY2F0aW9uLFxuICAgIGxhdGl0dWRlLFxuICAgIGxvbmdpdHVkZSxcbiAgICBuYW1lID0gJycsXG4gICAgcGFyZW50SWQgPSBudWxsLFxuICAgIHByaXZhY3kgPSAncHVibGljJyxcbiAgICB0YWdzID0gW10sXG4gICAgc3RhcnREYXRlLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfTogUG9zdElucHV0VHlwZVxuKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHBvc3RJZCA9IGNyZWF0ZUhhc2goYHBvc3QtJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGluc2VydDogUG9zdFR5cGUgPSB7XG4gICAgX2lkOiBgcG9zdHMvJHtwb3N0SWR9YCxcbiAgICBfa2V5OiBwb3N0SWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICBjb250ZW50OiBwYXJzZVN0cmluZyhjb250ZW50LCBNQVhfQ09OVEVOVF9MRU5HVEgpLFxuICAgIGVuZERhdGU6IGVuZERhdGUgPyBwYXJzZU51bShlbmREYXRlLCAxMykgOiB1bmRlZmluZWQsXG4gICAgZ3JvdXBJZDogZ3JvdXBJZCA/IHBhcnNlSWQoZ3JvdXBJZCkgOiB1bmRlZmluZWQsXG4gICAgbGF0aXR1ZGU6IGxhdGl0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsYXRpdHVkZSkgOiB1bmRlZmluZWQsXG4gICAgbG9jYXRpb246IGxvY2F0aW9uID8gcGFyc2VTdHJpbmcobG9jYXRpb24sIDE2MCkgOiB1bmRlZmluZWQsXG4gICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlTnVtKGxvbmdpdHVkZSkgOiB1bmRlZmluZWQsXG4gICAgbW9kaWZpZWQ6IG5vdyxcbiAgICBuYW1lOiBwYXJzZVN0cmluZyhuYW1lLCAxNjApLFxuICAgIHBhcmVudElkOiBwYXJlbnRJZCA/IHBhcnNlSWQocGFyZW50SWQpIDogdW5kZWZpbmVkLFxuICAgIHByaXZhY3k6IHBhcnNlVmFyQ2hhcihwcml2YWN5LCAxNiksXG4gICAgc3RhcnREYXRlOiBzdGFydERhdGUgPyBwYXJzZU51bShzdGFydERhdGUsIDEzKSA6IHVuZGVmaW5lZCxcbiAgICB0eXBlOiBwYXJzZUNoYXIodHlwZSwgMzIpLFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHNhdmVkUG9zdDogUG9zdFR5cGUgPSBhd2FpdCBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gICAgY29uc3Qge19pZDogcG9zdERvY0lkfSA9IHNhdmVkUG9zdDtcbiAgICBjb25zdCBjb250ZW50VGFnTmFtZXMgPSBhd2FpdCBleHRyYWN0VGFncyhpbnNlcnQuY29udGVudCk7XG5cbiAgICBpZih0YWdzLmxlbmd0aCB8fCBjb250ZW50VGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1c2VyVGFncyA9IChhd2FpdCBnZXRUYWdzQnlOYW1lKGNvbnRleHQsIHRhZ3MubWFwKCh7bmFtZX0pID0+IG5hbWUpKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6IHNlc3Npb25JZH0pKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUYWdzID0gKGF3YWl0IGdldFRhZ3NCeU5hbWUoY29udGV4dCwgY29udGVudFRhZ05hbWVzKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6ICdleHRyYWN0J30pKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUYWdzOiBUYWdUeXBlW10gPSBhd2FpdCB1cGRhdGVUYWdzSW5JdGVtKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgaXRlbURvY0lkOiBwb3N0RG9jSWQsXG4gICAgICAgICAgdGFnczogWy4uLmNvbnRlbnRUYWdzLCAuLi51c2VyVGFnc11cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc2F2ZWRQb3N0LFxuICAgICAgICB0YWdzOiB1cGRhdGVkVGFnc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2F2ZWRQb3N0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3Q6IFBvc3RJbnB1dFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZVBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBwYXJzZWRQb3N0ID0gcGFyc2VQb3N0KHBvc3QpO1xuICBjb25zdCB7XG4gICAgcG9zdElkLFxuICAgIHRhZ3MgPSBbXVxuICB9ID0gcGFyc2VkUG9zdDtcblxuICBjb25zdCB1cGRhdGU6IFBvc3RUeXBlID0ge1xuICAgIC4uLnBhcnNlZFBvc3QsXG4gICAgbW9kaWZpZWQ6IG5vd1xuICB9O1xuXG4gIGlmKCFwb3N0SWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9JRFxuICAgIH0sIHt9KTtcbiAgfVxuXG4gIGNvbnN0IGluc2VydCA9IHtcbiAgICAuLi51cGRhdGUsXG4gICAgX2tleTogcG9zdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge19rZXk6ICR7cG9zdElkfSwgdXNlcklkOiAke3Nlc3Npb25JZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwb3N0cyBSRVRVUk4gTkVXYDtcblxuICB0cnkge1xuICAgIGNvbnN0IHVwZGF0ZWRQb3N0OiBQb3N0VHlwZSA9IGF3YWl0IGRhdGFiYXNlXG4gICAgICAucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwge30pKTtcbiAgICBjb25zdCB7X2lkOiB1cGRhdGVkUG9zdElkfSA9IHVwZGF0ZWRQb3N0O1xuICAgIGNvbnN0IGNvbnRlbnRUYWdOYW1lcyA9IGF3YWl0IGV4dHJhY3RUYWdzKGluc2VydC5jb250ZW50KTtcblxuICAgIGlmKHRhZ3M/Lmxlbmd0aCB8fCBjb250ZW50VGFnTmFtZXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdXNlclRhZ3MgPSB0YWdzPy5sZW5ndGggPyAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCB0YWdzLm1hcCgoe25hbWV9KSA9PiBuYW1lKSkpXG4gICAgICAgIC5tYXAoKHRhZykgPT4gKHsuLi50YWcsIHRhZ0J5OiBzZXNzaW9uSWR9KSkgOiBbXTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUYWdzID0gY29udGVudFRhZ05hbWVzPy5sZW5ndGggPyAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCBjb250ZW50VGFnTmFtZXMpKVxuICAgICAgICAubWFwKCh0YWcpID0+ICh7Li4udGFnLCB0YWdCeTogJ2V4dHJhY3QnfSkpIDogW107XG4gICAgICBjb25zdCB1cGRhdGVkVGFnczogVGFnVHlwZVtdID0gYXdhaXQgdXBkYXRlVGFnc0luSXRlbShcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAge1xuICAgICAgICAgIGl0ZW1Eb2NJZDogdXBkYXRlZFBvc3RJZCxcbiAgICAgICAgICB0YWdzOiBbLi4uY29udGVudFRhZ3MsIC4uLnVzZXJUYWdzXVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVkUG9zdCxcbiAgICAgICAgdGFnczogdXBkYXRlZFRhZ3NcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWRQb3N0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3REb2NJZDogc3RyaW5nKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFBvc3RJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChwb3N0RG9jSWQpO1xuXG4gIGlmKCFmb3JtYXRQb3N0SWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9JRFxuICAgIH0sIHt9KTtcbiAgfVxuXG4gIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gIEZJTFRFUiB0Ll90byA9PSAke2Zvcm1hdFBvc3RJZH1cbiAgUkVNT1ZFIHQgSU4gaXNUYWdnZWRgO1xuXG4gIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuXG4gIGNvbnN0IGZpbGVBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBmIElOIGhhc0ZpbGVcbiAgICBGSUxURVIgZi5fdG8gPT0gJHtmb3JtYXRQb3N0SWR9XG4gICAgUkVNT1ZFIGYgSU4gaGFzRmlsZWA7XG5cbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkoZmlsZUFxbFFyeSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG5cbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgICBGSUxURVIgcC5faWQgPT0gJHtmb3JtYXRQb3N0SWR9ICYmIHAudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVNT1ZFIHAgSU4gcG9zdHNcbiAgICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUG9zdEVkZ2UgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHBvc3REb2NJZDogc3RyaW5nLFxuICBpdGVtRG9jSWQ6IHN0cmluZyxcbiAgZWRnZVR5cGU6IHN0cmluZyA9ICdpc1Bvc3RlZCcsXG4gIHByb3BzID0ge31cbik6IFByb21pc2U8RmlsZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2NyZWF0ZVBvc3RFZGdlJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oZWRnZVR5cGUpO1xuICBjb25zdCBmb3JtYXRQb3N0SWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQocG9zdERvY0lkKTtcbiAgY29uc3QgZm9ybWF0RG9jSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbURvY0lkKTtcblxuICBpZighZm9ybWF0RG9jSWQgfHwgIWZvcm1hdFBvc3RJZCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoRXJyb3JUeXBlcy5JTlZBTElEX0lEKSk7XG4gIH1cblxuICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHBvc3RFZGdlLSR7Zm9ybWF0UG9zdElkfS0ke2Zvcm1hdERvY0lkfWApO1xuICBjb25zdCBlZGdlID0ge1xuICAgIF9mcm9tOiBmb3JtYXRQb3N0SWQsXG4gICAgX2tleTogZWRnZUlkLFxuICAgIF90bzogZm9ybWF0RG9jSWQsXG4gICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgLi4ucHJvcHNcbiAgfTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT5cbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCB7fSkpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBLG1CQUVPO0FBQ1Asc0JBQWtCO0FBR2xCLGtCQUEyRDtBQUMzRCx5QkFBd0I7QUFDeEIsbUJBQXlCO0FBQ3pCLDRCQUFxQztBQUNyQywyQkFBdUI7QUFLdkIsTUFBTSxxQkFBNkI7QUFDbkMsTUFBTSxnQkFBd0I7QUFFdkIsTUFBTSxtQkFBbUIsQ0FBQyxVQUF1QixDQUFDLE1BQU07QUFDN0QsUUFBTTtBQUFBLElBQ0osT0FBTztBQUFBLElBQ1AsV0FBVztBQUFBLElBQ1gsWUFBWTtBQUFBLElBQ1osS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1QsSUFBSTtBQUVKLFNBQU87QUFBQSxJQUNMLGNBQVUsdUJBQVMsVUFBVSxFQUFFO0FBQUEsSUFDL0IsV0FBTywrQkFBUyxNQUFNLEVBQUU7QUFBQSxJQUN4QixlQUFXLHVCQUFTLFdBQVcsRUFBRTtBQUFBLElBQ2pDLFVBQU0sd0JBQVUsTUFBTSxFQUFFO0FBQUEsRUFDMUI7QUFDRjtBQUVPLE1BQU0sa0JBQWtCLENBQUMsUUFBa0IsZUFDL0MsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQVMsVUFBa0I7QUFD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
|