@nlabs/reaktor 0.9.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env +1 -0
- package/.env.example +1 -0
- package/DATABASE_I18N_GUIDE.md +434 -0
- package/README.md +9 -0
- package/TEST_UTILITIES_GUIDE.md +360 -0
- package/coverage/index.html +61 -46
- 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/{lib → dist}/types/arangodb.js +1 -1
- package/{lib → dist}/types/auth.js +1 -1
- package/{lib → dist}/types/connections.js +1 -1
- package/dist/types/conversations.js +16 -0
- package/{lib → dist}/types/email.js +1 -1
- package/dist/types/files.js +16 -0
- 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/{lib → dist}/types/messages.js +1 -1
- 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/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/{lib → dist}/utils/session.js +10 -7
- package/index.js +1 -1
- package/jest.config.js +17 -0
- package/jest.setup.js +36 -0
- package/lex.config.cjs +13 -0
- package/lib/actions/apps.js +17 -249
- package/lib/actions/connections.js +7 -0
- package/lib/actions/content.js +17 -0
- package/lib/actions/conversations.js +19 -325
- package/lib/actions/dynamodb.js +2 -150
- package/lib/actions/email.js +2 -152
- package/lib/actions/files.js +5 -287
- package/lib/actions/groups.js +23 -263
- package/lib/actions/images.js +31 -646
- package/lib/actions/index.js +2 -62
- package/lib/actions/ios.js +9 -162
- package/lib/actions/locations.js +7 -110
- package/lib/actions/messages.js +21 -193
- package/lib/actions/notifications.js +2 -59
- package/lib/actions/payments.js +11 -461
- package/lib/actions/posts.js +77 -515
- package/lib/actions/profiles.js +8 -0
- package/lib/actions/reactions.js +25 -312
- package/lib/actions/s3.js +2 -133
- package/lib/actions/search.js +5 -90
- package/lib/actions/sms.js +2 -106
- package/lib/actions/statistics.js +6 -60
- package/lib/actions/subscriptions.js +12 -0
- package/lib/actions/tags.js +19 -262
- package/lib/actions/users.js +67 -537
- package/lib/actions/websockets.js +16 -158
- package/lib/adapters/arangoAdapter.js +2 -46
- package/lib/adapters/contentAdapter.js +2 -0
- package/lib/adapters/fileAdapter.js +2 -76
- package/lib/adapters/imageAdapter.js +2 -0
- package/lib/adapters/messageAdapter.js +2 -0
- package/lib/adapters/postAdapter.js +2 -70
- package/lib/adapters/reaktorAdapter.js +2 -44
- package/lib/adapters/tagAdapter.js +2 -50
- package/lib/adapters/userAdapter.js +2 -110
- package/lib/config.js +2 -125
- package/lib/handlers/graphqlHandler.js +2 -0
- package/lib/index.js +2 -30
- package/lib/lambdas/actions/websockets.js +14 -112
- package/lib/lambdas/authorizer.js +2 -67
- package/lib/lambdas/connection.js +2 -92
- package/lib/lambdas/utils/message.js +2 -42
- package/lib/lambdas/utils/websocket.js +2 -105
- package/lib/mocks/conversation.js +2 -35
- package/lib/mocks/file.js +2 -38
- package/lib/mocks/group.js +2 -47
- package/lib/mocks/image.js +2 -43
- package/lib/mocks/post.js +2 -55
- package/lib/mocks/tag.js +2 -37
- package/lib/mocks/user.js +2 -88
- package/lib/mutations/index.js +2 -0
- package/lib/mutations/locations.integration.js +2 -0
- package/lib/mutations/locations.js +2 -0
- package/lib/mutations/messages.integration.js +2 -0
- package/lib/mutations/messages.js +2 -0
- package/lib/mutations/posts.integration.js +2 -0
- package/lib/mutations/posts.js +2 -0
- package/lib/mutations/profiles.integration.js +2 -0
- package/lib/mutations/profiles.js +2 -0
- package/lib/mutations/reactions.integration.js +2 -0
- package/lib/mutations/reactions.js +2 -0
- package/lib/mutations/statistics.integration.js +2 -0
- package/lib/mutations/statistics.js +2 -0
- package/lib/mutations/subscriptions.integration.js +2 -0
- package/lib/mutations/subscriptions.js +2 -0
- package/lib/mutations/tags.integration.js +2 -0
- package/lib/mutations/tags.js +2 -0
- package/lib/mutations/users.integration.js +2 -0
- package/lib/mutations/users.js +2 -0
- package/lib/objectTypes/app.js +2 -0
- package/lib/objectTypes/bankAccount.js +2 -0
- package/lib/objectTypes/connection.js +2 -0
- package/lib/objectTypes/conversation.js +2 -0
- package/lib/objectTypes/creditCard.js +2 -0
- package/lib/objectTypes/document.js +2 -0
- package/lib/objectTypes/error.js +2 -0
- package/lib/objectTypes/external.js +2 -0
- package/lib/objectTypes/file.js +2 -0
- package/lib/objectTypes/filter.js +2 -0
- package/lib/objectTypes/group.js +2 -0
- package/lib/objectTypes/iapSubscription.js +2 -0
- package/lib/objectTypes/image.js +2 -0
- package/lib/objectTypes/index.js +2 -0
- package/lib/objectTypes/location.js +2 -0
- package/lib/objectTypes/message.js +2 -0
- package/lib/objectTypes/passcode.js +2 -0
- package/lib/objectTypes/plan.js +2 -0
- package/lib/objectTypes/post.js +2 -0
- package/lib/objectTypes/profile.js +2 -0
- package/lib/objectTypes/reaction.js +2 -0
- package/lib/objectTypes/relation.js +2 -0
- package/lib/objectTypes/search.js +2 -0
- package/lib/objectTypes/statistics.js +2 -0
- package/lib/objectTypes/subscription.js +2 -0
- package/lib/objectTypes/tag.js +2 -0
- package/lib/objectTypes/user.js +2 -0
- package/lib/queries/index.js +2 -0
- package/lib/queries/locations.integration.js +2 -0
- package/lib/queries/locations.js +2 -0
- package/lib/queries/messages.integration.js +2 -0
- package/lib/queries/messages.js +2 -0
- package/lib/queries/posts.integration.js +2 -0
- package/lib/queries/posts.js +2 -0
- package/lib/queries/reactions.integration.js +2 -0
- package/lib/queries/reactions.js +2 -0
- package/lib/queries/statistics.js +2 -0
- package/lib/queries/subscriptions.js +2 -0
- package/lib/queries/tags.integration.js +2 -0
- package/lib/queries/tags.js +2 -0
- package/lib/queries/users.integration.js +2 -0
- package/lib/queries/users.js +2 -0
- package/lib/templates/email/layout.js +3 -25
- package/lib/templates/email/passwordForgot.js +3 -25
- package/lib/templates/email/passwordRecovery.js +3 -25
- package/lib/templates/email/verifyEmail.js +3 -25
- package/lib/templates/email/welcome.js +3 -25
- package/lib/templates/sms/passwordForgot.js +2 -24
- package/lib/templates/sms/passwordRecovery.js +2 -24
- package/lib/templates/sms/verifyEmail.js +2 -24
- package/lib/templates/sms/verifyPhone.js +2 -24
- package/lib/templates/sms/welcome.js +2 -24
- package/lib/types/apps.types.js +2 -0
- package/lib/types/arangodb.types.js +1 -0
- package/lib/types/auth.types.js +1 -0
- package/lib/types/connections.types.js +1 -0
- package/lib/types/content.types.js +1 -0
- package/lib/types/conversations.types.js +1 -0
- package/lib/types/email.types.js +1 -0
- package/lib/types/error.types.js +2 -0
- package/lib/types/files.types.js +1 -0
- package/lib/types/google.types.js +1 -0
- package/lib/types/groups.types.js +1 -0
- package/lib/types/images.types.js +1 -0
- package/lib/types/index.js +2 -56
- package/lib/types/locations.types.js +1 -0
- package/lib/types/messages.types.js +1 -0
- package/lib/types/notifications.types.js +1 -0
- package/lib/types/payments.types.js +1 -0
- package/lib/types/posts.types.js +1 -0
- package/lib/types/profiles.types.js +1 -0
- package/lib/types/statistics.types.js +1 -0
- package/lib/types/tags.types.js +1 -0
- package/lib/types/users.types.js +1 -0
- package/lib/types/websockets.types.js +1 -0
- package/lib/utils/adapterUtils.js +2 -45
- package/lib/utils/analyticsUtils.js +2 -72
- package/lib/utils/arangodbUtils.js +5 -142
- package/lib/utils/authUtils.js +2 -0
- package/lib/utils/contextUtils.js +2 -0
- package/lib/utils/dbI18n.example.js +6 -0
- package/lib/utils/dbI18n.js +2 -0
- package/lib/utils/googleTranslate.js +2 -0
- package/lib/utils/graphqlUtils.js +2 -0
- package/lib/utils/index.js +2 -30
- package/lib/utils/languageDetection.js +2 -0
- package/lib/utils/localeUtils.example.js +2 -0
- package/lib/utils/localeUtils.js +2 -0
- package/lib/utils/middlewareUtils.js +2 -0
- package/lib/utils/sessionUtils.js +2 -0
- package/lib/utils/stripeUtils.js +2 -0
- package/lib/utils/templateUtils.js +2 -0
- package/lib/utils/testUtils.js +2 -0
- package/lib/utils/translationQueue.example.js +2 -0
- package/lib/utils/translationQueue.js +2 -0
- package/package.json +41 -37
- package/.eslintrc +0 -10
- package/.prettierrc.js +0 -4
- package/lib/actions/apps.d.ts +0 -25
- package/lib/actions/conversations.d.ts +0 -14
- package/lib/actions/dynamodb.d.ts +0 -8
- package/lib/actions/email.d.ts +0 -5
- package/lib/actions/files.d.ts +0 -19
- package/lib/actions/groups.d.ts +0 -14
- package/lib/actions/images.d.ts +0 -26
- package/lib/actions/index.d.ts +0 -21
- package/lib/actions/ios.d.ts +0 -7
- package/lib/actions/locations.d.ts +0 -5
- package/lib/actions/messages.d.ts +0 -13
- package/lib/actions/notifications.d.ts +0 -5
- package/lib/actions/payments.d.ts +0 -10
- package/lib/actions/posts.d.ts +0 -19
- package/lib/actions/reactions.d.ts +0 -30
- package/lib/actions/s3.d.ts +0 -7
- package/lib/actions/search.d.ts +0 -3
- package/lib/actions/sms.d.ts +0 -3
- package/lib/actions/statistics.d.ts +0 -3
- package/lib/actions/subscription.d.ts +0 -7
- package/lib/actions/subscription.js +0 -218
- package/lib/actions/tags.d.ts +0 -29
- package/lib/actions/users.d.ts +0 -47
- package/lib/actions/websockets.d.ts +0 -19
- package/lib/adapters/arangoAdapter.d.ts +0 -2
- package/lib/adapters/fileAdapter.d.ts +0 -3
- package/lib/adapters/postAdapter.d.ts +0 -2
- package/lib/adapters/reaktorAdapter.d.ts +0 -6
- package/lib/adapters/tagAdapter.d.ts +0 -2
- package/lib/adapters/userAdapter.d.ts +0 -2
- package/lib/config.d.ts +0 -20
- package/lib/index.d.ts +0 -5
- package/lib/lambdas/actions/websockets.d.ts +0 -6
- package/lib/lambdas/authorizer.d.ts +0 -20
- package/lib/lambdas/connection.d.ts +0 -12
- package/lib/lambdas/utils/message.d.ts +0 -1
- package/lib/lambdas/utils/websocket.d.ts +0 -7
- package/lib/mocks/conversation.d.ts +0 -8
- package/lib/mocks/file.d.ts +0 -11
- package/lib/mocks/group.d.ts +0 -17
- package/lib/mocks/image.d.ts +0 -3
- package/lib/mocks/post.d.ts +0 -38
- package/lib/mocks/tag.d.ts +0 -2
- package/lib/mocks/user.d.ts +0 -4
- package/lib/templates/email/layout.d.ts +0 -2
- package/lib/templates/email/passwordForgot.d.ts +0 -2
- package/lib/templates/email/passwordRecovery.d.ts +0 -2
- package/lib/templates/email/verifyEmail.d.ts +0 -2
- package/lib/templates/email/welcome.d.ts +0 -2
- package/lib/templates/sms/passwordForgot.d.ts +0 -2
- package/lib/templates/sms/passwordRecovery.d.ts +0 -2
- package/lib/templates/sms/verifyEmail.d.ts +0 -2
- package/lib/templates/sms/verifyPhone.d.ts +0 -2
- package/lib/templates/sms/welcome.d.ts +0 -2
- package/lib/types/apps.d.ts +0 -46
- package/lib/types/apps.js +0 -32
- package/lib/types/arangodb.d.ts +0 -30
- package/lib/types/auth.d.ts +0 -7
- package/lib/types/connections.d.ts +0 -7
- package/lib/types/conversations.d.ts +0 -29
- package/lib/types/conversations.js +0 -16
- package/lib/types/email.d.ts +0 -13
- package/lib/types/error.d.ts +0 -20
- package/lib/types/files.d.ts +0 -26
- package/lib/types/files.js +0 -16
- package/lib/types/google.d.ts +0 -29
- package/lib/types/google.js +0 -16
- package/lib/types/groups.d.ts +0 -21
- package/lib/types/images.d.ts +0 -51
- package/lib/types/images.js +0 -16
- package/lib/types/index.d.ts +0 -18
- package/lib/types/locations.d.ts +0 -20
- package/lib/types/messages.d.ts +0 -16
- package/lib/types/notifications.d.ts +0 -17
- package/lib/types/payments.d.ts +0 -112
- package/lib/types/payments.js +0 -16
- package/lib/types/posts.d.ts +0 -31
- package/lib/types/posts.js +0 -16
- package/lib/types/statistics.d.ts +0 -3
- package/lib/types/tags.d.ts +0 -10
- package/lib/types/users.d.ts +0 -76
- package/lib/types/users.js +0 -16
- package/lib/types/websocket.d.ts +0 -13
- package/lib/types/websocket.js +0 -16
- package/lib/utils/adapterUtils.d.ts +0 -1
- package/lib/utils/analyticsUtils.d.ts +0 -21
- package/lib/utils/arangodbUtils.d.ts +0 -65
- package/lib/utils/auth.d.ts +0 -20
- package/lib/utils/auth.js +0 -50
- package/lib/utils/index.d.ts +0 -5
- package/lib/utils/session.d.ts +0 -16
- /package/{lib → dist}/types/error.js +0 -0
- /package/{lib → dist}/types/statistics.js +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import{createHash as U,parseChar as E,parseId as q,parseVarChar as e}from"@nlabs/utils";import{aql as A}from"arangojs";import{useDb as I}from"../utils/arangodbUtils";const R=(N,n)=>{const{databaseName:P}=N,{city:d,country:t,street1:i,street2:r,zip:f,state:u,timezone:o,firstName:s,lastName:a,gender:p,name:m,userId:y}=n,l={city:d!==void 0?e(d,32):void 0,country:t!==void 0?e(t,32):void 0,firstName:s!==void 0?e(s,32):void 0,gender:p!==void 0?E(p,1).toUpperCase():void 0,lastName:a!==void 0?e(a,32):void 0,modified:Date.now(),name:m!==void 0?e(m,32):void 0,state:u!==void 0?e(u,2):void 0,street1:i!==void 0?e(i,32):void 0,street2:r!==void 0?e(r,32):void 0,timezone:o!==void 0?e(o,32):void 0,zip:f!==void 0?e(f,15):void 0},c={...l,_key:U(y),added:Date.now(),userId:q(y)},T=A`UPSERT {sub: ${c._key}}
|
|
2
|
+
INSERT ${c}
|
|
3
|
+
UPDATE ${l}
|
|
4
|
+
IN profiles RETURN NEW`;return I(P).query(T).then(z=>z.next())},$=(N,n)=>{const{databaseName:P}=N,{city:d,country:t,street1:i,street2:r,zip:f,state:u,timezone:o,firstName:s,lastName:a,gender:p,name:m,userId:y}=n,l={city:d!==void 0?e(d,32):void 0,country:t!==void 0?e(t,32):void 0,firstName:s!==void 0?e(s,32):void 0,gender:p!==void 0?E(p,1).toUpperCase():void 0,lastName:a!==void 0?e(a,32):void 0,modified:Date.now(),name:m!==void 0?e(m,32):void 0,state:u!==void 0?e(u,2):void 0,street1:i!==void 0?e(i,32):void 0,street2:r!==void 0?e(r,32):void 0,timezone:o!==void 0?e(o,32):void 0,userId:y!==void 0?q(y):void 0,zip:f!==void 0?e(f,15):void 0},c=A`UPDATE {sub: ${n._key}}
|
|
5
|
+
INSERT ${n}
|
|
6
|
+
UPDATE ${l}
|
|
7
|
+
IN profiles RETURN NEW`;return I(P).query(c).then(T=>T.next())};export{R as addProfile,$ as updateProfile};
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcHJvZmlsZXMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7Y3JlYXRlSGFzaCwgcGFyc2VDaGFyLCBwYXJzZUlkLCBwYXJzZVZhckNoYXJ9IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuXG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzJztcblxuaW1wb3J0IHR5cGUge0FwaUNvbnRleHQsIFByb2ZpbGVUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5cbmV4cG9ydCBjb25zdCBhZGRQcm9maWxlID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHByb2ZpbGU6IFByb2ZpbGVUeXBlKTogUHJvbWlzZTxQcm9maWxlVHlwZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtcbiAgICBjaXR5LFxuICAgIGNvdW50cnksXG4gICAgc3RyZWV0MSxcbiAgICBzdHJlZXQyLFxuICAgIHppcCxcbiAgICBzdGF0ZSxcbiAgICB0aW1lem9uZSxcbiAgICBmaXJzdE5hbWUsXG4gICAgbGFzdE5hbWUsXG4gICAgZ2VuZGVyLFxuICAgIG5hbWUsXG4gICAgdXNlcklkXG4gIH0gPSBwcm9maWxlO1xuXG4gIGNvbnN0IHVwZGF0ZTogUHJvZmlsZVR5cGUgPSB7XG4gICAgY2l0eTogY2l0eSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKGNpdHksIDMyKSA6IHVuZGVmaW5lZCxcbiAgICBjb3VudHJ5OiBjb3VudHJ5ICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoY291bnRyeSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIGZpcnN0TmFtZTogZmlyc3ROYW1lICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoZmlyc3ROYW1lLCAzMikgOiB1bmRlZmluZWQsXG4gICAgZ2VuZGVyOiBnZW5kZXIgIT09IHVuZGVmaW5lZCA/IHBhcnNlQ2hhcihnZW5kZXIsIDEpLnRvVXBwZXJDYXNlKCkgOiB1bmRlZmluZWQsXG4gICAgbGFzdE5hbWU6IGxhc3ROYW1lICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIobGFzdE5hbWUsIDMyKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKSxcbiAgICBuYW1lOiBuYW1lICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIobmFtZSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIHN0YXRlOiBzdGF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKHN0YXRlLCAyKSA6IHVuZGVmaW5lZCxcbiAgICBzdHJlZXQxOiBzdHJlZXQxICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoc3RyZWV0MSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIHN0cmVldDI6IHN0cmVldDIgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihzdHJlZXQyLCAzMikgOiB1bmRlZmluZWQsXG4gICAgdGltZXpvbmU6IHRpbWV6b25lICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIodGltZXpvbmUsIDMyKSA6IHVuZGVmaW5lZCxcbiAgICB6aXA6IHppcCAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKHppcCwgMTUpIDogdW5kZWZpbmVkXG4gIH07XG5cbiAgY29uc3QgaW5zZXJ0OiBQcm9maWxlVHlwZSA9IHtcbiAgICAuLi51cGRhdGUsXG4gICAgX2tleTogY3JlYXRlSGFzaCh1c2VySWQpLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIHVzZXJJZDogcGFyc2VJZCh1c2VySWQpXG4gIH07XG5cbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQge3N1YjogJHtpbnNlcnQuX2tleX19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwcm9maWxlcyBSRVRVUk4gTkVXYDtcbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVByb2ZpbGUgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcHJvZmlsZTogUHJvZmlsZVR5cGUpOiBQcm9taXNlPFByb2ZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3Qge1xuICAgIGNpdHksXG4gICAgY291bnRyeSxcbiAgICBzdHJlZXQxLFxuICAgIHN0cmVldDIsXG4gICAgemlwLFxuICAgIHN0YXRlLFxuICAgIHRpbWV6b25lLFxuICAgIGZpcnN0TmFtZSxcbiAgICBsYXN0TmFtZSxcbiAgICBnZW5kZXIsXG4gICAgbmFtZSxcbiAgICB1c2VySWRcbiAgfSA9IHByb2ZpbGU7XG5cbiAgY29uc3QgdXBkYXRlOiBQcm9maWxlVHlwZSA9IHtcbiAgICBjaXR5OiBjaXR5ICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoY2l0eSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIGNvdW50cnk6IGNvdW50cnkgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihjb3VudHJ5LCAzMikgOiB1bmRlZmluZWQsXG4gICAgZmlyc3ROYW1lOiBmaXJzdE5hbWUgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihmaXJzdE5hbWUsIDMyKSA6IHVuZGVmaW5lZCxcbiAgICBnZW5kZXI6IGdlbmRlciAhPT0gdW5kZWZpbmVkID8gcGFyc2VDaGFyKGdlbmRlciwgMSkudG9VcHBlckNhc2UoKSA6IHVuZGVmaW5lZCxcbiAgICBsYXN0TmFtZTogbGFzdE5hbWUgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihsYXN0TmFtZSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBEYXRlLm5vdygpLFxuICAgIG5hbWU6IG5hbWUgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihuYW1lLCAzMikgOiB1bmRlZmluZWQsXG4gICAgc3RhdGU6IHN0YXRlICE9PSB1bmRlZmluZWQgPyBwYXJzZVZhckNoYXIoc3RhdGUsIDIpIDogdW5kZWZpbmVkLFxuICAgIHN0cmVldDE6IHN0cmVldDEgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcihzdHJlZXQxLCAzMikgOiB1bmRlZmluZWQsXG4gICAgc3RyZWV0Mjogc3RyZWV0MiAhPT0gdW5kZWZpbmVkID8gcGFyc2VWYXJDaGFyKHN0cmVldDIsIDMyKSA6IHVuZGVmaW5lZCxcbiAgICB0aW1lem9uZTogdGltZXpvbmUgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcih0aW1lem9uZSwgMzIpIDogdW5kZWZpbmVkLFxuICAgIHVzZXJJZDogdXNlcklkICE9PSB1bmRlZmluZWQgPyBwYXJzZUlkKHVzZXJJZCkgOiB1bmRlZmluZWQsXG4gICAgemlwOiB6aXAgIT09IHVuZGVmaW5lZCA/IHBhcnNlVmFyQ2hhcih6aXAsIDE1KSA6IHVuZGVmaW5lZFxuICB9O1xuXG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFIHtzdWI6ICR7cHJvZmlsZS5fa2V5fX1cbiAgICBJTlNFUlQgJHtwcm9maWxlfVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBJTiBwcm9maWxlcyBSRVRVUk4gTkVXYDtcbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KS50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpO1xufTsiXSwKICAibWFwcGluZ3MiOiAiQUFBQSxPQUFRLGNBQUFBLEVBQVksYUFBQUMsRUFBVyxXQUFBQyxFQUFTLGdCQUFBQyxNQUFtQixlQUMzRCxPQUFRLE9BQUFDLE1BQVUsV0FFbEIsT0FBUSxTQUFBQyxNQUFZLHlCQUtiLE1BQU1DLEVBQWEsQ0FBQ0MsRUFBcUJDLElBQStDLENBQzdGLEtBQU0sQ0FBQyxhQUFBQyxDQUFZLEVBQUlGLEVBQ2pCLENBQ0osS0FBQUcsRUFDQSxRQUFBQyxFQUNBLFFBQUFDLEVBQ0EsUUFBQUMsRUFDQSxJQUFBQyxFQUNBLE1BQUFDLEVBQ0EsU0FBQUMsRUFDQSxVQUFBQyxFQUNBLFNBQUFDLEVBQ0EsT0FBQUMsRUFDQSxLQUFBQyxFQUNBLE9BQUFDLENBQ0YsRUFBSWIsRUFFRWMsRUFBc0IsQ0FDMUIsS0FBTVosSUFBUyxPQUFZUCxFQUFhTyxFQUFNLEVBQUUsRUFBSSxPQUNwRCxRQUFTQyxJQUFZLE9BQVlSLEVBQWFRLEVBQVMsRUFBRSxFQUFJLE9BQzdELFVBQVdNLElBQWMsT0FBWWQsRUFBYWMsRUFBVyxFQUFFLEVBQUksT0FDbkUsT0FBUUUsSUFBVyxPQUFZbEIsRUFBVWtCLEVBQVEsQ0FBQyxFQUFFLFlBQVksRUFBSSxPQUNwRSxTQUFVRCxJQUFhLE9BQVlmLEVBQWFlLEVBQVUsRUFBRSxFQUFJLE9BQ2hFLFNBQVUsS0FBSyxJQUFJLEVBQ25CLEtBQU1FLElBQVMsT0FBWWpCLEVBQWFpQixFQUFNLEVBQUUsRUFBSSxPQUNwRCxNQUFPTCxJQUFVLE9BQVlaLEVBQWFZLEVBQU8sQ0FBQyxFQUFJLE9BQ3RELFFBQVNILElBQVksT0FBWVQsRUFBYVMsRUFBUyxFQUFFLEVBQUksT0FDN0QsUUFBU0MsSUFBWSxPQUFZVixFQUFhVSxFQUFTLEVBQUUsRUFBSSxPQUM3RCxTQUFVRyxJQUFhLE9BQVliLEVBQWFhLEVBQVUsRUFBRSxFQUFJLE9BQ2hFLElBQUtGLElBQVEsT0FBWVgsRUFBYVcsRUFBSyxFQUFFLEVBQUksTUFDbkQsRUFFTVMsRUFBc0IsQ0FDMUIsR0FBR0QsRUFDSCxLQUFNdEIsRUFBV3FCLENBQU0sRUFDdkIsTUFBTyxLQUFLLElBQUksRUFDaEIsT0FBUW5CLEVBQVFtQixDQUFNLENBQ3hCLEVBRU1HLEVBQW1CcEIsaUJBQW1CbUIsRUFBTyxJQUFJO0FBQUEsYUFDNUNBLENBQU07QUFBQSxhQUNORCxDQUFNO0FBQUEsNEJBRWpCLE9BQU9qQixFQUFNSSxDQUFZLEVBQUUsTUFBTWUsQ0FBTSxFQUFFLEtBQU1DLEdBQVdBLEVBQU8sS0FBSyxDQUFDLENBQ3pFLEVBRWFDLEVBQWdCLENBQUNuQixFQUFxQkMsSUFBK0MsQ0FDaEcsS0FBTSxDQUFDLGFBQUFDLENBQVksRUFBSUYsRUFDakIsQ0FDSixLQUFBRyxFQUNBLFFBQUFDLEVBQ0EsUUFBQUMsRUFDQSxRQUFBQyxFQUNBLElBQUFDLEVBQ0EsTUFBQUMsRUFDQSxTQUFBQyxFQUNBLFVBQUFDLEVBQ0EsU0FBQUMsRUFDQSxPQUFBQyxFQUNBLEtBQUFDLEVBQ0EsT0FBQUMsQ0FDRixFQUFJYixFQUVFYyxFQUFzQixDQUMxQixLQUFNWixJQUFTLE9BQVlQLEVBQWFPLEVBQU0sRUFBRSxFQUFJLE9BQ3BELFFBQVNDLElBQVksT0FBWVIsRUFBYVEsRUFBUyxFQUFFLEVBQUksT0FDN0QsVUFBV00sSUFBYyxPQUFZZCxFQUFhYyxFQUFXLEVBQUUsRUFBSSxPQUNuRSxPQUFRRSxJQUFXLE9BQVlsQixFQUFVa0IsRUFBUSxDQUFDLEVBQUUsWUFBWSxFQUFJLE9BQ3BFLFNBQVVELElBQWEsT0FBWWYsRUFBYWUsRUFBVSxFQUFFLEVBQUksT0FDaEUsU0FBVSxLQUFLLElBQUksRUFDbkIsS0FBTUUsSUFBUyxPQUFZakIsRUFBYWlCLEVBQU0sRUFBRSxFQUFJLE9BQ3BELE1BQU9MLElBQVUsT0FBWVosRUFBYVksRUFBTyxDQUFDLEVBQUksT0FDdEQsUUFBU0gsSUFBWSxPQUFZVCxFQUFhUyxFQUFTLEVBQUUsRUFBSSxPQUM3RCxRQUFTQyxJQUFZLE9BQVlWLEVBQWFVLEVBQVMsRUFBRSxFQUFJLE9BQzdELFNBQVVHLElBQWEsT0FBWWIsRUFBYWEsRUFBVSxFQUFFLEVBQUksT0FDaEUsT0FBUUssSUFBVyxPQUFZbkIsRUFBUW1CLENBQU0sRUFBSSxPQUNqRCxJQUFLUCxJQUFRLE9BQVlYLEVBQWFXLEVBQUssRUFBRSxFQUFJLE1BQ25ELEVBRU1VLEVBQW1CcEIsaUJBQW1CSSxFQUFRLElBQUk7QUFBQSxhQUM3Q0EsQ0FBTztBQUFBLGFBQ1BjLENBQU07QUFBQSw0QkFFakIsT0FBT2pCLEVBQU1JLENBQVksRUFBRSxNQUFNZSxDQUFNLEVBQUUsS0FBTUMsR0FBV0EsRUFBTyxLQUFLLENBQUMsQ0FDekUiLAogICJuYW1lcyI6IFsiY3JlYXRlSGFzaCIsICJwYXJzZUNoYXIiLCAicGFyc2VJZCIsICJwYXJzZVZhckNoYXIiLCAiYXFsIiwgInVzZURiIiwgImFkZFByb2ZpbGUiLCAiY29udGV4dCIsICJwcm9maWxlIiwgImRhdGFiYXNlTmFtZSIsICJjaXR5IiwgImNvdW50cnkiLCAic3RyZWV0MSIsICJzdHJlZXQyIiwgInppcCIsICJzdGF0ZSIsICJ0aW1lem9uZSIsICJmaXJzdE5hbWUiLCAibGFzdE5hbWUiLCAiZ2VuZGVyIiwgIm5hbWUiLCAidXNlcklkIiwgInVwZGF0ZSIsICJpbnNlcnQiLCAiYXFsUXJ5IiwgImN1cnNvciIsICJ1cGRhdGVQcm9maWxlIl0KfQo=
|
package/lib/actions/reactions.js
CHANGED
|
@@ -1,322 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
-
var __export = (target, all) => {
|
|
6
|
-
for (var name in all)
|
|
7
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
-
};
|
|
9
|
-
var __copyProps = (to, from, except, desc) => {
|
|
10
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
-
for (let key of __getOwnPropNames(from))
|
|
12
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
-
}
|
|
15
|
-
return to;
|
|
16
|
-
};
|
|
17
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
-
var reactions_exports = {};
|
|
19
|
-
__export(reactions_exports, {
|
|
20
|
-
addReaction: () => addReaction,
|
|
21
|
-
deleteReaction: () => deleteReaction,
|
|
22
|
-
deleteReactionByItem: () => deleteReactionByItem,
|
|
23
|
-
getGroupUsersByReaction: () => getGroupUsersByReaction,
|
|
24
|
-
getItemsByReaction: () => getItemsByReaction,
|
|
25
|
-
getReactionCount: () => getReactionCount,
|
|
26
|
-
getReactionCountByUser: () => getReactionCountByUser,
|
|
27
|
-
getReactionsByItem: () => getReactionsByItem,
|
|
28
|
-
hasReaction: () => hasReaction,
|
|
29
|
-
parseReactionOptions: () => parseReactionOptions,
|
|
30
|
-
updateReaction: () => updateReaction
|
|
31
|
-
});
|
|
32
|
-
module.exports = __toCommonJS(reactions_exports);
|
|
33
|
-
var import_utils = require("@nlabs/utils");
|
|
34
|
-
var import_arangojs = require("arangojs");
|
|
35
|
-
var import_analyticsUtils = require("../utils/analyticsUtils");
|
|
36
|
-
var import_error = require("../types/error");
|
|
37
|
-
var import_arangodbUtils = require("../utils/arangodbUtils");
|
|
38
|
-
const eventCategory = "reactions";
|
|
39
|
-
const parseReactionOptions = (options = {}) => {
|
|
40
|
-
const {
|
|
41
|
-
from = 0,
|
|
42
|
-
to = 30
|
|
43
|
-
} = options;
|
|
44
|
-
return {
|
|
45
|
-
limit: (0, import_arangodbUtils.getLimit)(from, to)
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
const addReaction = (context, itemId, reaction = {}, allowDuplicate = false) => {
|
|
49
|
-
const action = "addReaction";
|
|
50
|
-
const { database, session: { userId: sessionId } } = context;
|
|
51
|
-
if (!sessionId) {
|
|
52
|
-
return (0, import_analyticsUtils.logException)({
|
|
53
|
-
action,
|
|
54
|
-
category: eventCategory,
|
|
55
|
-
label: "unauthorized",
|
|
56
|
-
value: "invalid_session"
|
|
57
|
-
}, context).then(() => null);
|
|
58
|
-
}
|
|
59
|
-
const {
|
|
60
|
-
name: itemName = "like",
|
|
61
|
-
value: itemValue
|
|
62
|
-
} = reaction;
|
|
63
|
-
const formatItemId = (0, import_utils.parseArangoId)(itemId);
|
|
64
|
-
const formatReactionName = (0, import_utils.parseChar)(itemName, 32);
|
|
65
|
-
const formatValue = (0, import_utils.parseString)(itemValue, 32);
|
|
66
|
-
const edgeCollection = database.collection("hasReaction");
|
|
67
|
-
const sessionDocId = `users/${sessionId}`;
|
|
68
|
-
const edgeId = (0, import_utils.createHash)(`reaction-${formatItemId}-${sessionId}`);
|
|
69
|
-
const edge = {
|
|
70
|
-
_from: sessionDocId,
|
|
71
|
-
_key: edgeId,
|
|
72
|
-
_to: formatItemId,
|
|
73
|
-
added: Date.now(),
|
|
74
|
-
name: formatReactionName,
|
|
75
|
-
value: itemValue !== void 0 ? formatValue : void 0
|
|
76
|
-
};
|
|
77
|
-
if (!allowDuplicate) {
|
|
78
|
-
const aqlQry = import_arangojs.aql`FOR r IN hasReaction
|
|
79
|
-
FILTER r._from == ${sessionDocId} && r._to == ${formatItemId} && r.name == ${formatReactionName}
|
|
1
|
+
import{createHash as $,parseArangoId as p,parseChar as h,parseId as U,parseNum as B,parseString as b}from"@nlabs/utils";import{aql as T}from"arangojs";import{ErrorTypes as E}from"../types/error.types";import{logError as N,logException as O}from"../utils/analyticsUtils";import{getLimit as q,useDb as g}from"../utils/arangodbUtils";const m="reactions",_=(e={})=>{const{from:o=0,to:n=30}=e;return{limit:q(o,n)}},x=(e,o,n={},a=!1)=>{const r="addReaction",{databaseName:s,session:{userId:i}}=e;if(!i)return O({action:r,category:m,label:"unauthorized",value:"invalid_session"},e).then(()=>null);const{name:l="like",value:t}=n,u=p(o),c=h(l,32),d=b(t,32),R=g(s).collection("hasReaction"),I=`users/${i}`,A=$(`reaction-${u}-${i}`),y={_from:I,_key:A,_to:u,added:Date.now(),name:c,value:t!==void 0?d:void 0};if(!a){const D=T`FOR r IN hasReaction
|
|
2
|
+
FILTER r._from == ${I} && r._to == ${u} && r.name == ${c}
|
|
80
3
|
LIMIT 1
|
|
81
|
-
RETURN r`;
|
|
82
|
-
|
|
83
|
-
if (!!reaction2) {
|
|
84
|
-
return reaction2;
|
|
85
|
-
}
|
|
86
|
-
return edgeCollection.save(edge, { returnNew: true }).then(() => edge);
|
|
87
|
-
}).catch((error) => {
|
|
88
|
-
console.log("addReaction::error", error);
|
|
89
|
-
return (0, import_analyticsUtils.logError)({
|
|
90
|
-
action,
|
|
91
|
-
category: eventCategory,
|
|
92
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
93
|
-
}, error, context).then(() => null);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
return edgeCollection.save(edge, { returnNew: true }).then(() => edge);
|
|
97
|
-
};
|
|
98
|
-
const deleteReaction = (context, reactionId) => {
|
|
99
|
-
const action = "deleteReaction";
|
|
100
|
-
const { database, session: { userId: sessionId } } = context;
|
|
101
|
-
if (!sessionId) {
|
|
102
|
-
return (0, import_analyticsUtils.logException)({
|
|
103
|
-
action,
|
|
104
|
-
category: eventCategory,
|
|
105
|
-
label: "unauthorized",
|
|
106
|
-
value: "invalid_session"
|
|
107
|
-
}, context).then(() => null);
|
|
108
|
-
}
|
|
109
|
-
const formatSessionId = `users/${(0, import_utils.parseId)(sessionId)}`;
|
|
110
|
-
const formatReactionId = `hasReaction/${(0, import_utils.parseId)(reactionId)}`;
|
|
111
|
-
const aqlQry = import_arangojs.aql`LET r = DOCUMENT(${formatReactionId})
|
|
112
|
-
FILTER r._from == ${formatSessionId}
|
|
4
|
+
RETURN r`;return g(s).query(D).then(f=>f.next()).then(f=>f||R.save(y,{returnNew:!0}).then(()=>y)).catch(f=>N({action:r,category:m,label:E.DATABASE_ERROR},f,e).then(()=>null))}return R.save(y,{returnNew:!0}).then(()=>y)},S=(e,o)=>{const n="deleteReaction",{databaseName:a,session:{userId:r}}=e;if(!r)return O({action:n,category:m,label:"unauthorized",value:"invalid_session"},e).then(()=>null);const s=`users/${U(r)}`,i=`hasReaction/${U(o)}`,l=T`LET r = DOCUMENT(${i})
|
|
5
|
+
FILTER r._from == ${s}
|
|
113
6
|
LIMIT 1
|
|
114
7
|
REMOVE r IN hasReaction
|
|
115
|
-
RETURN OLD`;
|
|
116
|
-
|
|
117
|
-
action,
|
|
118
|
-
category: eventCategory,
|
|
119
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
120
|
-
}, error, context).then(() => null));
|
|
121
|
-
};
|
|
122
|
-
const deleteReactionByItem = (context, itemId, reactionName) => {
|
|
123
|
-
const action = "deleteReactionByItem";
|
|
124
|
-
const { database, session: { userId: sessionId } } = context;
|
|
125
|
-
if (!sessionId) {
|
|
126
|
-
return (0, import_analyticsUtils.logException)({
|
|
127
|
-
action,
|
|
128
|
-
category: eventCategory,
|
|
129
|
-
label: "unauthorized",
|
|
130
|
-
value: "invalid_session"
|
|
131
|
-
}, context).then(() => null);
|
|
132
|
-
}
|
|
133
|
-
const formatSessionId = `users/${(0, import_utils.parseId)(sessionId)}`;
|
|
134
|
-
const formatItemDocId = (0, import_utils.parseArangoId)(itemId);
|
|
135
|
-
const formatReactionName = (0, import_utils.parseChar)(reactionName);
|
|
136
|
-
const aqlQry = import_arangojs.aql`FOR r in hasReaction
|
|
137
|
-
FILTER r._from == ${formatSessionId} && r._to == ${formatItemDocId} && r.name == ${formatReactionName}
|
|
8
|
+
RETURN OLD`;return g(a).query(l).then(t=>t.next()).catch(t=>N({action:n,category:m,label:E.DATABASE_ERROR},t,e).then(()=>null))},P=(e,o,n)=>{const a="deleteReactionByItem",{databaseName:r,session:{userId:s}}=e;if(!s)return O({action:a,category:m,label:"unauthorized",value:"invalid_session"},e).then(()=>null);const i=`users/${U(s)}`,l=p(o),t=h(n),u=T`FOR r in hasReaction
|
|
9
|
+
FILTER r._from == ${i} && r._to == ${l} && r.name == ${t}
|
|
138
10
|
LIMIT 1
|
|
139
11
|
REMOVE r IN hasReaction
|
|
140
|
-
RETURN OLD`;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
category: eventCategory,
|
|
144
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
145
|
-
}, error, context).then(() => null));
|
|
146
|
-
};
|
|
147
|
-
const updateReaction = (context, reaction = {}) => {
|
|
148
|
-
const action = "updateReaction";
|
|
149
|
-
const { database, session: { userId: sessionId } } = context;
|
|
150
|
-
if (!sessionId) {
|
|
151
|
-
return (0, import_analyticsUtils.logException)({
|
|
152
|
-
action,
|
|
153
|
-
category: eventCategory,
|
|
154
|
-
label: "unauthorized",
|
|
155
|
-
value: "invalid_session"
|
|
156
|
-
}, context).then(() => null);
|
|
157
|
-
}
|
|
158
|
-
const {
|
|
159
|
-
id: itemId,
|
|
160
|
-
name: itemName,
|
|
161
|
-
value: itemValue
|
|
162
|
-
} = reaction;
|
|
163
|
-
const formatId = (0, import_utils.parseArangoId)(itemId);
|
|
164
|
-
const formatName = (0, import_utils.parseChar)(itemName, 32);
|
|
165
|
-
const formatValue = (0, import_utils.parseString)(itemValue, 32);
|
|
166
|
-
const edgeId = (0, import_utils.createHash)(`reaction-${formatId}-${sessionId}`);
|
|
167
|
-
const update = {
|
|
168
|
-
name: formatName,
|
|
169
|
-
value: formatValue
|
|
170
|
-
};
|
|
171
|
-
const insert = {
|
|
172
|
-
...update,
|
|
173
|
-
_key: edgeId,
|
|
174
|
-
added: Date.now()
|
|
175
|
-
};
|
|
176
|
-
const aqlQry = import_arangojs.aql`UPSERT ${{ _id: formatId }}
|
|
177
|
-
INSERT ${insert}
|
|
178
|
-
UPDATE ${update}
|
|
12
|
+
RETURN OLD`;return g(r).query(u).then(c=>c.next()).catch(c=>N({action:a,category:m,label:E.DATABASE_ERROR},c,e).then(()=>null))},M=(e,o={})=>{const n="updateReaction",{databaseName:a,session:{userId:r}}=e;if(!r)return O({action:n,category:m,label:"unauthorized",value:"invalid_session"},e).then(()=>null);const{id:s,name:i,value:l}=o,t=p(s),u=h(i,32),c=b(l,32),d=$(`reaction-${t}-${r}`),R={name:u,value:c},I={...R,_key:d,added:Date.now()},A=T`UPSERT ${{_id:t}}
|
|
13
|
+
INSERT ${I}
|
|
14
|
+
UPDATE ${R}
|
|
179
15
|
LIMIT 1
|
|
180
|
-
RETURN NEW`;
|
|
181
|
-
|
|
182
|
-
action,
|
|
183
|
-
category: eventCategory,
|
|
184
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
185
|
-
}, error, context).then(() => null));
|
|
186
|
-
};
|
|
187
|
-
const getReactionCount = (context, itemId, reactionName) => {
|
|
188
|
-
const action = "getReactionCount";
|
|
189
|
-
const { database } = context;
|
|
190
|
-
const formatItemId = (0, import_utils.parseArangoId)(itemId);
|
|
191
|
-
const formatReactionName = (0, import_utils.parseChar)(reactionName, 32);
|
|
192
|
-
const aqlQry = import_arangojs.aql`FOR i, r IN INBOUND ${formatItemId} hasReaction
|
|
193
|
-
FILTER r.name == ${formatReactionName}
|
|
16
|
+
RETURN NEW`;return g(a).query(A).then(y=>y.next()).catch(y=>N({action:n,category:m,label:E.DATABASE_ERROR},y,e).then(()=>null))},V=(e,o,n)=>{const a="getReactionCount",{databaseName:r}=e,s=p(o),i=h(n,32),l=T`FOR i, r IN INBOUND ${s} hasReaction
|
|
17
|
+
FILTER r.name == ${i}
|
|
194
18
|
COLLECT WITH COUNT INTO count
|
|
195
|
-
RETURN count`;
|
|
196
|
-
|
|
197
|
-
action,
|
|
198
|
-
category: eventCategory,
|
|
199
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
200
|
-
}, error, context).then(() => void 0));
|
|
201
|
-
};
|
|
202
|
-
const getReactionCountByUser = (context, itemId, itemType, reactionName) => {
|
|
203
|
-
const action = "getReactionCountByUser";
|
|
204
|
-
const { database, session: { userId: sessionId } } = context;
|
|
205
|
-
const formatItemId = (0, import_utils.parseArangoId)(itemId);
|
|
206
|
-
const formatReactionName = (0, import_utils.parseChar)(reactionName, 32);
|
|
207
|
-
const sessionDocId = `users/${sessionId}`;
|
|
208
|
-
const aqlQry = import_arangojs.aql`FOR i, r IN INBOUND ${formatItemId} hasReaction
|
|
209
|
-
FILTER r.name == ${formatReactionName} && r._from == ${sessionDocId}
|
|
19
|
+
RETURN count`;return g(r).query(l).then(t=>t.next()).catch(t=>N({action:a,category:m,label:E.DATABASE_ERROR},t,e).then(()=>{}))},G=(e,o,n,a)=>{const r="getReactionCountByUser",{databaseName:s,session:{userId:i}}=e,l=p(o),t=h(a,32),u=`users/${i}`,c=T`FOR i, r IN INBOUND ${l} hasReaction
|
|
20
|
+
FILTER r.name == ${t} && r._from == ${u}
|
|
210
21
|
COLLECT reactionValue = r.value INTO reactionItems
|
|
211
|
-
RETURN MERGE(r, {count: LENGTH(reactionItems[*].r.value)})`;
|
|
212
|
-
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
213
|
-
action,
|
|
214
|
-
category: eventCategory,
|
|
215
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
216
|
-
}, error, context).then(() => []));
|
|
217
|
-
};
|
|
218
|
-
const getGroupUsersByReaction = (context, params = {}) => {
|
|
219
|
-
const action = "getGroupUsersByReaction";
|
|
220
|
-
const { database, session: { userId: sessionId } } = context;
|
|
221
|
-
if (!sessionId) {
|
|
222
|
-
return (0, import_analyticsUtils.logException)({
|
|
223
|
-
action,
|
|
224
|
-
category: eventCategory,
|
|
225
|
-
label: "unauthorized",
|
|
226
|
-
value: "invalid_session"
|
|
227
|
-
}, context).then(() => null);
|
|
228
|
-
}
|
|
229
|
-
const { filters = [], id: groupId, value } = params;
|
|
230
|
-
const reaction = (0, import_utils.parseChar)(value, 32);
|
|
231
|
-
const groupDocId = (0, import_utils.parseArangoId)(groupId);
|
|
232
|
-
const filterStr = filters.map((filter) => {
|
|
233
|
-
const { conditional, name, value: queryValue } = filter;
|
|
234
|
-
let filterCond = conditional;
|
|
235
|
-
if (conditional !== ">=" && conditional !== "<=" && conditional !== ">" && conditional !== "<") {
|
|
236
|
-
filterCond = "==";
|
|
237
|
-
}
|
|
238
|
-
switch (name) {
|
|
239
|
-
case "added":
|
|
240
|
-
return `r.added ${filterCond} ${(0, import_utils.parseNum)(queryValue)}`;
|
|
241
|
-
default:
|
|
242
|
-
return "";
|
|
243
|
-
}
|
|
244
|
-
}).concat([
|
|
245
|
-
`r.value == "${reaction}"`,
|
|
246
|
-
"u._id == r._from"
|
|
247
|
-
]).join(" && ");
|
|
248
|
-
const aqlQry = `FOR g, r IN INBOUND "${groupDocId}" hasReaction
|
|
22
|
+
RETURN MERGE(r, {count: LENGTH(reactionItems[*].r.value)})`;return g(s).query(c).then(d=>d.all()).catch(d=>N({action:r,category:m,label:E.DATABASE_ERROR},d,e).then(()=>[]))},w=(e,o={})=>{const n="getGroupUsersByReaction",{databaseName:a,session:{userId:r}}=e;if(!r)return O({action:n,category:m,label:"unauthorized",value:"invalid_session"},e).then(()=>null);const{filters:s=[],id:i,value:l}=o,t=h(l,32),u=p(i),c=s.map(R=>{const{conditional:I,name:A,value:y}=R;let D=I;switch(I!==">="&&I!=="<="&&I!==">"&&I!=="<"&&(D="=="),A){case"added":return`r.added ${D} ${B(y)}`;default:return""}}).concat([`r.value == "${t}"`,"u._id == r._from"]).join(" && "),d=`FOR g, r IN INBOUND "${u}" hasReaction
|
|
249
23
|
FOR u IN users
|
|
250
|
-
FILTER ${
|
|
251
|
-
RETURN u`;
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
category:
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const action = "getReactionsByItem";
|
|
260
|
-
const { database } = context;
|
|
261
|
-
const formatItemId = (0, import_utils.parseArangoId)(itemId);
|
|
262
|
-
const formatReactionName = (0, import_utils.parseChar)(reactionName, 32);
|
|
263
|
-
const { limit } = parseReactionOptions(options);
|
|
264
|
-
const aqlQry = `FOR i, r IN INBOUND "${formatItemId}" hasReaction
|
|
265
|
-
FILTER r.name == "${formatReactionName}"
|
|
266
|
-
${limit.aql}
|
|
267
|
-
RETURN MERGE(i, {reaction: r})`;
|
|
268
|
-
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
269
|
-
action,
|
|
270
|
-
category: eventCategory,
|
|
271
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
272
|
-
}, error, context).then(() => []));
|
|
273
|
-
};
|
|
274
|
-
const getItemsByReaction = (context, itemId, reactionName, options) => {
|
|
275
|
-
const action = "getItemsByReaction";
|
|
276
|
-
const { database } = context;
|
|
277
|
-
const formatItemId = (0, import_utils.parseArangoId)(itemId);
|
|
278
|
-
const formatReactionName = (0, import_utils.parseChar)(reactionName, 32);
|
|
279
|
-
const { limit } = parseReactionOptions(options);
|
|
280
|
-
const aqlQry = `FOR u, r IN OUTBOUND "${formatItemId}" hasReaction
|
|
281
|
-
FILTER r.name == ${formatReactionName}
|
|
282
|
-
${limit.aql}
|
|
283
|
-
RETURN MERGE(u, {reaction: r})`;
|
|
284
|
-
return database.query(aqlQry).then((cursor) => cursor.all()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
285
|
-
action,
|
|
286
|
-
category: eventCategory,
|
|
287
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
288
|
-
}, error, context).then(() => []));
|
|
289
|
-
};
|
|
290
|
-
const hasReaction = (context, itemId, reactionName, direction = "OUTBOUND") => {
|
|
291
|
-
const action = "hasReaction";
|
|
292
|
-
const { database, session: { userId: sessionId } } = context;
|
|
293
|
-
const sessionDocId = `users/${sessionId}`;
|
|
294
|
-
const formatItemId = (0, import_utils.parseArangoId)(itemId);
|
|
295
|
-
const formatDirection = direction === "OUTBOUND" ? "OUTBOUND" : "INBOUND";
|
|
296
|
-
const itemDirection = direction === "OUTBOUND" ? "r._to" : "r._from";
|
|
297
|
-
const aqlQry = `FOR i, r IN ${formatDirection} "${sessionDocId}" hasReaction
|
|
298
|
-
FILTER r.name == "${reactionName}" && ${itemDirection} == "${formatItemId}"
|
|
24
|
+
FILTER ${c}
|
|
25
|
+
RETURN u`;return g(a).query(d).then(R=>R.all()).catch(R=>N({action:n,category:m,label:E.DATABASE_ERROR},R,e).then(()=>[]))},z=(e,o,n,a)=>{const r="getReactionsByItem",{databaseName:s}=e,i=p(o),l=h(n,32),{limit:t}=_(a),u=`FOR i, r IN INBOUND "${i}" hasReaction
|
|
26
|
+
FILTER r.name == "${l}"
|
|
27
|
+
${t.aql}
|
|
28
|
+
RETURN MERGE(i, {reaction: r})`;return g(s).query(u).then(c=>c.all()).catch(c=>N({action:r,category:m,label:E.DATABASE_ERROR},c,e).then(()=>[]))},k=(e,o,n,a)=>{const r="getItemsByReaction",{databaseName:s}=e,i=p(o),l=h(n,32),{limit:t}=_(a),u=`FOR u, r IN OUTBOUND "${i}" hasReaction
|
|
29
|
+
FILTER r.name == ${l}
|
|
30
|
+
${t.aql}
|
|
31
|
+
RETURN MERGE(u, {reaction: r})`;return g(s).query(u).then(c=>c.all()).catch(c=>N({action:r,category:m,label:E.DATABASE_ERROR},c,e).then(()=>[]))},H=(e,o,n,a="OUTBOUND")=>{const r="hasReaction",{databaseName:s,session:{userId:i}}=e,l=`users/${i}`,t=p(o),d=`FOR i, r IN ${a==="OUTBOUND"?"OUTBOUND":"INBOUND"} "${l}" hasReaction
|
|
32
|
+
FILTER r.name == "${n}" && ${a==="OUTBOUND"?"r._to":"r._from"} == "${t}"
|
|
299
33
|
LIMIT 1
|
|
300
|
-
RETURN r`;
|
|
301
|
-
console.log({ aqlQry });
|
|
302
|
-
return database.query(aqlQry).then((cursor) => cursor.next()).then((reactions) => reactions ? reactions.value === "true" : false).catch((error) => (0, import_analyticsUtils.logError)({
|
|
303
|
-
action,
|
|
304
|
-
category: eventCategory,
|
|
305
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
306
|
-
}, error, context).then(() => false));
|
|
307
|
-
};
|
|
308
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
309
|
-
0 && (module.exports = {
|
|
310
|
-
addReaction,
|
|
311
|
-
deleteReaction,
|
|
312
|
-
deleteReactionByItem,
|
|
313
|
-
getGroupUsersByReaction,
|
|
314
|
-
getItemsByReaction,
|
|
315
|
-
getReactionCount,
|
|
316
|
-
getReactionCountByUser,
|
|
317
|
-
getReactionsByItem,
|
|
318
|
-
hasReaction,
|
|
319
|
-
parseReactionOptions,
|
|
320
|
-
updateReaction
|
|
321
|
-
});
|
|
322
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcmVhY3Rpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtLCBwYXJzZVN0cmluZ30gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuaW1wb3J0IHtFZGdlQ29sbGVjdGlvbn0gZnJvbSAnYXJhbmdvanMvY29sbGVjdGlvbic7XG5pbXBvcnQge0FycmF5Q3Vyc29yfSBmcm9tICdhcmFuZ29qcy9jdXJzb3InO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dCwgQXJhbmdvRGJDb2xsZWN0aW9uLCBBcmFuZ29EYkxpbWl0LCBRdWVyeUZpbHRlciwgVXNlclR5cGUsIFVzZXJSZWFjdGlvblF1ZXJ5fSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2xvZ0Vycm9yLCBsb2dFeGNlcHRpb259IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljc1V0aWxzJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3InO1xuaW1wb3J0IHtnZXRMaW1pdH0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGJVdGlscyc7XG5cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdyZWFjdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBSZWFjdGlvbkRpcmVjdGlvbiA9ICdJTkJPVU5EJyB8ICdPVVRCT1VORCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3Rpb24ge1xuICByZWFkb25seSBfZnJvbT86IHN0cmluZztcbiAgcmVhZG9ubHkgX2tleT86IHN0cmluZztcbiAgcmVhZG9ubHkgX3RvPzogc3RyaW5nO1xuICByZWFkb25seSBhZGRlZD86IG51bWJlcjtcbiAgcmVhZG9ubHkgY291bnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSB0eXBlPzogQXJhbmdvRGJDb2xsZWN0aW9uO1xuICByZWFkb25seSB2YWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGlvbk9wdGlvbnMge1xuICByZWFkb25seSBmcm9tPzogbnVtYmVyO1xuICByZWFkb25seSB0bz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUmVhY3Rpb25PcHRpb25zID0gKG9wdGlvbnM6IFJlYWN0aW9uT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmcm9tID0gMCxcbiAgICB0byA9IDMwXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSBhcyBBcmFuZ29EYkxpbWl0XG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgYWRkUmVhY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICByZWFjdGlvbjogUmVhY3Rpb24gPSB7fSxcbiAgYWxsb3dEdXBsaWNhdGU6IGJvb2xlYW4gPSBmYWxzZVxuKTogUHJvbWlzZTxSZWFjdGlvbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICd1bmF1dGhvcml6ZWQnLFxuICAgICAgdmFsdWU6ICdpbnZhbGlkX3Nlc3Npb24nXG4gICAgfSwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBuYW1lOiBpdGVtTmFtZSA9ICdsaWtlJyxcbiAgICB2YWx1ZTogaXRlbVZhbHVlXG4gIH0gPSByZWFjdGlvbjtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uTmFtZTogc3RyaW5nID0gcGFyc2VDaGFyKGl0ZW1OYW1lLCAzMik7XG4gIGNvbnN0IGZvcm1hdFZhbHVlOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhpdGVtVmFsdWUsIDMyKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gZGF0YWJhc2UuY29sbGVjdGlvbignaGFzUmVhY3Rpb24nKTtcbiAgY29uc3Qgc2Vzc2lvbkRvY0lkOiBzdHJpbmcgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGByZWFjdGlvbi0ke2Zvcm1hdEl0ZW1JZH0tJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IGVkZ2U6IFJlYWN0aW9uID0ge1xuICAgIF9mcm9tOiBzZXNzaW9uRG9jSWQsXG4gICAgX2tleTogZWRnZUlkLFxuICAgIF90bzogZm9ybWF0SXRlbUlkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIG5hbWU6IGZvcm1hdFJlYWN0aW9uTmFtZSxcbiAgICB2YWx1ZTogaXRlbVZhbHVlICE9PSB1bmRlZmluZWQgPyBmb3JtYXRWYWx1ZSA6IHVuZGVmaW5lZFxuICB9O1xuXG4gIC8vIENoZWNrIGZvciBkdXBsaWNhdGVzIGlmIG5vdCBhbGxvd2VkXG4gIGlmKCFhbGxvd0R1cGxpY2F0ZSkge1xuICAgIC8vIFF1ZXJ5XG4gICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgciBJTiBoYXNSZWFjdGlvblxuICAgICAgRklMVEVSIHIuX2Zyb20gPT0gJHtzZXNzaW9uRG9jSWR9ICYmIHIuX3RvID09ICR7Zm9ybWF0SXRlbUlkfSAmJiByLm5hbWUgPT0gJHtmb3JtYXRSZWFjdGlvbk5hbWV9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gcmA7XG5cbiAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigocmVhY3Rpb24pID0+IHtcbiAgICAgICAgaWYoISFyZWFjdGlvbikge1xuICAgICAgICAgIHJldHVybiByZWFjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGVkZ2UpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdhZGRSZWFjdGlvbjo6ZXJyb3InLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSkudGhlbigoKSA9PiBlZGdlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVSZWFjdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCByZWFjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPFJlYWN0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZVJlYWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3VuYXV0aG9yaXplZCcsXG4gICAgICB2YWx1ZTogJ2ludmFsaWRfc2Vzc2lvbidcbiAgICB9LCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0U2Vzc2lvbklkOiBzdHJpbmcgPSBgdXNlcnMvJHtwYXJzZUlkKHNlc3Npb25JZCl9YDtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25JZDogc3RyaW5nID0gYGhhc1JlYWN0aW9uLyR7cGFyc2VJZChyZWFjdGlvbklkKX1gO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgTEVUIHIgPSBET0NVTUVOVCgke2Zvcm1hdFJlYWN0aW9uSWR9KVxuICAgIEZJTFRFUiByLl9mcm9tID09ICR7Zm9ybWF0U2Vzc2lvbklkfVxuICAgIExJTUlUIDFcbiAgICBSRU1PVkUgciBJTiBoYXNSZWFjdGlvblxuICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlUmVhY3Rpb25CeUl0ZW0gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICByZWFjdGlvbk5hbWU6IHN0cmluZ1xuKTogUHJvbWlzZTxSZWFjdGlvbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVSZWFjdGlvbkJ5SXRlbSc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICd1bmF1dGhvcml6ZWQnLFxuICAgICAgdmFsdWU6ICdpbnZhbGlkX3Nlc3Npb24nXG4gICAgfSwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7cGFyc2VJZChzZXNzaW9uSWQpfWA7XG4gIGNvbnN0IGZvcm1hdEl0ZW1Eb2NJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbk5hbWU6IHN0cmluZyA9IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUpO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHIgaW4gaGFzUmVhY3Rpb25cbiAgICBGSUxURVIgci5fZnJvbSA9PSAke2Zvcm1hdFNlc3Npb25JZH0gJiYgci5fdG8gPT0gJHtmb3JtYXRJdGVtRG9jSWR9ICYmIHIubmFtZSA9PSAke2Zvcm1hdFJlYWN0aW9uTmFtZX1cbiAgICBMSU1JVCAxXG4gICAgUkVNT1ZFIHIgSU4gaGFzUmVhY3Rpb25cbiAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVJlYWN0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHJlYWN0aW9uOiBSZWFjdGlvbiA9IHt9KTogUHJvbWlzZTxSZWFjdGlvbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICd1cGRhdGVSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICd1bmF1dGhvcml6ZWQnLFxuICAgICAgdmFsdWU6ICdpbnZhbGlkX3Nlc3Npb24nXG4gICAgfSwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBpZDogaXRlbUlkLFxuICAgIG5hbWU6IGl0ZW1OYW1lLFxuICAgIHZhbHVlOiBpdGVtVmFsdWVcbiAgfSA9IHJlYWN0aW9uO1xuICBjb25zdCBmb3JtYXRJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCBmb3JtYXROYW1lOiBzdHJpbmcgPSBwYXJzZUNoYXIoaXRlbU5hbWUsIDMyKTtcbiAgY29uc3QgZm9ybWF0VmFsdWU6IHN0cmluZyA9IHBhcnNlU3RyaW5nKGl0ZW1WYWx1ZSwgMzIpO1xuICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHJlYWN0aW9uLSR7Zm9ybWF0SWR9LSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCB1cGRhdGU6IFJlYWN0aW9uID0ge1xuICAgIG5hbWU6IGZvcm1hdE5hbWUsXG4gICAgdmFsdWU6IGZvcm1hdFZhbHVlXG4gIH07XG4gIGNvbnN0IGluc2VydDogUmVhY3Rpb24gPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBhZGRlZDogRGF0ZS5ub3coKVxuICB9O1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUICR7e19pZDogZm9ybWF0SWR9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBORVdgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVhY3Rpb25Db3VudCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIHJlYWN0aW9uTmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlYWN0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFJlYWN0aW9uQ291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2V9ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uTmFtZTogYW55ID0gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGksIHIgSU4gSU5CT1VORCAke2Zvcm1hdEl0ZW1JZH0gaGFzUmVhY3Rpb25cbiAgICBGSUxURVIgci5uYW1lID09ICR7Zm9ybWF0UmVhY3Rpb25OYW1lfVxuICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgUkVUVVJOIGNvdW50YDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVhY3Rpb25Db3VudEJ5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIGl0ZW1UeXBlOiBzdHJpbmcsXG4gIHJlYWN0aW9uTmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlYWN0aW9uW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UmVhY3Rpb25Db3VudEJ5VXNlcic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25OYW1lOiBhbnkgPSBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMik7XG4gIGNvbnN0IHNlc3Npb25Eb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG5cbiAgLy8gUXVlcnlcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaSwgciBJTiBJTkJPVU5EICR7Zm9ybWF0SXRlbUlkfSBoYXNSZWFjdGlvblxuICAgICAgRklMVEVSIHIubmFtZSA9PSAke2Zvcm1hdFJlYWN0aW9uTmFtZX0gJiYgci5fZnJvbSA9PSAke3Nlc3Npb25Eb2NJZH1cbiAgICAgIENPTExFQ1QgcmVhY3Rpb25WYWx1ZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICBSRVRVUk4gTUVSR0Uociwge2NvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX0pYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3VwVXNlcnNCeVJlYWN0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBhcmFtczogVXNlclJlYWN0aW9uUXVlcnkgPSB7fSk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRHcm91cFVzZXJzQnlSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICd1bmF1dGhvcml6ZWQnLFxuICAgICAgdmFsdWU6ICdpbnZhbGlkX3Nlc3Npb24nXG4gICAgfSwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IHtmaWx0ZXJzID0gW10sIGlkOiBncm91cElkLCB2YWx1ZX06IFVzZXJSZWFjdGlvblF1ZXJ5ID0gcGFyYW1zO1xuICBjb25zdCByZWFjdGlvbiA9IHBhcnNlQ2hhcih2YWx1ZSwgMzIpO1xuICBjb25zdCBncm91cERvY0lkID0gcGFyc2VBcmFuZ29JZChncm91cElkKTtcbiAgY29uc3QgZmlsdGVyU3RyOiBzdHJpbmcgPSBmaWx0ZXJzXG4gICAgLm1hcCgoZmlsdGVyOiBRdWVyeUZpbHRlcikgPT4ge1xuICAgICAgY29uc3Qge2NvbmRpdGlvbmFsLCBuYW1lLCB2YWx1ZTogcXVlcnlWYWx1ZX06IFF1ZXJ5RmlsdGVyID0gZmlsdGVyO1xuICAgICAgbGV0IGZpbHRlckNvbmQ6IHN0cmluZyA9IGNvbmRpdGlvbmFsO1xuXG4gICAgICBpZihjb25kaXRpb25hbCAhPT0gJz49JyAmJiBjb25kaXRpb25hbCAhPT0gJzw9JyAmJiBjb25kaXRpb25hbCAhPT0gJz4nICYmIGNvbmRpdGlvbmFsICE9PSAnPCcpIHtcbiAgICAgICAgZmlsdGVyQ29uZCA9ICc9PSc7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaChuYW1lKSB7XG4gICAgICAgIGNhc2UgJ2FkZGVkJzpcbiAgICAgICAgICByZXR1cm4gYHIuYWRkZWQgJHtmaWx0ZXJDb25kfSAke3BhcnNlTnVtKHF1ZXJ5VmFsdWUpfWA7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmNvbmNhdChbXG4gICAgICBgci52YWx1ZSA9PSBcIiR7cmVhY3Rpb259XCJgLFxuICAgICAgJ3UuX2lkID09IHIuX2Zyb20nXG4gICAgXSlcbiAgICAuam9pbignICYmICcpO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBnLCByIElOIElOQk9VTkQgXCIke2dyb3VwRG9jSWR9XCIgaGFzUmVhY3Rpb25cbiAgICAgIEZPUiB1IElOIHVzZXJzXG4gICAgICBGSUxURVIgJHtmaWx0ZXJTdHJ9XG4gICAgICBSRVRVUk4gdWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWFjdGlvbnNCeUl0ZW0gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICByZWFjdGlvbk5hbWU6IHN0cmluZyxcbiAgb3B0aW9uczogUmVhY3Rpb25PcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UmVhY3Rpb25zQnlJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbk5hbWU6IHN0cmluZyA9IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUsIDMyKTtcbiAgY29uc3Qge2xpbWl0fSA9IHBhcnNlUmVhY3Rpb25PcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgaSwgciBJTiBJTkJPVU5EIFwiJHtmb3JtYXRJdGVtSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBGSUxURVIgci5uYW1lID09IFwiJHtmb3JtYXRSZWFjdGlvbk5hbWV9XCJcbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gTUVSR0UoaSwge3JlYWN0aW9uOiByfSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IFtdKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SXRlbXNCeVJlYWN0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpdGVtSWQ6IHN0cmluZyxcbiAgcmVhY3Rpb25OYW1lOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlYWN0aW9uT3B0aW9uc1xuKTogUHJvbWlzZTxSZWFjdGlvbltdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldEl0ZW1zQnlSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25OYW1lOiBzdHJpbmcgPSBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMik7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVJlYWN0aW9uT3B0aW9ucyhvcHRpb25zKTtcblxuICAvLyBRdWVyeVxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdSwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0SXRlbUlkfVwiIGhhc1JlYWN0aW9uXG4gICAgRklMVEVSIHIubmFtZSA9PSAke2Zvcm1hdFJlYWN0aW9uTmFtZX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gTUVSR0UodSwge3JlYWN0aW9uOiByfSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IFtdKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzUmVhY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICByZWFjdGlvbk5hbWU6IHN0cmluZyxcbiAgZGlyZWN0aW9uOiBSZWFjdGlvbkRpcmVjdGlvbiA9ICdPVVRCT1VORCdcbik6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdoYXNSZWFjdGlvbic7XG4gIGNvbnN0IHtkYXRhYmFzZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBzZXNzaW9uRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0RGlyZWN0aW9uID0gZGlyZWN0aW9uID09PSAnT1VUQk9VTkQnID8gJ09VVEJPVU5EJyA6ICdJTkJPVU5EJztcbiAgY29uc3QgaXRlbURpcmVjdGlvbjogc3RyaW5nID0gZGlyZWN0aW9uID09PSAnT1VUQk9VTkQnID8gJ3IuX3RvJyA6ICdyLl9mcm9tJztcblxuICAvLyBRdWVyeVxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgaSwgciBJTiAke2Zvcm1hdERpcmVjdGlvbn0gXCIke3Nlc3Npb25Eb2NJZH1cIiBoYXNSZWFjdGlvblxuICAgIEZJTFRFUiByLm5hbWUgPT0gXCIke3JlYWN0aW9uTmFtZX1cIiAmJiAke2l0ZW1EaXJlY3Rpb259ID09IFwiJHtmb3JtYXRJdGVtSWR9XCJcbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIHJgO1xuXG4gIGNvbnNvbGUubG9nKHthcWxRcnl9KTtcbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocmVhY3Rpb25zKSA9PiAocmVhY3Rpb25zID8gcmVhY3Rpb25zLnZhbHVlID09PSAndHJ1ZScgOiBmYWxzZSkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBmYWxzZSkpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSUEsbUJBQW1GO0FBQ25GLHNCQUFrQjtBQU1sQiw0QkFBcUM7QUFDckMsbUJBQXlCO0FBQ3pCLDJCQUF1QjtBQUV2QixNQUFNLGdCQUF3QjtBQXFCdkIsTUFBTSx1QkFBdUIsQ0FBQyxVQUEyQixDQUFDLE1BQU07QUFDckUsUUFBTTtBQUFBLElBQ0osT0FB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
|
|
34
|
+
RETURN r`;return g(s).query(d).then(R=>R.next()).then(R=>R?R.value==="true":!1).catch(R=>N({action:r,category:m,label:E.DATABASE_ERROR},R,e).then(()=>!1))};export{x as addReaction,S as deleteReaction,P as deleteReactionByItem,w as getGroupUsersByReaction,k as getItemsByReaction,V as getReactionCount,G as getReactionCountByUser,z as getReactionsByItem,H as hasReaction,_ as parseReactionOptions,M as updateReaction};
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcmVhY3Rpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtLCBwYXJzZVN0cmluZ30gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCB7YXFsfSBmcm9tICdhcmFuZ29qcyc7XG5pbXBvcnQge0FxbFF1ZXJ5fSBmcm9tICdhcmFuZ29qcy9hcWwnO1xuXG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dCwgQXJhbmdvRGJDb2xsZWN0aW9uLCBBcmFuZ29EYkxpbWl0LCBRdWVyeUZpbHRlciwgVXNlclR5cGUsIFVzZXJSZWFjdGlvblF1ZXJ5fSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb25zJztcblxuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3JlYWN0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIFJlYWN0aW9uRGlyZWN0aW9uID0gJ0lOQk9VTkQnIHwgJ09VVEJPVU5EJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGlvbiB7XG4gIHJlYWRvbmx5IF9mcm9tPzogc3RyaW5nO1xuICByZWFkb25seSBfa2V5Pzogc3RyaW5nO1xuICByZWFkb25seSBfdG8/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFkZGVkPzogbnVtYmVyO1xuICByZWFkb25seSBjb3VudD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiBBcmFuZ29EYkNvbGxlY3Rpb247XG4gIHJlYWRvbmx5IHZhbHVlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWN0aW9uT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGZyb20/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHRvPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZWFjdGlvbk9wdGlvbnMgPSAob3B0aW9uczogUmVhY3Rpb25PcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIHRvID0gMzBcbiAgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW1pdDogZ2V0TGltaXQoZnJvbSwgdG8pIGFzIEFyYW5nb0RiTGltaXRcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRSZWFjdGlvbiA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIHJlYWN0aW9uOiBSZWFjdGlvbiA9IHt9LFxuICBhbGxvd0R1cGxpY2F0ZTogYm9vbGVhbiA9IGZhbHNlXG4pOiBQcm9taXNlPFJlYWN0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFJlYWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICd1bmF1dGhvcml6ZWQnLFxuICAgICAgdmFsdWU6ICdpbnZhbGlkX3Nlc3Npb24nXG4gICAgfSwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBuYW1lOiBpdGVtTmFtZSA9ICdsaWtlJyxcbiAgICB2YWx1ZTogaXRlbVZhbHVlXG4gIH0gPSByZWFjdGlvbjtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uTmFtZTogc3RyaW5nID0gcGFyc2VDaGFyKGl0ZW1OYW1lLCAzMik7XG4gIGNvbnN0IGZvcm1hdFZhbHVlOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhpdGVtVmFsdWUsIDMyKTtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKCdoYXNSZWFjdGlvbicpO1xuICBjb25zdCBzZXNzaW9uRG9jSWQ6IHN0cmluZyA9IGB1c2Vycy8ke3Nlc3Npb25JZH1gO1xuICBjb25zdCBlZGdlSWQ6IHN0cmluZyA9IGNyZWF0ZUhhc2goYHJlYWN0aW9uLSR7Zm9ybWF0SXRlbUlkfS0ke3Nlc3Npb25JZH1gKTtcbiAgY29uc3QgZWRnZTogUmVhY3Rpb24gPSB7XG4gICAgX2Zyb206IHNlc3Npb25Eb2NJZCxcbiAgICBfa2V5OiBlZGdlSWQsXG4gICAgX3RvOiBmb3JtYXRJdGVtSWQsXG4gICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgbmFtZTogZm9ybWF0UmVhY3Rpb25OYW1lLFxuICAgIHZhbHVlOiBpdGVtVmFsdWUgIT09IHVuZGVmaW5lZCA/IGZvcm1hdFZhbHVlIDogdW5kZWZpbmVkXG4gIH07XG5cbiAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZXMgaWYgbm90IGFsbG93ZWRcbiAgaWYoIWFsbG93RHVwbGljYXRlKSB7XG4gICAgLy8gUXVlcnlcbiAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiByIElOIGhhc1JlYWN0aW9uXG4gICAgICBGSUxURVIgci5fZnJvbSA9PSAke3Nlc3Npb25Eb2NJZH0gJiYgci5fdG8gPT0gJHtmb3JtYXRJdGVtSWR9ICYmIHIubmFtZSA9PSAke2Zvcm1hdFJlYWN0aW9uTmFtZX1cbiAgICAgIExJTUlUIDFcbiAgICAgIFJFVFVSTiByYDtcblxuICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAudGhlbigocmVhY3Rpb24pID0+IHtcbiAgICAgICAgaWYoISFyZWFjdGlvbikge1xuICAgICAgICAgIHJldHVybiByZWFjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlZGdlQ29sbGVjdGlvbi5zYXZlKGVkZ2UsIHtyZXR1cm5OZXc6IHRydWV9KS50aGVuKCgpID0+IGVkZ2UpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdhZGRSZWFjdGlvbjo6ZXJyb3InLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSkudGhlbigoKSA9PiBlZGdlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVSZWFjdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCByZWFjdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPFJlYWN0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZVJlYWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICd1bmF1dGhvcml6ZWQnLFxuICAgICAgdmFsdWU6ICdpbnZhbGlkX3Nlc3Npb24nXG4gICAgfSwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7cGFyc2VJZChzZXNzaW9uSWQpfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uSWQ6IHN0cmluZyA9IGBoYXNSZWFjdGlvbi8ke3BhcnNlSWQocmVhY3Rpb25JZCl9YDtcblxuICAvLyBRdWVyeVxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYExFVCByID0gRE9DVU1FTlQoJHtmb3JtYXRSZWFjdGlvbklkfSlcbiAgICBGSUxURVIgci5fZnJvbSA9PSAke2Zvcm1hdFNlc3Npb25JZH1cbiAgICBMSU1JVCAxXG4gICAgUkVNT1ZFIHIgSU4gaGFzUmVhY3Rpb25cbiAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVSZWFjdGlvbkJ5SXRlbSA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIHJlYWN0aW9uTmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlYWN0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2RlbGV0ZVJlYWN0aW9uQnlJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuXG4gIGlmKCFzZXNzaW9uSWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICd1bmF1dGhvcml6ZWQnLFxuICAgICAgdmFsdWU6ICdpbnZhbGlkX3Nlc3Npb24nXG4gICAgfSwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7cGFyc2VJZChzZXNzaW9uSWQpfWA7XG4gIGNvbnN0IGZvcm1hdEl0ZW1Eb2NJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbk5hbWU6IHN0cmluZyA9IHBhcnNlQ2hhcihyZWFjdGlvbk5hbWUpO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIHIgaW4gaGFzUmVhY3Rpb25cbiAgICBGSUxURVIgci5fZnJvbSA9PSAke2Zvcm1hdFNlc3Npb25JZH0gJiYgci5fdG8gPT0gJHtmb3JtYXRJdGVtRG9jSWR9ICYmIHIubmFtZSA9PSAke2Zvcm1hdFJlYWN0aW9uTmFtZX1cbiAgICBMSU1JVCAxXG4gICAgUkVNT1ZFIHIgSU4gaGFzUmVhY3Rpb25cbiAgICBSRVRVUk4gT0xEYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVSZWFjdGlvbiA9IChjb250ZXh0OiBBcGlDb250ZXh0LCByZWFjdGlvbjogUmVhY3Rpb24gPSB7fSk6IFByb21pc2U8UmVhY3Rpb24+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAndXBkYXRlUmVhY3Rpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3VuYXV0aG9yaXplZCcsXG4gICAgICB2YWx1ZTogJ2ludmFsaWRfc2Vzc2lvbidcbiAgICB9LCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGlkOiBpdGVtSWQsXG4gICAgbmFtZTogaXRlbU5hbWUsXG4gICAgdmFsdWU6IGl0ZW1WYWx1ZVxuICB9ID0gcmVhY3Rpb247XG4gIGNvbnN0IGZvcm1hdElkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1JZCk7XG4gIGNvbnN0IGZvcm1hdE5hbWU6IHN0cmluZyA9IHBhcnNlQ2hhcihpdGVtTmFtZSwgMzIpO1xuICBjb25zdCBmb3JtYXRWYWx1ZTogc3RyaW5nID0gcGFyc2VTdHJpbmcoaXRlbVZhbHVlLCAzMik7XG4gIGNvbnN0IGVkZ2VJZDogc3RyaW5nID0gY3JlYXRlSGFzaChgcmVhY3Rpb24tJHtmb3JtYXRJZH0tJHtzZXNzaW9uSWR9YCk7XG4gIGNvbnN0IHVwZGF0ZTogUmVhY3Rpb24gPSB7XG4gICAgbmFtZTogZm9ybWF0TmFtZSxcbiAgICB2YWx1ZTogZm9ybWF0VmFsdWVcbiAgfTtcbiAgY29uc3QgaW5zZXJ0OiBSZWFjdGlvbiA9IHtcbiAgICAuLi51cGRhdGUsXG4gICAgX2tleTogZWRnZUlkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpXG4gIH07XG5cbiAgLy8gUXVlcnlcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUFNFUlQgJHt7X2lkOiBmb3JtYXRJZH19XG4gICAgSU5TRVJUICR7aW5zZXJ0fVxuICAgIFVQREFURSAke3VwZGF0ZX1cbiAgICBMSU1JVCAxXG4gICAgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVhY3Rpb25Db3VudCA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIHJlYWN0aW9uTmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlYWN0aW9uPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFJlYWN0aW9uQ291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCBmb3JtYXRSZWFjdGlvbk5hbWUgPSBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMik7XG5cbiAgLy8gUXVlcnlcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgaSwgciBJTiBJTkJPVU5EICR7Zm9ybWF0SXRlbUlkfSBoYXNSZWFjdGlvblxuICAgIEZJTFRFUiByLm5hbWUgPT0gJHtmb3JtYXRSZWFjdGlvbk5hbWV9XG4gICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICBSRVRVUk4gY291bnRgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVhY3Rpb25Db3VudEJ5VXNlciA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgaXRlbUlkOiBzdHJpbmcsXG4gIGl0ZW1UeXBlOiBzdHJpbmcsXG4gIHJlYWN0aW9uTmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPFJlYWN0aW9uW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2dldFJlYWN0aW9uQ291bnRCeVVzZXInO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZCA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25OYW1lID0gcGFyc2VDaGFyKHJlYWN0aW9uTmFtZSwgMzIpO1xuICBjb25zdCBzZXNzaW9uRG9jSWQgPSBgdXNlcnMvJHtzZXNzaW9uSWR9YDtcblxuICAvLyBRdWVyeVxuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBpLCByIElOIElOQk9VTkQgJHtmb3JtYXRJdGVtSWR9IGhhc1JlYWN0aW9uXG4gICAgICBGSUxURVIgci5uYW1lID09ICR7Zm9ybWF0UmVhY3Rpb25OYW1lfSAmJiByLl9mcm9tID09ICR7c2Vzc2lvbkRvY0lkfVxuICAgICAgQ09MTEVDVCByZWFjdGlvblZhbHVlID0gci52YWx1ZSBJTlRPIHJlYWN0aW9uSXRlbXNcbiAgICAgIFJFVFVSTiBNRVJHRShyLCB7Y291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdyb3VwVXNlcnNCeVJlYWN0aW9uID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBhcmFtczogVXNlclJlYWN0aW9uUXVlcnkgPSB7fSk6IFByb21pc2U8VXNlclR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb24gPSAnZ2V0R3JvdXBVc2Vyc0J5UmVhY3Rpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG5cbiAgaWYoIXNlc3Npb25JZCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogJ3VuYXV0aG9yaXplZCcsXG4gICAgICB2YWx1ZTogJ2ludmFsaWRfc2Vzc2lvbidcbiAgICB9LCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpO1xuICB9XG5cbiAgY29uc3Qge2ZpbHRlcnMgPSBbXSwgaWQ6IGdyb3VwSWQsIHZhbHVlfTogVXNlclJlYWN0aW9uUXVlcnkgPSBwYXJhbXM7XG4gIGNvbnN0IHJlYWN0aW9uID0gcGFyc2VDaGFyKHZhbHVlLCAzMik7XG4gIGNvbnN0IGdyb3VwRG9jSWQgPSBwYXJzZUFyYW5nb0lkKGdyb3VwSWQpO1xuICBjb25zdCBmaWx0ZXJTdHI6IHN0cmluZyA9IGZpbHRlcnNcbiAgICAubWFwKChmaWx0ZXI6IFF1ZXJ5RmlsdGVyKSA9PiB7XG4gICAgICBjb25zdCB7Y29uZGl0aW9uYWwsIG5hbWUsIHZhbHVlOiBxdWVyeVZhbHVlfTogUXVlcnlGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICBsZXQgZmlsdGVyQ29uZDogc3RyaW5nID0gY29uZGl0aW9uYWw7XG5cbiAgICAgIGlmKGNvbmRpdGlvbmFsICE9PSAnPj0nICYmIGNvbmRpdGlvbmFsICE9PSAnPD0nICYmIGNvbmRpdGlvbmFsICE9PSAnPicgJiYgY29uZGl0aW9uYWwgIT09ICc8Jykge1xuICAgICAgICBmaWx0ZXJDb25kID0gJz09JztcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKG5hbWUpIHtcbiAgICAgICAgY2FzZSAnYWRkZWQnOlxuICAgICAgICAgIHJldHVybiBgci5hZGRlZCAke2ZpbHRlckNvbmR9ICR7cGFyc2VOdW0ocXVlcnlWYWx1ZSl9YDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgfSlcbiAgICAuY29uY2F0KFtcbiAgICAgIGByLnZhbHVlID09IFwiJHtyZWFjdGlvbn1cImAsXG4gICAgICAndS5faWQgPT0gci5fZnJvbSdcbiAgICBdKVxuICAgIC5qb2luKCcgJiYgJyk7XG5cbiAgLy8gUXVlcnlcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIGcsIHIgSU4gSU5CT1VORCBcIiR7Z3JvdXBEb2NJZH1cIiBoYXNSZWFjdGlvblxuICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgIEZJTFRFUiAke2ZpbHRlclN0cn1cbiAgICAgIFJFVFVSTiB1YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWFjdGlvbnNCeUl0ZW0gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICByZWFjdGlvbk5hbWU6IHN0cmluZyxcbiAgb3B0aW9uczogUmVhY3Rpb25PcHRpb25zXG4pOiBQcm9taXNlPFVzZXJUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UmVhY3Rpb25zQnlJdGVtJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25OYW1lOiBzdHJpbmcgPSBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMik7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVJlYWN0aW9uT3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIGksIHIgSU4gSU5CT1VORCBcIiR7Zm9ybWF0SXRlbUlkfVwiIGhhc1JlYWN0aW9uXG4gICAgRklMVEVSIHIubmFtZSA9PSBcIiR7Zm9ybWF0UmVhY3Rpb25OYW1lfVwiXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIE1FUkdFKGksIHtyZWFjdGlvbjogcn0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gW10pKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJdGVtc0J5UmVhY3Rpb24gPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIGl0ZW1JZDogc3RyaW5nLFxuICByZWFjdGlvbk5hbWU6IHN0cmluZyxcbiAgb3B0aW9uczogUmVhY3Rpb25PcHRpb25zXG4pOiBQcm9taXNlPFJlYWN0aW9uW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0SXRlbXNCeVJlYWN0aW9uJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbUlkKTtcbiAgY29uc3QgZm9ybWF0UmVhY3Rpb25OYW1lOiBzdHJpbmcgPSBwYXJzZUNoYXIocmVhY3Rpb25OYW1lLCAzMik7XG4gIGNvbnN0IHtsaW1pdH0gPSBwYXJzZVJlYWN0aW9uT3B0aW9ucyhvcHRpb25zKTtcblxuICAvLyBRdWVyeVxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgdSwgciBJTiBPVVRCT1VORCBcIiR7Zm9ybWF0SXRlbUlkfVwiIGhhc1JlYWN0aW9uXG4gICAgRklMVEVSIHIubmFtZSA9PSAke2Zvcm1hdFJlYWN0aW9uTmFtZX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBSRVRVUk4gTUVSR0UodSwge3JlYWN0aW9uOiByfSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBbXSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhc1JlYWN0aW9uID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBpdGVtSWQ6IHN0cmluZyxcbiAgcmVhY3Rpb25OYW1lOiBzdHJpbmcsXG4gIGRpcmVjdGlvbjogUmVhY3Rpb25EaXJlY3Rpb24gPSAnT1VUQk9VTkQnXG4pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnaGFzUmVhY3Rpb24nO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHNlc3Npb25Eb2NJZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdEl0ZW1JZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChpdGVtSWQpO1xuICBjb25zdCBmb3JtYXREaXJlY3Rpb24gPSBkaXJlY3Rpb24gPT09ICdPVVRCT1VORCcgPyAnT1VUQk9VTkQnIDogJ0lOQk9VTkQnO1xuICBjb25zdCBpdGVtRGlyZWN0aW9uOiBzdHJpbmcgPSBkaXJlY3Rpb24gPT09ICdPVVRCT1VORCcgPyAnci5fdG8nIDogJ3IuX2Zyb20nO1xuXG4gIC8vIFF1ZXJ5XG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBpLCByIElOICR7Zm9ybWF0RGlyZWN0aW9ufSBcIiR7c2Vzc2lvbkRvY0lkfVwiIGhhc1JlYWN0aW9uXG4gICAgRklMVEVSIHIubmFtZSA9PSBcIiR7cmVhY3Rpb25OYW1lfVwiICYmICR7aXRlbURpcmVjdGlvbn0gPT0gXCIke2Zvcm1hdEl0ZW1JZH1cIlxuICAgIExJTUlUIDFcbiAgICBSRVRVUk4gcmA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHJlYWN0aW9ucykgPT4gKHJlYWN0aW9ucyA/IHJlYWN0aW9ucy52YWx1ZSA9PT0gJ3RydWUnIDogZmFsc2UpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gZmFsc2UpKTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUFRLGNBQUFBLEVBQVksaUJBQUFDLEVBQWUsYUFBQUMsRUFBVyxXQUFBQyxFQUFTLFlBQUFDLEVBQVUsZUFBQUMsTUFBa0IsZUFDbkYsT0FBUSxPQUFBQyxNQUFVLFdBR2xCLE9BQVEsY0FBQUMsTUFBaUIsdUJBQ3pCLE9BQVEsWUFBQUMsRUFBVSxnQkFBQUMsTUFBbUIsMEJBQ3JDLE9BQVEsWUFBQUMsRUFBVSxTQUFBQyxNQUFZLHlCQUs5QixNQUFNQyxFQUF3QixZQXFCakJDLEVBQXVCLENBQUNDLEVBQTJCLENBQUMsSUFBTSxDQUNyRSxLQUFNLENBQ0osS0FBQUMsRUFBTyxFQUNQLEdBQUFDLEVBQUssRUFDUCxFQUFJ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QU9sQixDQUFPLEVBQUUsS0FBSyxJQUFNLEVBQUssQ0FBQyxDQUN4QyIsCiAgIm5hbWVzIjogWyJjcmVhdGVIYXNoIiwgInBhcnNlQXJhbmdvSWQiLCAicGFyc2VDaGFyIiwgInBhcnNlSWQiLCAicGFyc2VOdW0iLCAicGFyc2VTdHJpbmciLCAiYXFsIiwgIkVycm9yVHlwZXMiLCAibG9nRXJyb3IiLCAibG9nRXhjZXB0aW9uIiwgImdldExpbWl0IiwgInVzZURiIiwgImV2ZW50Q2F0ZWdvcnkiLCAicGFyc2VSZWFjdGlvbk9wdGlvbnMiLCAib3B0aW9ucyIsICJmcm9tIiwgInRvIiwgImFkZFJlYWN0aW9uIiwgImNvbnRleHQiLCAiaXRlbUlkIiwgInJlYWN0aW9uIiwgImFsbG93RHVwbGljYXRlIiwgImFjdGlvbiIsICJkYXRhYmFzZU5hbWUiLCAic2Vzc2lvbklkIiwgIml0ZW1OYW1lIiwgIml0ZW1WYWx1ZSIsICJmb3JtYXRJdGVtSWQiLCAiZm9ybWF0UmVhY3Rpb25OYW1lIiwgImZvcm1hdFZhbHVlIiwgImVkZ2VDb2xsZWN0aW9uIiwgInNlc3Npb25Eb2NJZCIsICJlZGdlSWQiLCAiZWRnZSIsICJhcWxRcnkiLCAiY3Vyc29yIiwgImVycm9yIiwgImRlbGV0ZVJlYWN0aW9uIiwgInJlYWN0aW9uSWQiLCAiZm9ybWF0U2Vzc2lvbklkIiwgImZvcm1hdFJlYWN0aW9uSWQiLCAiZGVsZXRlUmVhY3Rpb25CeUl0ZW0iLCAicmVhY3Rpb25OYW1lIiwgImZvcm1hdEl0ZW1Eb2NJZCIsICJ1cGRhdGVSZWFjdGlvbiIsICJmb3JtYXRJZCIsICJmb3JtYXROYW1lIiwgInVwZGF0ZSIsICJpbnNlcnQiLCAiZ2V0UmVhY3Rpb25Db3VudCIsICJnZXRSZWFjdGlvbkNvdW50QnlVc2VyIiwgIml0ZW1UeXBlIiwgImdldEdyb3VwVXNlcnNCeVJlYWN0aW9uIiwgInBhcmFtcyIsICJmaWx0ZXJzIiwgImdyb3VwSWQiLCAidmFsdWUiLCAiZ3JvdXBEb2NJZCIsICJmaWx0ZXJTdHIiLCAiZmlsdGVyIiwgImNvbmRpdGlvbmFsIiwgIm5hbWUiLCAicXVlcnlWYWx1ZSIsICJmaWx0ZXJDb25kIiwgImdldFJlYWN0aW9uc0J5SXRlbSIsICJsaW1pdCIsICJnZXRJdGVtc0J5UmVhY3Rpb24iLCAiaGFzUmVhY3Rpb24iLCAiZGlyZWN0aW9uIiwgInJlYWN0aW9ucyJdCn0K
|