@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
package/lib/actions/posts.js
CHANGED
|
@@ -1,346 +1,112 @@
|
|
|
1
|
-
|
|
2
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
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 posts_exports = {};
|
|
19
|
-
__export(posts_exports, {
|
|
20
|
-
addPost: () => addPost,
|
|
21
|
-
createPostEdge: () => createPostEdge,
|
|
22
|
-
deletePost: () => deletePost,
|
|
23
|
-
getPost: () => getPost,
|
|
24
|
-
getPostComments: () => getPostComments,
|
|
25
|
-
getPostOptional: () => getPostOptional,
|
|
26
|
-
getPostsByArea: () => getPostsByArea,
|
|
27
|
-
getPostsByLatest: () => getPostsByLatest,
|
|
28
|
-
getPostsByReactions: () => getPostsByReactions,
|
|
29
|
-
getPostsByTags: () => getPostsByTags,
|
|
30
|
-
getPostsByUser: () => getPostsByUser,
|
|
31
|
-
parsePostOptions: () => parsePostOptions,
|
|
32
|
-
updatePost: () => updatePost
|
|
33
|
-
});
|
|
34
|
-
module.exports = __toCommonJS(posts_exports);
|
|
35
|
-
var import_arangojs = require("arangojs");
|
|
36
|
-
var import_utils = require("@nlabs/utils");
|
|
37
|
-
var import_postAdapter = require("../adapters/postAdapter");
|
|
38
|
-
var import_error = require("../types/error");
|
|
39
|
-
var import_analyticsUtils = require("../utils/analyticsUtils");
|
|
40
|
-
var import_arangodbUtils = require("../utils/arangodbUtils");
|
|
41
|
-
var import_tags = require("./tags");
|
|
42
|
-
const MAX_CONTENT_LENGTH = 1e5;
|
|
43
|
-
const eventCategory = "posts";
|
|
44
|
-
const parsePostOptions = (options = {}) => {
|
|
45
|
-
const {
|
|
46
|
-
from = 0,
|
|
47
|
-
latitude = 0,
|
|
48
|
-
longitude = 0,
|
|
49
|
-
to = 30,
|
|
50
|
-
type = "post"
|
|
51
|
-
} = options;
|
|
52
|
-
return {
|
|
53
|
-
latitude: (0, import_utils.parseNum)(latitude, 32),
|
|
54
|
-
limit: (0, import_arangodbUtils.getLimit)(from, to),
|
|
55
|
-
longitude: (0, import_utils.parseNum)(longitude, 32),
|
|
56
|
-
type: (0, import_utils.parseChar)(type, 32)
|
|
57
|
-
};
|
|
58
|
-
};
|
|
59
|
-
const getPostOptional = (fields, sessionId) => (fields || []).reduce((selects, field) => {
|
|
60
|
-
switch (field) {
|
|
61
|
-
case "hasRsvp": {
|
|
62
|
-
selects.queries.push(`LET hasRsvp = TO_BOOL(FIRST(
|
|
1
|
+
import{createHash as B,parseArangoId as S,parseChar as _,parseId as D,parseNum as L,parseString as q,parseVarChar as k}from"@nlabs/utils";import{aql as A}from"arangojs";import{extractTags as w,getTagsByName as U,updateTagsInItem as j}from"./tags";import{parsePost as H}from"../adapters/postAdapter";import{ErrorTypes as N}from"../types/error.types";import{logError as f,logException as Q}from"../utils/analyticsUtils";import{getLimit as V,useDb as y}from"../utils/arangodbUtils";const W=1e5,O="posts",$=(e={})=>{const{from:r=0,latitude:t=0,longitude:o=0,to:i=30,type:n="post"}=e;return{latitude:L(t,32),limit:V(r,i),longitude:L(o,32),type:_(n,32)}},C=(e,r)=>(e||[]).reduce((t,o)=>{switch(o){case"hasRsvp":return t.queries.push(`LET hasRsvp = TO_BOOL(FIRST(
|
|
63
2
|
FOR post, r IN INBOUND p._id hasReaction
|
|
64
|
-
FILTER r.name == "rsvp" && r.type == "posts" && r._from == "users/${
|
|
3
|
+
FILTER r.name == "rsvp" && r.type == "posts" && r._from == "users/${r}"
|
|
65
4
|
COLLECT WITH COUNT INTO count
|
|
66
5
|
RETURN count
|
|
67
|
-
))`);
|
|
68
|
-
selects.objects.push("hasRsvp:hasRsvp");
|
|
69
|
-
return selects;
|
|
70
|
-
}
|
|
71
|
-
case "isSaved": {
|
|
72
|
-
selects.queries.push(`LET isSaved = TO_BOOL(FIRST(
|
|
6
|
+
))`),t.objects.push("hasRsvp:hasRsvp"),t;case"isSaved":return t.queries.push(`LET isSaved = TO_BOOL(FIRST(
|
|
73
7
|
FOR post, r IN INBOUND p._id hasReaction
|
|
74
|
-
FILTER r.name == "pin" && r.type == "posts" && r._from == "users/${
|
|
8
|
+
FILTER r.name == "pin" && r.type == "posts" && r._from == "users/${r}"
|
|
75
9
|
COLLECT WITH COUNT INTO count
|
|
76
10
|
RETURN count
|
|
77
|
-
))`);
|
|
78
|
-
selects.objects.push("isSaved:isSaved");
|
|
79
|
-
return selects;
|
|
80
|
-
}
|
|
81
|
-
case "reactions": {
|
|
82
|
-
selects.queries.push(`LET reactions = (
|
|
11
|
+
))`),t.objects.push("isSaved:isSaved"),t;case"reactions":return t.queries.push(`LET reactions = (
|
|
83
12
|
FOR post, r IN INBOUND p._id hasReaction
|
|
84
13
|
COLLECT reactionName = r.value INTO reactionItems
|
|
85
14
|
RETURN {name: reactionName, count: LENGTH(reactionItems[*].r.value)}
|
|
86
|
-
)`);
|
|
87
|
-
selects.objects.push("reactions:reactions");
|
|
88
|
-
return selects;
|
|
89
|
-
}
|
|
90
|
-
case "rsvpCount": {
|
|
91
|
-
selects.queries.push(`LET rsvpCount = FIRST(
|
|
15
|
+
)`),t.objects.push("reactions:reactions"),t;case"rsvpCount":return t.queries.push(`LET rsvpCount = FIRST(
|
|
92
16
|
FOR post, r IN INBOUND p._id hasReaction
|
|
93
17
|
FILTER r.name == "rsvp" && r.type == "posts"
|
|
94
18
|
COLLECT WITH COUNT INTO count
|
|
95
19
|
RETURN count
|
|
96
|
-
)`);
|
|
97
|
-
selects.objects.push("rsvpCount:rsvpCount");
|
|
98
|
-
return selects;
|
|
99
|
-
}
|
|
100
|
-
case "viewCount": {
|
|
101
|
-
selects.queries.push(`LET viewCount = FIRST(
|
|
20
|
+
)`),t.objects.push("rsvpCount:rsvpCount"),t;case"viewCount":return t.queries.push(`LET viewCount = FIRST(
|
|
102
21
|
FOR post, r IN INBOUND p._id hasReaction
|
|
103
22
|
FILTER r.name == "view" && r.type == "posts"
|
|
104
23
|
COLLECT WITH COUNT INTO count
|
|
105
24
|
RETURN count
|
|
106
|
-
)`);
|
|
107
|
-
|
|
108
|
-
return selects;
|
|
109
|
-
}
|
|
110
|
-
default: {
|
|
111
|
-
return selects;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}, { objects: [], queries: [] });
|
|
115
|
-
const getPost = async (context, postId, options) => {
|
|
116
|
-
const action = "getPost";
|
|
117
|
-
const { database, fields, session: { userId: sessionId } } = context;
|
|
118
|
-
const formatItemId = (0, import_utils.parseId)(postId);
|
|
119
|
-
const { type } = parsePostOptions(options);
|
|
120
|
-
const db = database;
|
|
121
|
-
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
122
|
-
const aqlQry = import_arangojs.aql`FOR p IN posts
|
|
123
|
-
FILTER p._key == ${formatItemId} && p.type == ${type}
|
|
25
|
+
)`),t.objects.push("viewCount:viewCount"),t;default:return t}},{objects:[],queries:[]}),et=async(e,r,t)=>{const o="getPost",{databaseName:i,fields:n,session:{userId:p}}=e,R=D(r),{type:c}=$(t),s=y(i),{objects:a,queries:u}=C(n,p),d=A`FOR p IN posts
|
|
26
|
+
FILTER p._key == ${R} && p.type == ${c}
|
|
124
27
|
LIMIT 1
|
|
125
|
-
RETURN p`;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
_id: postDocId,
|
|
129
|
-
userId,
|
|
130
|
-
groupId,
|
|
131
|
-
privacy = "default"
|
|
132
|
-
} = post;
|
|
133
|
-
let privacyAqlQry;
|
|
134
|
-
if (userId === sessionId) {
|
|
135
|
-
return post;
|
|
136
|
-
}
|
|
137
|
-
if (groupId && privacy === "group") {
|
|
138
|
-
privacyAqlQry = `LET p = DOCUMENT("${postDocId}")
|
|
139
|
-
${selectQueries.join("\n")}
|
|
28
|
+
RETURN p`;return s.query(d).then(I=>I.next()).then(I=>{const{_id:E,userId:T,groupId:h,privacy:m="default"}=I;let g;return T===p?I:(h&&m==="group"?g=`LET p = DOCUMENT("${E}")
|
|
29
|
+
${u.join(`
|
|
30
|
+
`)}
|
|
140
31
|
FOR group IN groups
|
|
141
32
|
FILTER group._key == p.groupId
|
|
142
|
-
FOR u, e IN OUTBOUND group._id
|
|
143
|
-
FILTER u._key == "${
|
|
33
|
+
FOR u, e IN OUTBOUND group._id hasConnection
|
|
34
|
+
FILTER u._key == "${p}"
|
|
144
35
|
LIMIT 1
|
|
145
|
-
RETURN MERGE(p, {${
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
${selectQueries.join("\n")}
|
|
36
|
+
RETURN MERGE(p, {${a.join(", ")}})`:m==="public"&&(g=`LET p = DOCUMENT("${E}")
|
|
37
|
+
${u.join(`
|
|
38
|
+
`)}
|
|
149
39
|
LIMIT 1
|
|
150
|
-
RETURN MERGE(p, {${
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return db.query(privacyAqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
154
|
-
action,
|
|
155
|
-
category: eventCategory,
|
|
156
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
157
|
-
}, error, context));
|
|
158
|
-
}
|
|
159
|
-
return {};
|
|
160
|
-
}).catch((error) => (0, import_analyticsUtils.logError)({
|
|
161
|
-
action,
|
|
162
|
-
category: eventCategory,
|
|
163
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
164
|
-
}, error, context));
|
|
165
|
-
};
|
|
166
|
-
const getPostsByArea = (context, latitude, longitude, options) => {
|
|
167
|
-
const action = "getPostsByArea";
|
|
168
|
-
const { database, fields, session: { userId: sessionId } } = context;
|
|
169
|
-
const { limit, type } = parsePostOptions(options);
|
|
170
|
-
const formatLatitude = (0, import_utils.parseNum)(latitude);
|
|
171
|
-
const formatLongitude = (0, import_utils.parseNum)(longitude);
|
|
172
|
-
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
173
|
-
selectQueries.push(`LET distance = DISTANCE(
|
|
174
|
-
${formatLatitude},
|
|
175
|
-
${formatLongitude},
|
|
40
|
+
RETURN MERGE(p, {${a.join(", ")}})`),g?s.query(g).then(l=>l.next()).catch(l=>f({action:o,category:O,label:N.DATABASE_ERROR},l,e)):{})}).catch(I=>f({action:o,category:O,label:N.DATABASE_ERROR},I,e))},st=(e,r,t,o)=>{const i="getPostsByArea",{databaseName:n,fields:p,session:{userId:R}}=e,{limit:c,type:s}=$(o),a=L(r),u=L(t),{objects:d,queries:I}=C(p,R);I.push(`LET distance = DISTANCE(
|
|
41
|
+
${a},
|
|
42
|
+
${u},
|
|
176
43
|
NOT_NULL(p.latitude, 0),
|
|
177
44
|
NOT_NULL(p.longitude, 0))
|
|
178
|
-
`);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
${
|
|
182
|
-
|
|
183
|
-
${limit.aql}
|
|
45
|
+
`),d.push("distance:distance");const E=`FOR p IN posts
|
|
46
|
+
${I.join(`
|
|
47
|
+
`)}
|
|
48
|
+
FILTER p.type == "${s}" && p.privacy == "public" && p.parentId == null
|
|
49
|
+
${c.aql}
|
|
184
50
|
SORT distance, p.added
|
|
185
|
-
RETURN DISTINCT MERGE(p, {${
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}, error, context));
|
|
191
|
-
};
|
|
192
|
-
const getPostsByLatest = (context, options) => {
|
|
193
|
-
const { database, fields, session: { userId: sessionId } } = context;
|
|
194
|
-
const { limit, type } = parsePostOptions(options);
|
|
195
|
-
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
196
|
-
const aqlQry = `FOR p IN posts
|
|
197
|
-
FILTER p.type == "${type}" && p.privacy == "public" && p.parent == null
|
|
198
|
-
${selectQueries.join("\n")}
|
|
199
|
-
${limit.aql}
|
|
51
|
+
RETURN DISTINCT MERGE(p, {${d.join(", ")}})`;return y(n).query(E).then(T=>T.all()).catch(T=>(f({action:i,category:O,label:N.DATABASE_ERROR},T,e),[]))},ot=(e,r)=>{const{databaseName:t,fields:o,session:{userId:i}}=e,{limit:n,type:p}=$(r),{objects:R,queries:c}=C(o,i),s=`FOR p IN posts
|
|
52
|
+
FILTER p.type == "${p}" && p.privacy == "public" && p.parent == null
|
|
53
|
+
${c.join(`
|
|
54
|
+
`)}
|
|
55
|
+
${n.aql}
|
|
200
56
|
SORT p.added DESC
|
|
201
|
-
RETURN DISTINCT MERGE(p, {${
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
});
|
|
205
|
-
};
|
|
206
|
-
const getPostsByReactions = (context, reactions = [], options) => {
|
|
207
|
-
const action = "getPostsByReactions";
|
|
208
|
-
const { database, fields, session: { userId: sessionId } } = context;
|
|
209
|
-
const { latitude, limit, longitude, type } = parsePostOptions(options);
|
|
210
|
-
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
211
|
-
const formatSessionId = `users/${sessionId}`;
|
|
212
|
-
const formatReactions = JSON.stringify(reactions.map((reaction) => (0, import_utils.parseChar)(reaction, 32).toLowerCase()));
|
|
213
|
-
const sortBy = [];
|
|
214
|
-
const filters = [`p.type == "${type}"`, 'p.privacy == "public"'];
|
|
215
|
-
const formatLatitude = (0, import_utils.parseNum)(latitude);
|
|
216
|
-
const formatLongitude = (0, import_utils.parseNum)(longitude);
|
|
217
|
-
if (formatLatitude && formatLongitude) {
|
|
218
|
-
selectQueries.push(`LET distance = DISTANCE(
|
|
219
|
-
${formatLatitude},
|
|
220
|
-
${formatLongitude},
|
|
57
|
+
RETURN DISTINCT MERGE(p, {${R.join(", ")}})`;return y(t).query(s).then(a=>a.all()).catch(a=>{throw a})},rt=(e,r=[],t)=>{const o="getPostsByReactions",{databaseName:i,fields:n,session:{userId:p}}=e,{latitude:R,limit:c,longitude:s,type:a}=$(t),{objects:u,queries:d}=C(n,p),I=`users/${p}`,E=JSON.stringify(r.map(P=>_(P,32).toLowerCase())),T=[],h=[`p.type == "${a}"`,'p.privacy == "public"'],m=L(R),g=L(s);m&&g&&(d.push(`LET distance = DISTANCE(
|
|
58
|
+
${m},
|
|
59
|
+
${g},
|
|
221
60
|
NOT_NULL(p.latitude, 0),
|
|
222
61
|
NOT_NULL(p.longitude, 0))
|
|
223
|
-
`)
|
|
224
|
-
selectObjects.push("distance:distance");
|
|
225
|
-
sortBy.push("distance");
|
|
226
|
-
}
|
|
227
|
-
if (reactions.length) {
|
|
228
|
-
sortBy.push("matchedTags DESC");
|
|
229
|
-
selectQueries.push(`LET matchedReactions = LENGTH(
|
|
62
|
+
`),u.push("distance:distance"),T.push("distance")),r.length&&(T.push("matchedTags DESC"),d.push(`LET matchedReactions = LENGTH(
|
|
230
63
|
FOR mr IN reactions
|
|
231
64
|
FILTER mr.matched == true
|
|
232
65
|
RETURN mr
|
|
233
|
-
)`);
|
|
234
|
-
selectObjects.push("matchedReactions:matchedReactions");
|
|
235
|
-
filters.push("matchedReactions > 0");
|
|
236
|
-
}
|
|
237
|
-
sortBy.push("p.added DESC");
|
|
238
|
-
selectObjects.push("reactions:reactions");
|
|
239
|
-
const aqlQry = `FOR p, r IN OUTBOUND "${formatSessionId}" hasReaction
|
|
66
|
+
)`),u.push("matchedReactions:matchedReactions"),h.push("matchedReactions > 0")),T.push("p.added DESC"),u.push("reactions:reactions");const l=`FOR p, r IN OUTBOUND "${I}" hasReaction
|
|
240
67
|
LET reactions = (
|
|
241
68
|
FOR reaction, hr IN 1..1 INBOUND p isTagged
|
|
242
|
-
LET matched = LENGTH(${
|
|
69
|
+
LET matched = LENGTH(${E}) > 0 && POSITION(${E}, reaction.name)
|
|
243
70
|
SORT reaction.name
|
|
244
71
|
RETURN MERGE(reaction, {matched:matched})
|
|
245
72
|
)
|
|
246
|
-
${
|
|
247
|
-
|
|
248
|
-
${
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
254
|
-
}, error, context));
|
|
255
|
-
};
|
|
256
|
-
const getPostsByTags = (context, tags = [], options) => {
|
|
257
|
-
const action = "getPostsByTags";
|
|
258
|
-
const { database, fields, session: { userId: sessionId } } = context;
|
|
259
|
-
const { latitude, limit, longitude, type } = parsePostOptions(options);
|
|
260
|
-
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
261
|
-
const formatTagNames = JSON.stringify(tags.map((tag) => (0, import_utils.parseChar)(tag, 32).toLowerCase()));
|
|
262
|
-
const sortBy = [];
|
|
263
|
-
const filters = [`p.type == "${type}"`, 'p.privacy == "public"'];
|
|
264
|
-
const formatLatitude = (0, import_utils.parseNum)(latitude);
|
|
265
|
-
const formatLongitude = (0, import_utils.parseNum)(longitude);
|
|
266
|
-
if (formatLatitude && formatLongitude) {
|
|
267
|
-
selectQueries.push(`LET distance = DISTANCE(
|
|
268
|
-
${formatLatitude},
|
|
269
|
-
${formatLongitude},
|
|
73
|
+
${d.join(`
|
|
74
|
+
`)}
|
|
75
|
+
FILTER ${h.join(" && ")}
|
|
76
|
+
${c.aql}
|
|
77
|
+
RETURN DISTINCT MERGE(p, {${u.join(", ")}})`;return y(i).query(l).then(P=>P.all()).catch(P=>(f({action:o,category:O,label:N.DATABASE_ERROR},P,e),[]))},nt=(e,r=[],t)=>{const o="getPostsByTags",{databaseName:i,fields:n,session:{userId:p}}=e,{latitude:R,limit:c,longitude:s,type:a}=$(t),{objects:u,queries:d}=C(n,p),I=JSON.stringify(r.map(l=>_(l,32).toLowerCase())),E=[],T=[`p.type == "${a}"`,'p.privacy == "public"'],h=L(R),m=L(s);h&&m&&(d.push(`LET distance = DISTANCE(
|
|
78
|
+
${h},
|
|
79
|
+
${m},
|
|
270
80
|
NOT_NULL(p.latitude, 0),
|
|
271
81
|
NOT_NULL(p.longitude, 0))
|
|
272
|
-
`)
|
|
273
|
-
selectObjects.push("distance:distance");
|
|
274
|
-
sortBy.push("distance");
|
|
275
|
-
}
|
|
276
|
-
if (tags.length) {
|
|
277
|
-
sortBy.push("matchedTags DESC");
|
|
278
|
-
selectQueries.push(`LET matchedTags = LENGTH(
|
|
82
|
+
`),u.push("distance:distance"),E.push("distance")),r.length&&(E.push("matchedTags DESC"),d.push(`LET matchedTags = LENGTH(
|
|
279
83
|
FOR t IN tags
|
|
280
84
|
FILTER t.matched == true
|
|
281
85
|
RETURN t
|
|
282
|
-
)`);
|
|
283
|
-
selectObjects.push("matchedTags:matchedTags");
|
|
284
|
-
filters.push("matchedTags > 0");
|
|
285
|
-
}
|
|
286
|
-
sortBy.push("p.added DESC");
|
|
287
|
-
selectObjects.push("tags:tags");
|
|
288
|
-
const aqlQry = `FOR p IN posts
|
|
86
|
+
)`),u.push("matchedTags:matchedTags"),T.push("matchedTags > 0")),E.push("p.added DESC"),u.push("tags:tags");const g=`FOR p IN posts
|
|
289
87
|
LET tags = (
|
|
290
88
|
FOR tag, it IN 1..1 INBOUND p isTagged
|
|
291
|
-
LET matched = LENGTH(${
|
|
89
|
+
LET matched = LENGTH(${I}) > 0 && POSITION(${I}, tag.name)
|
|
292
90
|
SORT tag.name
|
|
293
91
|
RETURN MERGE(tag, {matched:matched})
|
|
294
92
|
)
|
|
295
|
-
${
|
|
296
|
-
|
|
297
|
-
${
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
};
|
|
306
|
-
const getPostsByUser = (context, userId, options) => {
|
|
307
|
-
const action = "getPostsByUser";
|
|
308
|
-
const { database, fields, session: { userId: sessionId } } = context;
|
|
309
|
-
const { limit, type } = parsePostOptions(options);
|
|
310
|
-
const formatUserId = (0, import_utils.parseId)(userId);
|
|
311
|
-
const { objects: selectObjects, queries: selectQueries } = getPostOptional(fields, sessionId);
|
|
312
|
-
const aqlQry = `FOR p IN posts
|
|
313
|
-
FILTER p.userId == "${formatUserId}" && p.type == "${type}" && p.privacy == "public" && p.parent == null
|
|
314
|
-
${selectQueries.join("\n")}
|
|
315
|
-
${limit.aql}
|
|
93
|
+
${d.join(`
|
|
94
|
+
`)}
|
|
95
|
+
FILTER ${T.join(" && ")}
|
|
96
|
+
${c.aql}
|
|
97
|
+
SORT ${E.join(", ")}
|
|
98
|
+
RETURN DISTINCT MERGE(p, {${u.join(", ")}})`;return y(i).query(g).then(l=>l.all()).catch(l=>(f({action:o,category:O,label:N.DATABASE_ERROR},l,e),[]))},at=(e,r,t)=>{const o="getPostsByUser",{databaseName:i,fields:n,session:{userId:p}}=e,{limit:R,type:c}=$(t),s=D(r),{objects:a,queries:u}=C(n,p),d=`FOR p IN posts
|
|
99
|
+
FILTER p.userId == "${s}" && p.type == "${c}" && p.privacy == "public" && p.parent == null
|
|
100
|
+
${u.join(`
|
|
101
|
+
`)}
|
|
102
|
+
${R.aql}
|
|
316
103
|
SORT p.added
|
|
317
|
-
RETURN DISTINCT MERGE(p, {${
|
|
318
|
-
|
|
319
|
-
action,
|
|
320
|
-
category: eventCategory,
|
|
321
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
322
|
-
}, error, context));
|
|
323
|
-
};
|
|
324
|
-
const getPostComments = (context, postId, options) => {
|
|
325
|
-
const action = "getPostComments";
|
|
326
|
-
const { database, session: { userId: sessionId } } = context;
|
|
327
|
-
const { limit, type } = parsePostOptions(options);
|
|
328
|
-
const formatItemId = (0, import_utils.parseId)(postId);
|
|
329
|
-
const aqlQry = import_arangojs.aql`FOR p IN posts
|
|
330
|
-
FILTER p.type == ${type} && p._key == ${formatItemId}
|
|
104
|
+
RETURN DISTINCT MERGE(p, {${a.join(", ")}})`;return y(i).query(d).then(I=>I.all()).catch(I=>(f({action:o,category:O,label:N.DATABASE_ERROR},I,e),[]))},it=(e,r,t)=>{const o="getPostComments",{databaseName:i,session:{userId:n}}=e,{limit:p,type:R}=$(t),c=D(r),s=A`FOR p IN posts
|
|
105
|
+
FILTER p.type == ${R} && p._key == ${c}
|
|
331
106
|
LIMIT 1
|
|
332
|
-
RETURN p`;
|
|
333
|
-
return database.query(aqlQry).then((cursor) => cursor.next()).then((post) => {
|
|
334
|
-
const {
|
|
335
|
-
_key,
|
|
336
|
-
groupId,
|
|
337
|
-
privacy = "default"
|
|
338
|
-
} = post;
|
|
339
|
-
let privacyAqlQry;
|
|
340
|
-
if (groupId && privacy === "group") {
|
|
341
|
-
privacyAqlQry = `FOR p IN posts
|
|
107
|
+
RETURN p`;return y(i).query(s).then(a=>a.next()).then(a=>{const{_key:u,groupId:d,privacy:I="default"}=a;let E;return d&&I==="group"?E=`FOR p IN posts
|
|
342
108
|
FOR user IN users
|
|
343
|
-
FILTER p.parent == "${
|
|
109
|
+
FILTER p.parent == "${u}" && user._key == p.userId
|
|
344
110
|
LET reactions = (
|
|
345
111
|
FOR post, r IN INBOUND p._id reactions
|
|
346
112
|
COLLECT reactionName = r.value INTO reactionItems
|
|
@@ -348,234 +114,30 @@ const getPostComments = (context, postId, options) => {
|
|
|
348
114
|
)
|
|
349
115
|
FOR group IN groups
|
|
350
116
|
FILTER group._key == p.groupId
|
|
351
|
-
FOR u, e IN OUTBOUND group._id
|
|
352
|
-
FILTER u._key == "${
|
|
117
|
+
FOR u, e IN OUTBOUND group._id hasConnection
|
|
118
|
+
FILTER u._key == "${n}"
|
|
353
119
|
SORT p.added
|
|
354
|
-
${
|
|
355
|
-
RETURN MERGE(p, {user: user, reactions: reactions})
|
|
356
|
-
} else if (privacy === "public") {
|
|
357
|
-
privacyAqlQry = `FOR p IN posts
|
|
120
|
+
${p.aql}
|
|
121
|
+
RETURN MERGE(p, {user: user, reactions: reactions})`:I==="public"&&(E=`FOR p IN posts
|
|
358
122
|
FOR user IN users
|
|
359
|
-
FILTER p.parent == "${
|
|
123
|
+
FILTER p.parent == "${u}" && user._key == p.userId
|
|
360
124
|
LET reactions = (
|
|
361
125
|
FOR post, r IN INBOUND p._id reactions
|
|
362
126
|
COLLECT reactionName = r.value INTO reactionItems
|
|
363
127
|
RETURN {name: reactionName, count: LENGTH(reactionItems[*].r.value)}
|
|
364
128
|
)
|
|
365
129
|
SORT p.added
|
|
366
|
-
${
|
|
367
|
-
RETURN MERGE(p, {user: user, reactions: reactions})`;
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
return [];
|
|
377
|
-
}).catch((error) => (0, import_analyticsUtils.logError)({
|
|
378
|
-
action,
|
|
379
|
-
category: eventCategory,
|
|
380
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
381
|
-
}, error, context));
|
|
382
|
-
};
|
|
383
|
-
const addPost = async (context, {
|
|
384
|
-
content = "",
|
|
385
|
-
endDate,
|
|
386
|
-
groupId = "",
|
|
387
|
-
location,
|
|
388
|
-
latitude,
|
|
389
|
-
longitude,
|
|
390
|
-
name = "",
|
|
391
|
-
parentId = null,
|
|
392
|
-
privacy = "public",
|
|
393
|
-
tags = [],
|
|
394
|
-
startDate,
|
|
395
|
-
type = "default"
|
|
396
|
-
}) => {
|
|
397
|
-
const action = "addPost";
|
|
398
|
-
const { database, session: { userId: sessionId } } = context;
|
|
399
|
-
const now = Date.now();
|
|
400
|
-
const postId = (0, import_utils.createHash)(`post-${sessionId}`);
|
|
401
|
-
const insert = {
|
|
402
|
-
_id: `posts/${postId}`,
|
|
403
|
-
_key: postId,
|
|
404
|
-
added: now,
|
|
405
|
-
content: (0, import_utils.parseString)(content, MAX_CONTENT_LENGTH),
|
|
406
|
-
endDate: endDate ? (0, import_utils.parseNum)(endDate, 13) : void 0,
|
|
407
|
-
groupId: groupId ? (0, import_utils.parseId)(groupId) : void 0,
|
|
408
|
-
latitude: latitude !== void 0 ? (0, import_utils.parseNum)(latitude) : void 0,
|
|
409
|
-
location: location ? (0, import_utils.parseString)(location, 160) : void 0,
|
|
410
|
-
longitude: longitude !== void 0 ? (0, import_utils.parseNum)(longitude) : void 0,
|
|
411
|
-
modified: now,
|
|
412
|
-
name: (0, import_utils.parseString)(name, 160),
|
|
413
|
-
parentId: parentId ? (0, import_utils.parseId)(parentId) : void 0,
|
|
414
|
-
privacy: (0, import_utils.parseVarChar)(privacy, 16),
|
|
415
|
-
startDate: startDate ? (0, import_utils.parseNum)(startDate, 13) : void 0,
|
|
416
|
-
type: (0, import_utils.parseChar)(type, 32),
|
|
417
|
-
userId: sessionId
|
|
418
|
-
};
|
|
419
|
-
const aqlQry = import_arangojs.aql`INSERT ${insert} IN posts RETURN NEW`;
|
|
420
|
-
try {
|
|
421
|
-
const savedPost = await database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
422
|
-
action,
|
|
423
|
-
category: eventCategory,
|
|
424
|
-
label: import_error.ErrorTypes.DATABASE_ERROR
|
|
425
|
-
}, error, context));
|
|
426
|
-
const { _id: postDocId } = savedPost;
|
|
427
|
-
const contentTagNames = await (0, import_tags.extractTags)(insert.content);
|
|
428
|
-
if (tags.length || contentTagNames.length) {
|
|
429
|
-
const userTags = (await (0, import_tags.getTagsByName)(context, tags.map(({ name: name2 }) => name2))).map((tag) => ({ ...tag, tagBy: sessionId }));
|
|
430
|
-
const contentTags = (await (0, import_tags.getTagsByName)(context, contentTagNames)).map((tag) => ({ ...tag, tagBy: "extract" }));
|
|
431
|
-
const updatedTags = await (0, import_tags.updateTagsInItem)(
|
|
432
|
-
context,
|
|
433
|
-
{
|
|
434
|
-
itemDocId: postDocId,
|
|
435
|
-
tags: [...contentTags, ...userTags]
|
|
436
|
-
}
|
|
437
|
-
);
|
|
438
|
-
return {
|
|
439
|
-
...savedPost,
|
|
440
|
-
tags: updatedTags
|
|
441
|
-
};
|
|
442
|
-
}
|
|
443
|
-
return savedPost;
|
|
444
|
-
} catch (error) {
|
|
445
|
-
throw error;
|
|
446
|
-
}
|
|
447
|
-
};
|
|
448
|
-
const updatePost = async (context, post) => {
|
|
449
|
-
const action = "updatePost";
|
|
450
|
-
const { database, session: { userId: sessionId } } = context;
|
|
451
|
-
const now = Date.now();
|
|
452
|
-
const parsedPost = (0, import_postAdapter.parsePost)(post);
|
|
453
|
-
const {
|
|
454
|
-
postId,
|
|
455
|
-
tags = []
|
|
456
|
-
} = parsedPost;
|
|
457
|
-
const update = {
|
|
458
|
-
...parsedPost,
|
|
459
|
-
modified: now
|
|
460
|
-
};
|
|
461
|
-
if (!postId) {
|
|
462
|
-
return (0, import_analyticsUtils.logException)({
|
|
463
|
-
action,
|
|
464
|
-
category: eventCategory,
|
|
465
|
-
value: import_error.ErrorTypes.INVALID_ID
|
|
466
|
-
}, {});
|
|
467
|
-
}
|
|
468
|
-
const insert = {
|
|
469
|
-
...update,
|
|
470
|
-
_key: postId,
|
|
471
|
-
added: now,
|
|
472
|
-
userId: sessionId
|
|
473
|
-
};
|
|
474
|
-
const aqlQry = import_arangojs.aql`UPSERT {_key: ${postId}, userId: ${sessionId}}
|
|
475
|
-
INSERT ${insert}
|
|
476
|
-
UPDATE ${update}
|
|
477
|
-
IN posts RETURN NEW`;
|
|
478
|
-
try {
|
|
479
|
-
const updatedPost = await database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => (0, import_analyticsUtils.logError)({
|
|
480
|
-
action,
|
|
481
|
-
category: eventCategory,
|
|
482
|
-
value: import_error.ErrorTypes.DATABASE_ERROR
|
|
483
|
-
}, error, {}));
|
|
484
|
-
const { _id: updatedPostId } = updatedPost;
|
|
485
|
-
const contentTagNames = await (0, import_tags.extractTags)(insert.content);
|
|
486
|
-
if (tags?.length || contentTagNames?.length) {
|
|
487
|
-
const userTags = tags?.length ? (await (0, import_tags.getTagsByName)(context, tags.map(({ name }) => name))).map((tag) => ({ ...tag, tagBy: sessionId })) : [];
|
|
488
|
-
const contentTags = contentTagNames?.length ? (await (0, import_tags.getTagsByName)(context, contentTagNames)).map((tag) => ({ ...tag, tagBy: "extract" })) : [];
|
|
489
|
-
const updatedTags = await (0, import_tags.updateTagsInItem)(
|
|
490
|
-
context,
|
|
491
|
-
{
|
|
492
|
-
itemDocId: updatedPostId,
|
|
493
|
-
tags: [...contentTags, ...userTags]
|
|
494
|
-
}
|
|
495
|
-
);
|
|
496
|
-
return {
|
|
497
|
-
...updatedPost,
|
|
498
|
-
tags: updatedTags
|
|
499
|
-
};
|
|
500
|
-
}
|
|
501
|
-
return updatedPost;
|
|
502
|
-
} catch (error) {
|
|
503
|
-
throw error;
|
|
504
|
-
}
|
|
505
|
-
};
|
|
506
|
-
const deletePost = async (context, postDocId) => {
|
|
507
|
-
const action = "deletePost";
|
|
508
|
-
const { database, session: { userId: sessionId } } = context;
|
|
509
|
-
const formatPostId = (0, import_utils.parseArangoId)(postDocId);
|
|
510
|
-
if (!formatPostId) {
|
|
511
|
-
return (0, import_analyticsUtils.logException)({
|
|
512
|
-
action,
|
|
513
|
-
category: eventCategory,
|
|
514
|
-
value: import_error.ErrorTypes.INVALID_ID
|
|
515
|
-
}, {});
|
|
516
|
-
}
|
|
517
|
-
const edgeAqlQry = import_arangojs.aql`FOR t IN isTagged
|
|
518
|
-
FILTER t._to == ${formatPostId}
|
|
519
|
-
REMOVE t IN isTagged`;
|
|
520
|
-
await database.query(edgeAqlQry).catch((error) => {
|
|
521
|
-
throw error;
|
|
522
|
-
});
|
|
523
|
-
const fileAqlQry = import_arangojs.aql`FOR f IN hasFile
|
|
524
|
-
FILTER f._to == ${formatPostId}
|
|
525
|
-
REMOVE f IN hasFile`;
|
|
526
|
-
await database.query(fileAqlQry).catch((error) => {
|
|
527
|
-
throw error;
|
|
528
|
-
});
|
|
529
|
-
const aqlQry = import_arangojs.aql`FOR p IN posts
|
|
530
|
-
FILTER p._id == ${formatPostId} && p.userId == ${sessionId}
|
|
130
|
+
${p.aql}
|
|
131
|
+
RETURN MERGE(p, {user: user, reactions: reactions})`),E?y(i).query(E).then(T=>T.all()).catch(T=>(f({action:o,category:O,label:N.DATABASE_ERROR},T,e),[])):[]}).catch(a=>(f({action:o,category:O,label:N.DATABASE_ERROR},a,e),[]))},pt=async(e,{content:r="",endDate:t,groupId:o="",location:i,latitude:n,longitude:p,name:R="",parentId:c=null,privacy:s="public",tags:a=[],startDate:u,type:d="default"})=>{const I="addPost",{databaseName:E,session:{userId:T}}=e,h=Date.now(),m=B(`post-${T}`),g={_id:`posts/${m}`,_key:m,added:h,content:q(r,W),endDate:t?L(t,13):void 0,groupId:o?D(o):void 0,latitude:n!==void 0?L(n):void 0,location:i?q(i,160):void 0,longitude:p!==void 0?L(p):void 0,modified:h,name:q(R,160),parentId:c?D(c):void 0,privacy:k(s,16),startDate:u?L(u,13):void 0,type:_(d,32),userId:T},l=A`INSERT ${g} IN posts RETURN NEW`;try{const P=await y(E).query(l).then(b=>b.next()).catch(b=>f({action:I,category:O,label:N.DATABASE_ERROR},b,e)),{_id:M}=P,v=await w(g.content);if(a.length||v.length){const b=(await U(e,a.map(({name:F})=>F))).map(F=>({...F,tagBy:T})),x=(await U(e,v)).map(F=>({...F,tagBy:"extract"})),G=await j(e,{itemDocId:M,tags:[...x,...b]});return{...P,tags:G}}return P}catch(P){throw P}},ct=async(e,r)=>{const t="updatePost",{databaseName:o,session:{userId:i}}=e,n=Date.now(),p=H(r),{postId:R,tags:c=[]}=p,s={...p,modified:n};if(!R)return Q({action:t,category:O,value:N.INVALID_ID},{});const a={...s,_key:R,added:n,userId:i},u=A`UPSERT {_key: ${R}, userId: ${i}}
|
|
132
|
+
INSERT ${a}
|
|
133
|
+
UPDATE ${s}
|
|
134
|
+
IN posts RETURN NEW`;try{const d=await y(o).query(u).then(T=>T.next()).catch(T=>f({action:t,category:O,value:N.DATABASE_ERROR},T,{})),{_id:I}=d,E=await w(a.content);if(c?.length||E?.length){const T=c?.length?(await U(e,c.map(({name:g})=>g))).map(g=>({...g,tagBy:i})):[],h=E?.length?(await U(e,E)).map(g=>({...g,tagBy:"extract"})):[],m=await j(e,{itemDocId:I,tags:[...h,...T]});return{...d,tags:m}}return d}catch(d){throw d}},ut=async(e,r)=>{const t="deletePost",{databaseName:o,session:{userId:i}}=e,n=S(r);if(!n)return Q({action:t,category:O,value:N.INVALID_ID},{});const p=A`FOR t IN isTagged
|
|
135
|
+
FILTER t._to == ${n}
|
|
136
|
+
REMOVE t IN isTagged`;await y(o).query(p).catch(s=>{throw s});const R=A`FOR f IN hasFile
|
|
137
|
+
FILTER f._to == ${n}
|
|
138
|
+
REMOVE f IN hasFile`;await y(o).query(R).catch(s=>{throw s});const c=A`FOR p IN posts
|
|
139
|
+
FILTER p._id == ${n} && p.userId == ${i}
|
|
531
140
|
LIMIT 1
|
|
532
141
|
REMOVE p IN posts
|
|
533
|
-
RETURN OLD`;
|
|
534
|
-
return database.query(aqlQry).then((cursor) => cursor.next()).catch((error) => {
|
|
535
|
-
throw error;
|
|
536
|
-
});
|
|
537
|
-
};
|
|
538
|
-
const createPostEdge = (context, postDocId, itemDocId, edgeType = "isPosted", props = {}) => {
|
|
539
|
-
const action = "createPostEdge";
|
|
540
|
-
const { database } = context;
|
|
541
|
-
const edgeCollection = database.collection(edgeType);
|
|
542
|
-
const formatPostId = (0, import_utils.parseArangoId)(postDocId);
|
|
543
|
-
const formatDocId = (0, import_utils.parseArangoId)(itemDocId);
|
|
544
|
-
if (!formatDocId || !formatPostId) {
|
|
545
|
-
return (0, import_analyticsUtils.logException)({
|
|
546
|
-
action,
|
|
547
|
-
category: eventCategory,
|
|
548
|
-
value: import_error.ErrorTypes.INVALID_ID
|
|
549
|
-
}, {});
|
|
550
|
-
}
|
|
551
|
-
const edgeId = (0, import_utils.createHash)(`postEdge-${formatPostId}-${formatDocId}`);
|
|
552
|
-
const edge = {
|
|
553
|
-
_from: formatPostId,
|
|
554
|
-
_key: edgeId,
|
|
555
|
-
_to: formatDocId,
|
|
556
|
-
added: Date.now(),
|
|
557
|
-
...props
|
|
558
|
-
};
|
|
559
|
-
return edgeCollection.save(edge, { returnNew: true }).catch((error) => (0, import_analyticsUtils.logError)({
|
|
560
|
-
action,
|
|
561
|
-
category: eventCategory,
|
|
562
|
-
value: import_error.ErrorTypes.DATABASE_ERROR
|
|
563
|
-
}, error, {}));
|
|
564
|
-
};
|
|
565
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
566
|
-
0 && (module.exports = {
|
|
567
|
-
addPost,
|
|
568
|
-
createPostEdge,
|
|
569
|
-
deletePost,
|
|
570
|
-
getPost,
|
|
571
|
-
getPostComments,
|
|
572
|
-
getPostOptional,
|
|
573
|
-
getPostsByArea,
|
|
574
|
-
getPostsByLatest,
|
|
575
|
-
getPostsByReactions,
|
|
576
|
-
getPostsByTags,
|
|
577
|
-
getPostsByUser,
|
|
578
|
-
parsePostOptions,
|
|
579
|
-
updatePost
|
|
580
|
-
});
|
|
581
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcG9zdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcbmltcG9ydCB7RWRnZUNvbGxlY3Rpb259IGZyb20gJ2FyYW5nb2pzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtBcnJheUN1cnNvcn0gZnJvbSAnYXJhbmdvanMvY3Vyc29yJztcbmltcG9ydCB7XG4gIGNyZWF0ZUhhc2gsIHBhcnNlQXJhbmdvSWQsIHBhcnNlQ2hhciwgcGFyc2VJZCwgcGFyc2VOdW0sIHBhcnNlU3RyaW5nLCBwYXJzZVZhckNoYXJcbn0gZnJvbSAnQG5sYWJzL3V0aWxzJztcblxuaW1wb3J0IHtwYXJzZVBvc3R9IGZyb20gJy4uL2FkYXB0ZXJzL3Bvc3RBZGFwdGVyJztcbmltcG9ydCB7RXJyb3JUeXBlc30gZnJvbSAnLi4vdHlwZXMvZXJyb3InO1xuaW1wb3J0IHtsb2dFcnJvciwgbG9nRXhjZXB0aW9ufSBmcm9tICcuLi91dGlscy9hbmFseXRpY3NVdGlscyc7XG5pbXBvcnQge2dldExpbWl0fSBmcm9tICcuLi91dGlscy9hcmFuZ29kYlV0aWxzJztcbmltcG9ydCB7ZXh0cmFjdFRhZ3MsIGdldFRhZ3NCeU5hbWUsIHVwZGF0ZVRhZ3NJbkl0ZW19IGZyb20gJy4vdGFncyc7XG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dCwgQXJhbmdvRGJMaW1pdCwgRmlsZVR5cGUsIFBvc3RJbnB1dFR5cGUsIFBvc3RPcHRpb25zLCBQb3N0VHlwZSwgVGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBNQVhfQ09OVEVOVF9MRU5HVEg6IG51bWJlciA9IDEwMDAwMDtcbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdwb3N0cyc7XG5cbmV4cG9ydCBjb25zdCBwYXJzZVBvc3RPcHRpb25zID0gKG9wdGlvbnM6IFBvc3RPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGZyb20gPSAwLFxuICAgIGxhdGl0dWRlID0gMCxcbiAgICBsb25naXR1ZGUgPSAwLFxuICAgIHRvID0gMzAsXG4gICAgdHlwZSA9ICdwb3N0J1xuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGxhdGl0dWRlOiBwYXJzZU51bShsYXRpdHVkZSwgMzIpLFxuICAgIGxpbWl0OiBnZXRMaW1pdChmcm9tLCB0bykgYXMgQXJhbmdvRGJMaW1pdCxcbiAgICBsb25naXR1ZGU6IHBhcnNlTnVtKGxvbmdpdHVkZSwgMzIpLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMilcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0T3B0aW9uYWwgPSAoZmllbGRzOiBzdHJpbmdbXSwgc2Vzc2lvbklkOiBzdHJpbmcpID0+XG4gIChmaWVsZHMgfHwgW10pLnJlZHVjZSgoc2VsZWN0czogYW55LCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdoYXNSc3ZwJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIGhhc1JzdnAgPSBUT19CT09MKEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwicnN2cFwiICYmIHIudHlwZSA9PSBcInBvc3RzXCIgJiYgci5fZnJvbSA9PSBcInVzZXJzLyR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKSlgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ2hhc1JzdnA6aGFzUnN2cCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2lzU2F2ZWQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgaXNTYXZlZCA9IFRPX0JPT0woRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJwaW5cIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiICYmIHIuX2Zyb20gPT0gXCJ1c2Vycy8ke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgICkpYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdpc1NhdmVkOmlzU2F2ZWQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncmVhY3Rpb25zOnJlYWN0aW9ucycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JzdnBDb3VudCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCByc3ZwQ291bnQgPSBGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInJzdnBcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncnN2cENvdW50OnJzdnBDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZpZXdDb3VudCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB2aWV3Q291bnQgPSBGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInZpZXdcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndmlld0NvdW50OnZpZXdDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgfVxuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwb3N0SWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcbiAgY29uc3Qge3R5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZGIgPSBkYXRhYmFzZTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9ICYmIHAudHlwZSA9PSAke3R5cGV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBfaWQ6IHBvc3REb2NJZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBncm91cElkLFxuICAgICAgICBwcml2YWN5ID0gJ2RlZmF1bHQnXG4gICAgICB9OiBQb3N0VHlwZSA9IHBvc3Q7XG5cbiAgICAgIGxldCBwcml2YWN5QXFsUXJ5OiBzdHJpbmc7XG5cbiAgICAgIGlmKHVzZXJJZCA9PT0gc2Vzc2lvbklkKSB7XG4gICAgICAgIHJldHVybiBwb3N0O1xuICAgICAgfVxuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBMRVQgcCA9IERPQ1VNRU5UKFwiJHtwb3N0RG9jSWR9XCIpXG4gICAgICAgICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICAgICAgIEZPUiBncm91cCBJTiBncm91cHNcbiAgICAgICAgICBGSUxURVIgZ3JvdXAuX2tleSA9PSBwLmdyb3VwSWRcbiAgICAgICAgICBGT1IgdSwgZSBJTiBPVVRCT1VORCBncm91cC5faWQgaXNHcm91cGVkXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBcIiR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgTEVUIHAgPSBET0NVTUVOVChcIiR7cG9zdERvY0lkfVwiKVxuICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG4vLyBleHBvcnQgY29uc3QgZ2V0UG9zdExpc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4vLyAgIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeUFwcCc7XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4vLyAgIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuLy8gICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuLy8gICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuLy8gICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbi8vICAgICAke2xpbWl0LmFxbH1cbi8vICAgICBTT1JUIHAuYWRkZWRcbi8vICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuLy8gICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuLy8gICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlBcmVhID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBsYXRpdHVkZTogbnVtYmVyLFxuICBsb25naXR1ZGU6IG51bWJlcixcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeUFyZWEnO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgZm9ybWF0TGF0aXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxhdGl0dWRlKTtcbiAgY29uc3QgZm9ybWF0TG9uZ2l0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsb25naXR1ZGUpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICR7Zm9ybWF0TGF0aXR1ZGV9LFxuICAgICR7Zm9ybWF0TG9uZ2l0dWRlfSxcbiAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICBOT1RfTlVMTChwLmxvbmdpdHVkZSwgMCkpXG4gIGApO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG5cbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudElkID09IG51bGxcbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIGRpc3RhbmNlLCBwLmFkZGVkXG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbi8vIGV4cG9ydCBjb25zdCBnZXRQb3N0c0J5R3JvdXAgPSAoXG4vLyAgIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4vLyAgIGdyb3VwSWQ6IHN0cmluZyxcbi8vICAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4vLyApOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbi8vICAgLy8gY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0TGlzdEJ5R3JvdXAnO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuLy8gICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuXG4vLyAgIC8vIEdyb3VwIGlkXG4vLyAgIGNvbnN0IGZvcm1hdEdyb3VwSWQ6IHN0cmluZyA9IHBhcnNlSWQoZ3JvdXBJZCk7XG4vLyAgIGNvbnN0IGRiID0gZGF0YWJhc2U7XG4vLyAgIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiB1LCBnIElOIElOQk9VTkQgJHtmb3JtYXRHcm91cElkfSBoYXNHcm91cFxuLy8gICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbi8vICAgICAgIFJFVFVSTiBnYDtcblxuLy8gICByZXR1cm4gZGIucXVlcnkoYXFsUXJ5KVxuLy8gICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgLnRoZW4oKGdyb3VwczogR3JvdXBUeXBlW10gPSBbXSkgPT4ge1xuLy8gICAgICAgaWYoZ3JvdXBzLmxlbmd0aCkge1xuLy8gICAgICAgICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbi8vICAgICAgICAgY29uc3QgcG9zdEFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4vLyAgICAgICAgICAgRklMVEVSIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLmdyb3VwSWQgPT0gXCIke2Zvcm1hdEdyb3VwSWR9XCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuLy8gICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbi8vICAgICAgICAgICAke2xpbWl0LmFxbH1cbi8vICAgICAgICAgICBTT1JUIHAuYWRkZWRcbi8vICAgICAgICAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuLy8gICAgICAgICByZXR1cm4gZGIucXVlcnkocG9zdEFxbFFyeSlcbi8vICAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuLy8gICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4vLyAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbi8vICAgICAgICAgICB9KTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgcmV0dXJuIFtdO1xuLy8gICAgIH0pXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlMYXRlc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeUxhdGVzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWQgREVTQ1xuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeVJlYWN0aW9ucyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgcmVhY3Rpb25zOiBzdHJpbmdbXSA9IFtdLFxuICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbik6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0c0J5UmVhY3Rpb25zJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsaW1pdCwgbG9uZ2l0dWRlLCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmVhY3Rpb25zLm1hcCgocmVhY3Rpb24pID0+IHBhcnNlQ2hhcihyZWFjdGlvbiwgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZihyZWFjdGlvbnMubGVuZ3RoKSB7XG4gICAgc29ydEJ5LnB1c2goJ21hdGNoZWRUYWdzIERFU0MnKTtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBtYXRjaGVkUmVhY3Rpb25zID0gTEVOR1RIKFxuICAgICAgRk9SIG1yIElOIHJlYWN0aW9uc1xuICAgICAgRklMVEVSIG1yLm1hdGNoZWQgPT0gdHJ1ZVxuICAgICAgUkVUVVJOIG1yXG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFJlYWN0aW9uczptYXRjaGVkUmVhY3Rpb25zJyk7XG4gICAgZmlsdGVycy5wdXNoKCdtYXRjaGVkUmVhY3Rpb25zID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwLCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgRk9SIHJlYWN0aW9uLCBociBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRSZWFjdGlvbnN9KSA+IDAgJiYgUE9TSVRJT04oJHtmb3JtYXRSZWFjdGlvbnN9LCByZWFjdGlvbi5uYW1lKVxuICAgICAgU09SVCByZWFjdGlvbi5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UocmVhY3Rpb24sIHttYXRjaGVkOm1hdGNoZWR9KVxuICAgIClcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5VGFncyA9IChcbiAgY29udGV4dDogQXBpQ29udGV4dCxcbiAgdGFnczogc3RyaW5nW10gPSBbXSxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeVRhZ3MnO1xuICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGF0aXR1ZGUsIGxpbWl0LCBsb25naXR1ZGUsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgZm9ybWF0VGFnTmFtZXM6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KHRhZ3MubWFwKCh0YWcpID0+IHBhcnNlQ2hhcih0YWcsIDMyKS50b0xvd2VyQ2FzZSgpKSk7XG4gIGNvbnN0IHNvcnRCeTogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbYHAudHlwZSA9PSBcIiR7dHlwZX1cImAsICdwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiddO1xuICBjb25zdCBmb3JtYXRMYXRpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obGF0aXR1ZGUpO1xuICBjb25zdCBmb3JtYXRMb25naXR1ZGU6IG51bWJlciA9IHBhcnNlTnVtKGxvbmdpdHVkZSk7XG5cbiAgaWYoZm9ybWF0TGF0aXR1ZGUgJiYgZm9ybWF0TG9uZ2l0dWRlKSB7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAgICR7Zm9ybWF0TGF0aXR1ZGV9LFxuICAgICAgJHtmb3JtYXRMb25naXR1ZGV9LFxuICAgICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgICBOT1RfTlVMTChwLmxvbmdpdHVkZSwgMCkpXG4gICAgYCk7XG4gICAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuICAgIHNvcnRCeS5wdXNoKCdkaXN0YW5jZScpO1xuICB9XG5cbiAgaWYodGFncy5sZW5ndGgpIHtcbiAgICBzb3J0QnkucHVzaCgnbWF0Y2hlZFRhZ3MgREVTQycpO1xuICAgIHNlbGVjdFF1ZXJpZXMucHVzaChgTEVUIG1hdGNoZWRUYWdzID0gTEVOR1RIKFxuICAgICAgRk9SIHQgSU4gdGFnc1xuICAgICAgRklMVEVSIHQubWF0Y2hlZCA9PSB0cnVlXG4gICAgICBSRVRVUk4gdFxuICAgIClgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ21hdGNoZWRUYWdzOm1hdGNoZWRUYWdzJyk7XG4gICAgZmlsdGVycy5wdXNoKCdtYXRjaGVkVGFncyA+IDAnKTtcbiAgfVxuXG4gIHNvcnRCeS5wdXNoKCdwLmFkZGVkIERFU0MnKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCd0YWdzOnRhZ3MnKTtcblxuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIExFVCB0YWdzID0gKFxuICAgICAgRk9SIHRhZywgaXQgSU4gMS4uMSBJTkJPVU5EIHAgaXNUYWdnZWRcbiAgICAgIExFVCBtYXRjaGVkID0gTEVOR1RIKCR7Zm9ybWF0VGFnTmFtZXN9KSA+IDAgJiYgUE9TSVRJT04oJHtmb3JtYXRUYWdOYW1lc30sIHRhZy5uYW1lKVxuICAgICAgU09SVCB0YWcubmFtZVxuICAgICAgUkVUVVJOIE1FUkdFKHRhZywge21hdGNoZWQ6bWF0Y2hlZH0pXG4gICAgKVxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICBGSUxURVIgJHtmaWx0ZXJzLmpvaW4oJyAmJiAnKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUICR7c29ydEJ5LmpvaW4oJywgJyl9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5VXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQ6IHN0cmluZywgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RzQnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdFVzZXJJZDogc3RyaW5nID0gcGFyc2VJZCh1c2VySWQpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBhcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnVzZXJJZCA9PSBcIiR7Zm9ybWF0VXNlcklkfVwiICYmIHAudHlwZSA9PSBcIiR7dHlwZX1cIiAmJiBwLnByaXZhY3kgPT0gXCJwdWJsaWNcIiAmJiBwLnBhcmVudCA9PSBudWxsXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgcC5hZGRlZFxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5hbGwoKSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdENvbW1lbnRzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3RJZDogc3RyaW5nLCBvcHRpb25zPzogUG9zdE9wdGlvbnMpOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdENvbW1lbnRzJztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcblxuICAvLyBHZXQgdGhlIHBhcmVudCBwb3N0IHRvIGdldCByZXN0cmljdGlvbnNcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChwb3N0OiBQb3N0VHlwZSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBfa2V5LFxuICAgICAgICBncm91cElkLFxuICAgICAgICBwcml2YWN5ID0gJ2RlZmF1bHQnXG4gICAgICB9OiBQb3N0VHlwZSA9IHBvc3Q7XG5cbiAgICAgIC8vIFF1ZXJ5IGJhc2VkIG9uIHByaXZhY3kgbGV2ZWxcbiAgICAgIGxldCBwcml2YWN5QXFsUXJ5OiBzdHJpbmc7XG5cbiAgICAgIGlmKGdyb3VwSWQgJiYgcHJpdmFjeSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgRk9SIHVzZXIgSU4gdXNlcnNcbiAgICAgICAgICBGSUxURVIgcC5wYXJlbnQgPT0gXCIke19rZXl9XCIgJiYgdXNlci5fa2V5ID09IHAudXNlcklkXG4gICAgICAgICAgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICAgIClcbiAgICAgICAgICBGT1IgZ3JvdXAgSU4gZ3JvdXBzXG4gICAgICAgICAgRklMVEVSIGdyb3VwLl9rZXkgPT0gcC5ncm91cElkXG4gICAgICAgICAgRk9SIHUsIGUgSU4gT1VUQk9VTkQgZ3JvdXAuX2lkIGlzR3JvdXBlZFxuICAgICAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gXCIke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIFNPUlQgcC5hZGRlZFxuICAgICAgICAgICR7bGltaXQuYXFsfVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7dXNlcjogdXNlciwgcmVhY3Rpb25zOiByZWFjdGlvbnN9KWA7XG4gICAgICB9IGVsc2UgaWYocHJpdmFjeSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgU09SVCBwLmFkZGVkXG4gICAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHt1c2VyOiB1c2VyLCByZWFjdGlvbnM6IHJlYWN0aW9uc30pYDtcbiAgICAgIH1cblxuICAgICAgaWYocHJpdmFjeUFxbFFyeSkge1xuICAgICAgICByZXR1cm4gZGF0YWJhc2UucXVlcnkocHJpdmFjeUFxbFFyeSlcbiAgICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICB9LCBlcnJvciwgY29udGV4dCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFBvc3QgPSBhc3luYyAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHtcbiAgICBjb250ZW50ID0gJycsXG4gICAgZW5kRGF0ZSxcbiAgICBncm91cElkID0gJycsXG4gICAgbG9jYXRpb24sXG4gICAgbGF0aXR1ZGUsXG4gICAgbG9uZ2l0dWRlLFxuICAgIG5hbWUgPSAnJyxcbiAgICBwYXJlbnRJZCA9IG51bGwsXG4gICAgcHJpdmFjeSA9ICdwdWJsaWMnLFxuICAgIHRhZ3MgPSBbXSxcbiAgICBzdGFydERhdGUsXG4gICAgdHlwZSA9ICdkZWZhdWx0J1xuICB9OiBQb3N0SW5wdXRUeXBlXG4pOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcG9zdElkID0gY3JlYXRlSGFzaChgcG9zdC0ke3Nlc3Npb25JZH1gKTtcbiAgY29uc3QgaW5zZXJ0OiBQb3N0VHlwZSA9IHtcbiAgICBfaWQ6IGBwb3N0cy8ke3Bvc3RJZH1gLFxuICAgIF9rZXk6IHBvc3RJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIGNvbnRlbnQ6IHBhcnNlU3RyaW5nKGNvbnRlbnQsIE1BWF9DT05URU5UX0xFTkdUSCksXG4gICAgZW5kRGF0ZTogZW5kRGF0ZSA/IHBhcnNlTnVtKGVuZERhdGUsIDEzKSA6IHVuZGVmaW5lZCxcbiAgICBncm91cElkOiBncm91cElkID8gcGFyc2VJZChncm91cElkKSA6IHVuZGVmaW5lZCxcbiAgICBsYXRpdHVkZTogbGF0aXR1ZGUgIT09IHVuZGVmaW5lZCA/IHBhcnNlTnVtKGxhdGl0dWRlKSA6IHVuZGVmaW5lZCxcbiAgICBsb2NhdGlvbjogbG9jYXRpb24gPyBwYXJzZVN0cmluZyhsb2NhdGlvbiwgMTYwKSA6IHVuZGVmaW5lZCxcbiAgICBsb25naXR1ZGU6IGxvbmdpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obG9uZ2l0dWRlKSA6IHVuZGVmaW5lZCxcbiAgICBtb2RpZmllZDogbm93LFxuICAgIG5hbWU6IHBhcnNlU3RyaW5nKG5hbWUsIDE2MCksXG4gICAgcGFyZW50SWQ6IHBhcmVudElkID8gcGFyc2VJZChwYXJlbnRJZCkgOiB1bmRlZmluZWQsXG4gICAgcHJpdmFjeTogcGFyc2VWYXJDaGFyKHByaXZhY3ksIDE2KSxcbiAgICBzdGFydERhdGU6IHN0YXJ0RGF0ZSA/IHBhcnNlTnVtKHN0YXJ0RGF0ZSwgMTMpIDogdW5kZWZpbmVkLFxuICAgIHR5cGU6IHBhcnNlQ2hhcih0eXBlLCAzMiksXG4gICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHBvc3RzIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgY29uc3Qgc2F2ZWRQb3N0OiBQb3N0VHlwZSA9IGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbiAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gICAgY29uc3Qge19pZDogcG9zdERvY0lkfSA9IHNhdmVkUG9zdDtcbiAgICBjb25zdCBjb250ZW50VGFnTmFtZXMgPSBhd2FpdCBleHRyYWN0VGFncyhpbnNlcnQuY29udGVudCk7XG5cbiAgICBpZih0YWdzLmxlbmd0aCB8fCBjb250ZW50VGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1c2VyVGFncyA9IChhd2FpdCBnZXRUYWdzQnlOYW1lKGNvbnRleHQsIHRhZ3MubWFwKCh7bmFtZX0pID0+IG5hbWUpKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6IHNlc3Npb25JZH0pKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUYWdzID0gKGF3YWl0IGdldFRhZ3NCeU5hbWUoY29udGV4dCwgY29udGVudFRhZ05hbWVzKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6ICdleHRyYWN0J30pKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUYWdzOiBUYWdUeXBlW10gPSBhd2FpdCB1cGRhdGVUYWdzSW5JdGVtKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgaXRlbURvY0lkOiBwb3N0RG9jSWQsXG4gICAgICAgICAgdGFnczogWy4uLmNvbnRlbnRUYWdzLCAuLi51c2VyVGFnc11cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc2F2ZWRQb3N0LFxuICAgICAgICB0YWdzOiB1cGRhdGVkVGFnc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2F2ZWRQb3N0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3Q6IFBvc3RJbnB1dFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZVBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICBjb25zdCBwYXJzZWRQb3N0ID0gcGFyc2VQb3N0KHBvc3QpO1xuICBjb25zdCB7XG4gICAgcG9zdElkLFxuICAgIHRhZ3MgPSBbXVxuICB9ID0gcGFyc2VkUG9zdDtcblxuICBjb25zdCB1cGRhdGU6IFBvc3RUeXBlID0ge1xuICAgIC4uLnBhcnNlZFBvc3QsXG4gICAgbW9kaWZpZWQ6IG5vd1xuICB9O1xuXG4gIGlmKCFwb3N0SWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9JRFxuICAgIH0sIHt9KTtcbiAgfVxuXG4gIGNvbnN0IGluc2VydDogYW55ID0ge1xuICAgIC4uLnVwZGF0ZSxcbiAgICBfa2V5OiBwb3N0SWQsXG4gICAgYWRkZWQ6IG5vdyxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQU0VSVCB7X2tleTogJHtwb3N0SWR9LCB1c2VySWQ6ICR7c2Vzc2lvbklkfX1cbiAgICBJTlNFUlQgJHtpbnNlcnR9XG4gICAgVVBEQVRFICR7dXBkYXRlfVxuICAgIElOIHBvc3RzIFJFVFVSTiBORVdgO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgdXBkYXRlZFBvc3Q6IFBvc3RUeXBlID0gYXdhaXQgZGF0YWJhc2VcbiAgICAgIC5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwge30pKTtcbiAgICBjb25zdCB7X2lkOiB1cGRhdGVkUG9zdElkfSA9IHVwZGF0ZWRQb3N0O1xuICAgIGNvbnN0IGNvbnRlbnRUYWdOYW1lcyA9IGF3YWl0IGV4dHJhY3RUYWdzKGluc2VydC5jb250ZW50KTtcblxuICAgIGlmKHRhZ3M/Lmxlbmd0aCB8fCBjb250ZW50VGFnTmFtZXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdXNlclRhZ3MgPSB0YWdzPy5sZW5ndGggPyAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCB0YWdzLm1hcCgoe25hbWV9KSA9PiBuYW1lKSkpXG4gICAgICAgIC5tYXAoKHRhZykgPT4gKHsuLi50YWcsIHRhZ0J5OiBzZXNzaW9uSWR9KSkgOiBbXTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUYWdzID0gY29udGVudFRhZ05hbWVzPy5sZW5ndGggPyAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCBjb250ZW50VGFnTmFtZXMpKVxuICAgICAgICAubWFwKCh0YWcpID0+ICh7Li4udGFnLCB0YWdCeTogJ2V4dHJhY3QnfSkpIDogW107XG4gICAgICBjb25zdCB1cGRhdGVkVGFnczogVGFnVHlwZVtdID0gYXdhaXQgdXBkYXRlVGFnc0luSXRlbShcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAge1xuICAgICAgICAgIGl0ZW1Eb2NJZDogdXBkYXRlZFBvc3RJZCxcbiAgICAgICAgICB0YWdzOiBbLi4uY29udGVudFRhZ3MsIC4uLnVzZXJUYWdzXVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVkUG9zdCxcbiAgICAgICAgdGFnczogdXBkYXRlZFRhZ3NcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWRQb3N0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3REb2NJZDogc3RyaW5nKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdFBvc3RJZDogc3RyaW5nID0gcGFyc2VBcmFuZ29JZChwb3N0RG9jSWQpO1xuXG4gIGlmKCFmb3JtYXRQb3N0SWQpIHtcbiAgICByZXR1cm4gbG9nRXhjZXB0aW9uKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgdmFsdWU6IEVycm9yVHlwZXMuSU5WQUxJRF9JRFxuICAgIH0sIHt9KTtcbiAgfVxuXG4gIGNvbnN0IGVkZ2VBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiB0IElOIGlzVGFnZ2VkXG4gIEZJTFRFUiB0Ll90byA9PSAke2Zvcm1hdFBvc3RJZH1cbiAgUkVNT1ZFIHQgSU4gaXNUYWdnZWRgO1xuXG4gIGF3YWl0IGRhdGFiYXNlLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuXG4gIGNvbnN0IGZpbGVBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBmIElOIGhhc0ZpbGVcbiAgICBGSUxURVIgZi5fdG8gPT0gJHtmb3JtYXRQb3N0SWR9XG4gICAgUkVNT1ZFIGYgSU4gaGFzRmlsZWA7XG5cbiAgYXdhaXQgZGF0YWJhc2UucXVlcnkoZmlsZUFxbFFyeSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG5cbiAgY29uc3QgYXFsUXJ5ID0gYXFsYEZPUiBwIElOIHBvc3RzXG4gICAgICBGSUxURVIgcC5faWQgPT0gJHtmb3JtYXRQb3N0SWR9ICYmIHAudXNlcklkID09ICR7c2Vzc2lvbklkfVxuICAgICAgTElNSVQgMVxuICAgICAgUkVNT1ZFIHAgSU4gcG9zdHNcbiAgICAgIFJFVFVSTiBPTERgO1xuXG4gIHJldHVybiBkYXRhYmFzZS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvc3RFZGdlID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwb3N0RG9jSWQ6IHN0cmluZyxcbiAgaXRlbURvY0lkOiBzdHJpbmcsXG4gIGVkZ2VUeXBlOiBzdHJpbmcgPSAnaXNQb3N0ZWQnLFxuICBwcm9wczogYW55ID0ge31cbik6IFByb21pc2U8RmlsZVR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uID0gJ2NyZWF0ZVBvc3RFZGdlJztcbiAgY29uc3Qge2RhdGFiYXNlfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGVkZ2VDb2xsZWN0aW9uOiBFZGdlQ29sbGVjdGlvbiA9IGRhdGFiYXNlLmNvbGxlY3Rpb24oZWRnZVR5cGUpO1xuICBjb25zdCBmb3JtYXRQb3N0SWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQocG9zdERvY0lkKTtcbiAgY29uc3QgZm9ybWF0RG9jSWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQoaXRlbURvY0lkKTtcblxuICBpZighZm9ybWF0RG9jSWQgfHwgIWZvcm1hdFBvc3RJZCkge1xuICAgIHJldHVybiBsb2dFeGNlcHRpb24oe1xuICAgICAgYWN0aW9uLFxuICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICB2YWx1ZTogRXJyb3JUeXBlcy5JTlZBTElEX0lEXG4gICAgfSwge30pO1xuICB9XG5cbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBwb3N0RWRnZS0ke2Zvcm1hdFBvc3RJZH0tJHtmb3JtYXREb2NJZH1gKTtcbiAgY29uc3QgZWRnZTogYW55ID0ge1xuICAgIF9mcm9tOiBmb3JtYXRQb3N0SWQsXG4gICAgX2tleTogZWRnZUlkLFxuICAgIF90bzogZm9ybWF0RG9jSWQsXG4gICAgYWRkZWQ6IERhdGUubm93KCksXG4gICAgLi4ucHJvcHNcbiAgfTtcblxuICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT5cbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgdmFsdWU6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCB7fSkpO1xufTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUlBLHNCQUFrQjtBQUlsQixtQkFFTztBQUVQLHlCQUF3QjtBQUN4QixtQkFBeUI7QUFDekIsNEJBQXFDO0FBQ3JDLDJCQUF1QjtBQUN2QixrQkFBMkQ7QUFHM0QsTUFBTSxxQkFBNkI7QUFDbkMsTUFBTSxnQkFBd0I7QUFFdkIsTUFBTSxtQkFBbUIsQ0FBQyxVQUF1QixDQUFDLE1BQU07QUFDN0QsUUFBTTtBQUFBLElBQ0osT0FBTztBQUFBLElBQ1AsV0FBVztBQUFBLElBQ1gsWUFBWTtBQUFBLElBQ1osS0FBSztBQUFBLElBQ0wsT0FBTztBQUFBLEVBQ1QsSUFBSTtBQUVKLFNBQU87QUFBQSxJQUNMLGNBQVUsdUJBQVMsVUFBVSxFQUFFO0FBQUEsSUFDL0IsV0FBTywrQkFBUyxNQUFNLEVBQUU7QUFBQSxJQUN4QixlQUFXLHVCQUFTLFdBQVcsRUFBRTtBQUFBLElBQ2pDLFVBQU0sd0JBQVUsTUFBTSxFQUFFO0FBQUEsRUFDMUI7QUFDRjtBQUVPLE1BQU0sa0JBQWtCLENBQUMsUUFBa0IsZUFDL0MsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFNBQWMsVUFBa0I7QUFDckQsVUFBTyxPQUFPO0FBQUEsSUFDWixLQUFLLFdBQVc7QUFDZCxjQUFRLFFBQVEsS0FBSztBQUFBO0FBQUEsOEVBRWlELFNBQVM7QUFBQTtBQUFBO0FBQUEsV0FHNUU7QUFDSCxjQUFRLFFBQVEsS0FBSyxpQkFBaUI7QUFDdEMsYUFBTztBQUFBLElBQ1Q7QUFBQSxJQUNBLEtBQUssV0FBVztBQUNkLGNBQVEsUUFBUSxLQUFLO0FBQUE7QUFBQSw2RUFFZ0QsU0FBUztBQUFBO0FB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
|
|
142
|
+
RETURN OLD`;return y(o).query(c).then(s=>s.next()).catch(s=>{throw s})},dt=(e,r,t,o="isPosted",i={})=>{const n="createPostEdge",{databaseName:p}=e,R=y(p).collection(o),c=S(r),s=S(t);if(!s||!c)return Promise.reject(new Error(N.INVALID_ID));const a=B(`postEdge-${c}-${s}`),u={_from:c,_key:a,_to:s,added:Date.now(),...i};return R.save(u,{returnNew:!0}).catch(d=>f({action:n,category:O,value:N.DATABASE_ERROR},d,{}))};export{pt as addPost,dt as createPostEdge,ut as deletePost,et as getPost,it as getPostComments,C as getPostOptional,st as getPostsByArea,ot as getPostsByLatest,rt as getPostsByReactions,nt as getPostsByTags,at as getPostsByUser,$ as parsePostOptions,ct as updatePost};
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2FjdGlvbnMvcG9zdHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE5LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1xuICBjcmVhdGVIYXNoLCBwYXJzZUFyYW5nb0lkLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtLCBwYXJzZVN0cmluZywgcGFyc2VWYXJDaGFyXG59IGZyb20gJ0BubGFicy91dGlscyc7XG5pbXBvcnQge2FxbH0gZnJvbSAnYXJhbmdvanMnO1xuaW1wb3J0IHtBcWxRdWVyeX0gZnJvbSAnYXJhbmdvanMvYXFsJztcblxuaW1wb3J0IHtleHRyYWN0VGFncywgZ2V0VGFnc0J5TmFtZSwgdXBkYXRlVGFnc0luSXRlbX0gZnJvbSAnLi90YWdzJztcbmltcG9ydCB7cGFyc2VQb3N0fSBmcm9tICcuLi9hZGFwdGVycy9wb3N0QWRhcHRlcic7XG5pbXBvcnQge0Vycm9yVHlwZXN9IGZyb20gJy4uL3R5cGVzL2Vycm9yLnR5cGVzJztcbmltcG9ydCB7bG9nRXJyb3IsIGxvZ0V4Y2VwdGlvbn0gZnJvbSAnLi4vdXRpbHMvYW5hbHl0aWNzVXRpbHMnO1xuaW1wb3J0IHtnZXRMaW1pdCwgdXNlRGJ9IGZyb20gJy4uL3V0aWxzL2FyYW5nb2RiVXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7QXBpQ29udGV4dCwgQXJhbmdvRGJMaW1pdCwgRmlsZVR5cGUsIFBvc3RJbnB1dFR5cGUsIFBvc3RPcHRpb25zLCBQb3N0VHlwZSwgVGFnVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9ucyc7XG5cbmNvbnN0IE1BWF9DT05URU5UX0xFTkdUSDogbnVtYmVyID0gMTAwMDAwO1xuY29uc3QgZXZlbnRDYXRlZ29yeTogc3RyaW5nID0gJ3Bvc3RzJztcblxuZXhwb3J0IGNvbnN0IHBhcnNlUG9zdE9wdGlvbnMgPSAob3B0aW9uczogUG9zdE9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZnJvbSA9IDAsXG4gICAgbGF0aXR1ZGUgPSAwLFxuICAgIGxvbmdpdHVkZSA9IDAsXG4gICAgdG8gPSAzMCxcbiAgICB0eXBlID0gJ3Bvc3QnXG4gIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgbGF0aXR1ZGU6IHBhcnNlTnVtKGxhdGl0dWRlLCAzMiksXG4gICAgbGltaXQ6IGdldExpbWl0KGZyb20sIHRvKSBhcyBBcmFuZ29EYkxpbWl0LFxuICAgIGxvbmdpdHVkZTogcGFyc2VOdW0obG9uZ2l0dWRlLCAzMiksXG4gICAgdHlwZTogcGFyc2VDaGFyKHR5cGUsIDMyKVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RPcHRpb25hbCA9IChmaWVsZHM6IHN0cmluZ1tdLCBzZXNzaW9uSWQ6IHN0cmluZykgPT5cbiAgKGZpZWxkcyB8fCBbXSkucmVkdWNlKChzZWxlY3RzLCBmaWVsZDogc3RyaW5nKSA9PiB7XG4gICAgc3dpdGNoKGZpZWxkKSB7XG4gICAgICBjYXNlICdoYXNSc3ZwJzoge1xuICAgICAgICBzZWxlY3RzLnF1ZXJpZXMucHVzaChgTEVUIGhhc1JzdnAgPSBUT19CT09MKEZJUlNUKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBGSUxURVIgci5uYW1lID09IFwicnN2cFwiICYmIHIudHlwZSA9PSBcInBvc3RzXCIgJiYgci5fZnJvbSA9PSBcInVzZXJzLyR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKSlgKTtcbiAgICAgICAgc2VsZWN0cy5vYmplY3RzLnB1c2goJ2hhc1JzdnA6aGFzUnN2cCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2lzU2F2ZWQnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgaXNTYXZlZCA9IFRPX0JPT0woRklSU1QoXG4gICAgICAgICAgRk9SIHBvc3QsIHIgSU4gSU5CT1VORCBwLl9pZCBoYXNSZWFjdGlvblxuICAgICAgICAgIEZJTFRFUiByLm5hbWUgPT0gXCJwaW5cIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiICYmIHIuX2Zyb20gPT0gXCJ1c2Vycy8ke3Nlc3Npb25JZH1cIlxuICAgICAgICAgIENPTExFQ1QgV0lUSCBDT1VOVCBJTlRPIGNvdW50XG4gICAgICAgICAgUkVUVVJOIGNvdW50XG4gICAgICAgICkpYCk7XG4gICAgICAgIHNlbGVjdHMub2JqZWN0cy5wdXNoKCdpc1NhdmVkOmlzU2F2ZWQnKTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgICBjYXNlICdyZWFjdGlvbnMnOiB7XG4gICAgICAgIHNlbGVjdHMucXVlcmllcy5wdXNoKGBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgaGFzUmVhY3Rpb25cbiAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncmVhY3Rpb25zOnJlYWN0aW9ucycpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JzdnBDb3VudCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCByc3ZwQ291bnQgPSBGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInJzdnBcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgncnN2cENvdW50OnJzdnBDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3ZpZXdDb3VudCc6IHtcbiAgICAgICAgc2VsZWN0cy5xdWVyaWVzLnB1c2goYExFVCB2aWV3Q291bnQgPSBGSVJTVChcbiAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIGhhc1JlYWN0aW9uXG4gICAgICAgICAgRklMVEVSIHIubmFtZSA9PSBcInZpZXdcIiAmJiByLnR5cGUgPT0gXCJwb3N0c1wiXG4gICAgICAgICAgQ09MTEVDVCBXSVRIIENPVU5UIElOVE8gY291bnRcbiAgICAgICAgICBSRVRVUk4gY291bnRcbiAgICAgICAgKWApO1xuICAgICAgICBzZWxlY3RzLm9iamVjdHMucHVzaCgndmlld0NvdW50OnZpZXdDb3VudCcpO1xuICAgICAgICByZXR1cm4gc2VsZWN0cztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdHM7XG4gICAgICB9XG4gICAgfVxuICB9LCB7b2JqZWN0czogW10sIHF1ZXJpZXM6IFtdfSk7XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwb3N0SWQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3QgZm9ybWF0SXRlbUlkOiBzdHJpbmcgPSBwYXJzZUlkKHBvc3RJZCk7XG4gIGNvbnN0IHt0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGRhdGFiYXNlID0gdXNlRGIoZGF0YWJhc2VOYW1lKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9ICYmIHAudHlwZSA9PSAke3R5cGV9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gZGF0YWJhc2UucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHBvc3Q6IFBvc3RUeXBlKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIF9pZDogcG9zdERvY0lkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIGdyb3VwSWQsXG4gICAgICAgIHByaXZhY3kgPSAnZGVmYXVsdCdcbiAgICAgIH06IFBvc3RUeXBlID0gcG9zdDtcblxuICAgICAgbGV0IHByaXZhY3lBcWxRcnk6IHN0cmluZztcblxuICAgICAgaWYodXNlcklkID09PSBzZXNzaW9uSWQpIHtcbiAgICAgICAgcmV0dXJuIHBvc3Q7XG4gICAgICB9XG5cbiAgICAgIGlmKGdyb3VwSWQgJiYgcHJpdmFjeSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYExFVCBwID0gRE9DVU1FTlQoXCIke3Bvc3REb2NJZH1cIilcbiAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBoYXNDb25uZWN0aW9uXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBcIiR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgTElNSVQgMVxuICAgICAgICAgIFJFVFVSTiBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuICAgICAgfSBlbHNlIGlmKHByaXZhY3kgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHByaXZhY3lBcWxRcnkgPSBgTEVUIHAgPSBET0NVTUVOVChcIiR7cG9zdERvY0lkfVwiKVxuICAgICAgICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAgICAgICBMSU1JVCAxXG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG4gICAgICB9XG5cbiAgICAgIGlmKHByaXZhY3lBcWxRcnkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4gbG9nRXJyb3Ioe1xuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgfSwgZXJyb3IsIGNvbnRleHQpKTtcbn07XG5cblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RMaXN0ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuLy8gICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlBcHAnO1xuLy8gICBjb25zdCB7ZGF0YWJhc2UsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuLy8gICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbi8vICAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbi8vICAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbi8vICAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50ID09IG51bGxcbi8vICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4vLyAgICAgJHtsaW1pdC5hcWx9XG4vLyAgICAgU09SVCBwLmFkZGVkXG4vLyAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbi8vICAgcmV0dXJuIGRhdGFiYXNlLnF1ZXJ5KGFxbFFyeSlcbi8vICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlBcmVhID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBsYXRpdHVkZTogbnVtYmVyLFxuICBsb25naXR1ZGU6IG51bWJlcixcbiAgb3B0aW9ucz86IFBvc3RPcHRpb25zXG4pOiBQcm9taXNlPFBvc3RUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0UG9zdHNCeUFyZWEnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgZGlzdGFuY2UgPSBESVNUQU5DRShcbiAgICAke2Zvcm1hdExhdGl0dWRlfSxcbiAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgTk9UX05VTEwocC5sYXRpdHVkZSwgMCksXG4gICAgTk9UX05VTEwocC5sb25naXR1ZGUsIDApKVxuICBgKTtcbiAgc2VsZWN0T2JqZWN0cy5wdXNoKCdkaXN0YW5jZTpkaXN0YW5jZScpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnRJZCA9PSBudWxsXG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBkaXN0YW5jZSwgcC5hZGRlZFxuICAgIFJFVFVSTiBESVNUSU5DVCBNRVJHRShwLCB7JHtzZWxlY3RPYmplY3RzLmpvaW4oJywgJyl9fSlgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkgYXMgdW5rbm93biBhcyBQb3N0VHlwZVtdKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIGxhYmVsOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwgY29udGV4dCk7XG5cbiAgICAgIHJldHVybiBbXSBhcyBQb3N0VHlwZVtdO1xuICAgIH0pO1xufTtcblxuLy8gZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlHcm91cCA9IChcbi8vICAgY29udGV4dDogQXBpQ29udGV4dCxcbi8vICAgZ3JvdXBJZDogc3RyaW5nLFxuLy8gICBvcHRpb25zPzogUG9zdE9wdGlvbnNcbi8vICk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuLy8gICAvLyBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRMaXN0QnlHcm91cCc7XG4vLyAgIGNvbnN0IHtkYXRhYmFzZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4vLyAgIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG5cbi8vICAgLy8gR3JvdXAgaWRcbi8vICAgY29uc3QgZm9ybWF0R3JvdXBJZDogc3RyaW5nID0gcGFyc2VJZChncm91cElkKTtcbi8vICAgY29uc3QgZGIgPSBkYXRhYmFzZTtcbi8vICAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHUsIGcgSU4gSU5CT1VORCAke2Zvcm1hdEdyb3VwSWR9IGhhc0dyb3VwXG4vLyAgICAgICBGSUxURVIgdS5fa2V5ID09ICR7c2Vzc2lvbklkfVxuLy8gICAgICAgUkVUVVJOIGdgO1xuXG4vLyAgIHJldHVybiBkYi5xdWVyeShhcWxRcnkpXG4vLyAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuLy8gICAgIC50aGVuKChncm91cHM6IEdyb3VwVHlwZVtdID0gW10pID0+IHtcbi8vICAgICAgIGlmKGdyb3Vwcy5sZW5ndGgpIHtcbi8vICAgICAgICAgY29uc3Qge2xpbWl0LCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4vLyAgICAgICAgIGNvbnN0IHBvc3RBcWxRcnk6IHN0cmluZyA9IGBGT1IgcCBJTiBwb3N0c1xuLy8gICAgICAgICAgIEZJTFRFUiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5ncm91cElkID09IFwiJHtmb3JtYXRHcm91cElkfVwiICYmIHAucGFyZW50ID09IG51bGxcbi8vICAgICAgICAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4vLyAgICAgICAgICAgJHtsaW1pdC5hcWx9XG4vLyAgICAgICAgICAgU09SVCBwLmFkZGVkXG4vLyAgICAgICAgICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbi8vICAgICAgICAgcmV0dXJuIGRiLnF1ZXJ5KHBvc3RBcWxRcnkpXG4vLyAgICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuLy8gICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4vLyAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbi8vICAgICAgICAgICB9KTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgcmV0dXJuIFtdO1xuLy8gICAgIH0pXG4vLyAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbi8vICAgICAgIHRocm93IGVycm9yO1xuLy8gICAgIH0pO1xuLy8gfTtcblxuZXhwb3J0IGNvbnN0IGdldFBvc3RzQnlMYXRlc3QgPSAoY29udGV4dDogQXBpQ29udGV4dCwgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIC8vIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldExpc3RCeUxhdGVzdCc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWUsIGZpZWxkcywgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCB7bGltaXQsIHR5cGV9ID0gcGFyc2VQb3N0T3B0aW9ucyhvcHRpb25zKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC50eXBlID09IFwiJHt0eXBlfVwiICYmIHAucHJpdmFjeSA9PSBcInB1YmxpY1wiICYmIHAucGFyZW50ID09IG51bGxcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgU09SVCBwLmFkZGVkIERFU0NcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpKVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5UmVhY3Rpb25zID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICByZWFjdGlvbnM6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RzQnlSZWFjdGlvbnMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBmaWVsZHMsIHNlc3Npb246IHt1c2VySWQ6IHNlc3Npb25JZH19ID0gY29udGV4dDtcbiAgY29uc3Qge2xhdGl0dWRlLCBsaW1pdCwgbG9uZ2l0dWRlLCB0eXBlfSA9IHBhcnNlUG9zdE9wdGlvbnMob3B0aW9ucyk7XG4gIGNvbnN0IHtvYmplY3RzOiBzZWxlY3RPYmplY3RzLCBxdWVyaWVzOiBzZWxlY3RRdWVyaWVzfSA9IGdldFBvc3RPcHRpb25hbChmaWVsZHMsIHNlc3Npb25JZCk7XG4gIGNvbnN0IGZvcm1hdFNlc3Npb25JZDogc3RyaW5nID0gYHVzZXJzLyR7c2Vzc2lvbklkfWA7XG4gIGNvbnN0IGZvcm1hdFJlYWN0aW9uczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkocmVhY3Rpb25zLm1hcCgocmVhY3Rpb24pID0+IHBhcnNlQ2hhcihyZWFjdGlvbiwgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZihyZWFjdGlvbnMubGVuZ3RoKSB7XG4gICAgc29ydEJ5LnB1c2goJ21hdGNoZWRUYWdzIERFU0MnKTtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBtYXRjaGVkUmVhY3Rpb25zID0gTEVOR1RIKFxuICAgICAgRk9SIG1yIElOIHJlYWN0aW9uc1xuICAgICAgRklMVEVSIG1yLm1hdGNoZWQgPT0gdHJ1ZVxuICAgICAgUkVUVVJOIG1yXG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFJlYWN0aW9uczptYXRjaGVkUmVhY3Rpb25zJyk7XG4gICAgZmlsdGVycy5wdXNoKCdtYXRjaGVkUmVhY3Rpb25zID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3JlYWN0aW9uczpyZWFjdGlvbnMnKTtcblxuICAvLyBHZXQgZGF0YSBmcm9tIGRhdGFiYXNlXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwLCByIElOIE9VVEJPVU5EIFwiJHtmb3JtYXRTZXNzaW9uSWR9XCIgaGFzUmVhY3Rpb25cbiAgICBMRVQgcmVhY3Rpb25zID0gKFxuICAgICAgRk9SIHJlYWN0aW9uLCBociBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRSZWFjdGlvbnN9KSA+IDAgJiYgUE9TSVRJT04oJHtmb3JtYXRSZWFjdGlvbnN9LCByZWFjdGlvbi5uYW1lKVxuICAgICAgU09SVCByZWFjdGlvbi5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UocmVhY3Rpb24sIHttYXRjaGVkOm1hdGNoZWR9KVxuICAgIClcbiAgICAke3NlbGVjdFF1ZXJpZXMuam9pbignXFxuJyl9XG4gICAgRklMVEVSICR7ZmlsdGVycy5qb2luKCcgJiYgJyl9XG4gICAgJHtsaW1pdC5hcWx9XG4gICAgUkVUVVJOIERJU1RJTkNUIE1FUkdFKHAsIHske3NlbGVjdE9iamVjdHMuam9pbignLCAnKX19KWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5hbGwoKSBhcyB1bmtub3duIGFzIFBvc3RUeXBlW10pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFtdIGFzIFBvc3RUeXBlW107XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UG9zdHNCeVRhZ3MgPSAoXG4gIGNvbnRleHQ6IEFwaUNvbnRleHQsXG4gIHRhZ3M6IHN0cmluZ1tdID0gW10sXG4gIG9wdGlvbnM/OiBQb3N0T3B0aW9uc1xuKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RzQnlUYWdzJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbGltaXQsIGxvbmdpdHVkZSwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCB7b2JqZWN0czogc2VsZWN0T2JqZWN0cywgcXVlcmllczogc2VsZWN0UXVlcmllc30gPSBnZXRQb3N0T3B0aW9uYWwoZmllbGRzLCBzZXNzaW9uSWQpO1xuICBjb25zdCBmb3JtYXRUYWdOYW1lczogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGFncy5tYXAoKHRhZykgPT4gcGFyc2VDaGFyKHRhZywgMzIpLnRvTG93ZXJDYXNlKCkpKTtcbiAgY29uc3Qgc29ydEJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBmaWx0ZXJzOiBzdHJpbmdbXSA9IFtgcC50eXBlID09IFwiJHt0eXBlfVwiYCwgJ3AucHJpdmFjeSA9PSBcInB1YmxpY1wiJ107XG4gIGNvbnN0IGZvcm1hdExhdGl0dWRlOiBudW1iZXIgPSBwYXJzZU51bShsYXRpdHVkZSk7XG4gIGNvbnN0IGZvcm1hdExvbmdpdHVkZTogbnVtYmVyID0gcGFyc2VOdW0obG9uZ2l0dWRlKTtcblxuICBpZihmb3JtYXRMYXRpdHVkZSAmJiBmb3JtYXRMb25naXR1ZGUpIHtcbiAgICBzZWxlY3RRdWVyaWVzLnB1c2goYExFVCBkaXN0YW5jZSA9IERJU1RBTkNFKFxuICAgICAgJHtmb3JtYXRMYXRpdHVkZX0sXG4gICAgICAke2Zvcm1hdExvbmdpdHVkZX0sXG4gICAgICBOT1RfTlVMTChwLmxhdGl0dWRlLCAwKSxcbiAgICAgIE5PVF9OVUxMKHAubG9uZ2l0dWRlLCAwKSlcbiAgICBgKTtcbiAgICBzZWxlY3RPYmplY3RzLnB1c2goJ2Rpc3RhbmNlOmRpc3RhbmNlJyk7XG4gICAgc29ydEJ5LnB1c2goJ2Rpc3RhbmNlJyk7XG4gIH1cblxuICBpZih0YWdzLmxlbmd0aCkge1xuICAgIHNvcnRCeS5wdXNoKCdtYXRjaGVkVGFncyBERVNDJyk7XG4gICAgc2VsZWN0UXVlcmllcy5wdXNoKGBMRVQgbWF0Y2hlZFRhZ3MgPSBMRU5HVEgoXG4gICAgICBGT1IgdCBJTiB0YWdzXG4gICAgICBGSUxURVIgdC5tYXRjaGVkID09IHRydWVcbiAgICAgIFJFVFVSTiB0XG4gICAgKWApO1xuICAgIHNlbGVjdE9iamVjdHMucHVzaCgnbWF0Y2hlZFRhZ3M6bWF0Y2hlZFRhZ3MnKTtcbiAgICBmaWx0ZXJzLnB1c2goJ21hdGNoZWRUYWdzID4gMCcpO1xuICB9XG5cbiAgc29ydEJ5LnB1c2goJ3AuYWRkZWQgREVTQycpO1xuICBzZWxlY3RPYmplY3RzLnB1c2goJ3RhZ3M6dGFncycpO1xuXG4gIGNvbnN0IGFxbFFyeTogc3RyaW5nID0gYEZPUiBwIElOIHBvc3RzXG4gICAgTEVUIHRhZ3MgPSAoXG4gICAgICBGT1IgdGFnLCBpdCBJTiAxLi4xIElOQk9VTkQgcCBpc1RhZ2dlZFxuICAgICAgTEVUIG1hdGNoZWQgPSBMRU5HVEgoJHtmb3JtYXRUYWdOYW1lc30pID4gMCAmJiBQT1NJVElPTigke2Zvcm1hdFRhZ05hbWVzfSwgdGFnLm5hbWUpXG4gICAgICBTT1JUIHRhZy5uYW1lXG4gICAgICBSRVRVUk4gTUVSR0UodGFnLCB7bWF0Y2hlZDptYXRjaGVkfSlcbiAgICApXG4gICAgJHtzZWxlY3RRdWVyaWVzLmpvaW4oJ1xcbicpfVxuICAgIEZJTFRFUiAke2ZpbHRlcnMuam9pbignICYmICcpfVxuICAgICR7bGltaXQuYXFsfVxuICAgIFNPUlQgJHtzb3J0Qnkuam9pbignLCAnKX1cbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0c0J5VXNlciA9IChjb250ZXh0OiBBcGlDb250ZXh0LCB1c2VySWQ6IHN0cmluZywgb3B0aW9ucz86IFBvc3RPcHRpb25zKTogUHJvbWlzZTxQb3N0VHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldFBvc3RzQnlVc2VyJztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgZmllbGRzLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRVc2VySWQ6IHN0cmluZyA9IHBhcnNlSWQodXNlcklkKTtcbiAgY29uc3Qge29iamVjdHM6IHNlbGVjdE9iamVjdHMsIHF1ZXJpZXM6IHNlbGVjdFF1ZXJpZXN9ID0gZ2V0UG9zdE9wdGlvbmFsKGZpZWxkcywgc2Vzc2lvbklkKTtcbiAgY29uc3QgYXFsUXJ5OiBzdHJpbmcgPSBgRk9SIHAgSU4gcG9zdHNcbiAgICBGSUxURVIgcC51c2VySWQgPT0gXCIke2Zvcm1hdFVzZXJJZH1cIiAmJiBwLnR5cGUgPT0gXCIke3R5cGV9XCIgJiYgcC5wcml2YWN5ID09IFwicHVibGljXCIgJiYgcC5wYXJlbnQgPT0gbnVsbFxuICAgICR7c2VsZWN0UXVlcmllcy5qb2luKCdcXG4nKX1cbiAgICAke2xpbWl0LmFxbH1cbiAgICBTT1JUIHAuYWRkZWRcbiAgICBSRVRVUk4gRElTVElOQ1QgTUVSR0UocCwgeyR7c2VsZWN0T2JqZWN0cy5qb2luKCcsICcpfX0pYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb3N0Q29tbWVudHMgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcG9zdElkOiBzdHJpbmcsIG9wdGlvbnM/OiBQb3N0T3B0aW9ucyk6IFByb21pc2U8UG9zdFR5cGVbXT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdnZXRQb3N0Q29tbWVudHMnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IHtsaW1pdCwgdHlwZX0gPSBwYXJzZVBvc3RPcHRpb25zKG9wdGlvbnMpO1xuICBjb25zdCBmb3JtYXRJdGVtSWQ6IHN0cmluZyA9IHBhcnNlSWQocG9zdElkKTtcblxuICAvLyBHZXQgdGhlIHBhcmVudCBwb3N0IHRvIGdldCByZXN0cmljdGlvbnNcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgcCBJTiBwb3N0c1xuICAgIEZJTFRFUiBwLnR5cGUgPT0gJHt0eXBlfSAmJiBwLl9rZXkgPT0gJHtmb3JtYXRJdGVtSWR9XG4gICAgTElNSVQgMVxuICAgIFJFVFVSTiBwYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocG9zdDogUG9zdFR5cGUpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgX2tleSxcbiAgICAgICAgZ3JvdXBJZCxcbiAgICAgICAgcHJpdmFjeSA9ICdkZWZhdWx0J1xuICAgICAgfTogUG9zdFR5cGUgPSBwb3N0O1xuXG4gICAgICAvLyBRdWVyeSBiYXNlZCBvbiBwcml2YWN5IGxldmVsXG4gICAgICBsZXQgcHJpdmFjeUFxbFFyeTogc3RyaW5nO1xuXG4gICAgICBpZihncm91cElkICYmIHByaXZhY3kgPT09ICdncm91cCcpIHtcbiAgICAgICAgcHJpdmFjeUFxbFFyeSA9IGBGT1IgcCBJTiBwb3N0c1xuICAgICAgICAgIEZPUiB1c2VyIElOIHVzZXJzXG4gICAgICAgICAgRklMVEVSIHAucGFyZW50ID09IFwiJHtfa2V5fVwiICYmIHVzZXIuX2tleSA9PSBwLnVzZXJJZFxuICAgICAgICAgIExFVCByZWFjdGlvbnMgPSAoXG4gICAgICAgICAgICBGT1IgcG9zdCwgciBJTiBJTkJPVU5EIHAuX2lkIHJlYWN0aW9uc1xuICAgICAgICAgICAgQ09MTEVDVCByZWFjdGlvbk5hbWUgPSByLnZhbHVlIElOVE8gcmVhY3Rpb25JdGVtc1xuICAgICAgICAgICAgUkVUVVJOIHtuYW1lOiByZWFjdGlvbk5hbWUsIGNvdW50OiBMRU5HVEgocmVhY3Rpb25JdGVtc1sqXS5yLnZhbHVlKX1cbiAgICAgICAgICApXG4gICAgICAgICAgRk9SIGdyb3VwIElOIGdyb3Vwc1xuICAgICAgICAgIEZJTFRFUiBncm91cC5fa2V5ID09IHAuZ3JvdXBJZFxuICAgICAgICAgIEZPUiB1LCBlIElOIE9VVEJPVU5EIGdyb3VwLl9pZCBoYXNDb25uZWN0aW9uXG4gICAgICAgICAgRklMVEVSIHUuX2tleSA9PSBcIiR7c2Vzc2lvbklkfVwiXG4gICAgICAgICAgU09SVCBwLmFkZGVkXG4gICAgICAgICAgJHtsaW1pdC5hcWx9XG4gICAgICAgICAgUkVUVVJOIE1FUkdFKHAsIHt1c2VyOiB1c2VyLCByZWFjdGlvbnM6IHJlYWN0aW9uc30pYDtcbiAgICAgIH0gZWxzZSBpZihwcml2YWN5ID09PSAncHVibGljJykge1xuICAgICAgICBwcml2YWN5QXFsUXJ5ID0gYEZPUiBwIElOIHBvc3RzXG4gICAgICAgICAgRk9SIHVzZXIgSU4gdXNlcnNcbiAgICAgICAgICBGSUxURVIgcC5wYXJlbnQgPT0gXCIke19rZXl9XCIgJiYgdXNlci5fa2V5ID09IHAudXNlcklkXG4gICAgICAgICAgTEVUIHJlYWN0aW9ucyA9IChcbiAgICAgICAgICAgIEZPUiBwb3N0LCByIElOIElOQk9VTkQgcC5faWQgcmVhY3Rpb25zXG4gICAgICAgICAgICBDT0xMRUNUIHJlYWN0aW9uTmFtZSA9IHIudmFsdWUgSU5UTyByZWFjdGlvbkl0ZW1zXG4gICAgICAgICAgICBSRVRVUk4ge25hbWU6IHJlYWN0aW9uTmFtZSwgY291bnQ6IExFTkdUSChyZWFjdGlvbkl0ZW1zWypdLnIudmFsdWUpfVxuICAgICAgICAgIClcbiAgICAgICAgICBTT1JUIHAuYWRkZWRcbiAgICAgICAgICAke2xpbWl0LmFxbH1cbiAgICAgICAgICBSRVRVUk4gTUVSR0UocCwge3VzZXI6IHVzZXIsIHJlYWN0aW9uczogcmVhY3Rpb25zfSlgO1xuICAgICAgfVxuXG4gICAgICBpZihwcml2YWN5QXFsUXJ5KSB7XG4gICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KHByaXZhY3lBcWxRcnkpXG4gICAgICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLmFsbCgpIGFzIHVua25vd24gYXMgUG9zdFR5cGVbXSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFtdIGFzIFBvc3RUeXBlW107XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbG9nRXJyb3Ioe1xuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICBsYWJlbDogRXJyb3JUeXBlcy5EQVRBQkFTRV9FUlJPUlxuICAgICAgfSwgZXJyb3IsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gW10gYXMgUG9zdFR5cGVbXTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRQb3N0ID0gYXN5bmMgKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICB7XG4gICAgY29udGVudCA9ICcnLFxuICAgIGVuZERhdGUsXG4gICAgZ3JvdXBJZCA9ICcnLFxuICAgIGxvY2F0aW9uLFxuICAgIGxhdGl0dWRlLFxuICAgIGxvbmdpdHVkZSxcbiAgICBuYW1lID0gJycsXG4gICAgcGFyZW50SWQgPSBudWxsLFxuICAgIHByaXZhY3kgPSAncHVibGljJyxcbiAgICB0YWdzID0gW10sXG4gICAgc3RhcnREYXRlLFxuICAgIHR5cGUgPSAnZGVmYXVsdCdcbiAgfTogUG9zdElucHV0VHlwZVxuKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBwb3N0SWQgPSBjcmVhdGVIYXNoKGBwb3N0LSR7c2Vzc2lvbklkfWApO1xuICBjb25zdCBpbnNlcnQ6IFBvc3RUeXBlID0ge1xuICAgIF9pZDogYHBvc3RzLyR7cG9zdElkfWAsXG4gICAgX2tleTogcG9zdElkLFxuICAgIGFkZGVkOiBub3csXG4gICAgY29udGVudDogcGFyc2VTdHJpbmcoY29udGVudCwgTUFYX0NPTlRFTlRfTEVOR1RIKSxcbiAgICBlbmREYXRlOiBlbmREYXRlID8gcGFyc2VOdW0oZW5kRGF0ZSwgMTMpIDogdW5kZWZpbmVkLFxuICAgIGdyb3VwSWQ6IGdyb3VwSWQgPyBwYXJzZUlkKGdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIGxhdGl0dWRlOiBsYXRpdHVkZSAhPT0gdW5kZWZpbmVkID8gcGFyc2VOdW0obGF0aXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIGxvY2F0aW9uOiBsb2NhdGlvbiA/IHBhcnNlU3RyaW5nKGxvY2F0aW9uLCAxNjApIDogdW5kZWZpbmVkLFxuICAgIGxvbmdpdHVkZTogbG9uZ2l0dWRlICE9PSB1bmRlZmluZWQgPyBwYXJzZU51bShsb25naXR1ZGUpIDogdW5kZWZpbmVkLFxuICAgIG1vZGlmaWVkOiBub3csXG4gICAgbmFtZTogcGFyc2VTdHJpbmcobmFtZSwgMTYwKSxcbiAgICBwYXJlbnRJZDogcGFyZW50SWQgPyBwYXJzZUlkKHBhcmVudElkKSA6IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiBwYXJzZVZhckNoYXIocHJpdmFjeSwgMTYpLFxuICAgIHN0YXJ0RGF0ZTogc3RhcnREYXRlID8gcGFyc2VOdW0oc3RhcnREYXRlLCAxMykgOiB1bmRlZmluZWQsXG4gICAgdHlwZTogcGFyc2VDaGFyKHR5cGUsIDMyKSxcbiAgICB1c2VySWQ6IHNlc3Npb25JZFxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzYXZlZFBvc3Q6IFBvc3RUeXBlID0gYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShhcWxRcnkpXG4gICAgICAudGhlbigoY3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgYWN0aW9uLFxuICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgbGFiZWw6IEVycm9yVHlwZXMuREFUQUJBU0VfRVJST1JcbiAgICAgIH0sIGVycm9yLCBjb250ZXh0KSk7XG4gICAgY29uc3Qge19pZDogcG9zdERvY0lkfSA9IHNhdmVkUG9zdDtcbiAgICBjb25zdCBjb250ZW50VGFnTmFtZXMgPSBhd2FpdCBleHRyYWN0VGFncyhpbnNlcnQuY29udGVudCk7XG5cbiAgICBpZih0YWdzLmxlbmd0aCB8fCBjb250ZW50VGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1c2VyVGFncyA9IChhd2FpdCBnZXRUYWdzQnlOYW1lKGNvbnRleHQsIHRhZ3MubWFwKCh7bmFtZX0pID0+IG5hbWUpKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6IHNlc3Npb25JZH0pKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUYWdzID0gKGF3YWl0IGdldFRhZ3NCeU5hbWUoY29udGV4dCwgY29udGVudFRhZ05hbWVzKSlcbiAgICAgICAgLm1hcCgodGFnKSA9PiAoey4uLnRhZywgdGFnQnk6ICdleHRyYWN0J30pKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUYWdzOiBUYWdUeXBlW10gPSBhd2FpdCB1cGRhdGVUYWdzSW5JdGVtKFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgaXRlbURvY0lkOiBwb3N0RG9jSWQsXG4gICAgICAgICAgdGFnczogWy4uLmNvbnRlbnRUYWdzLCAuLi51c2VyVGFnc11cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc2F2ZWRQb3N0LFxuICAgICAgICB0YWdzOiB1cGRhdGVkVGFnc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2F2ZWRQb3N0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3Q6IFBvc3RJbnB1dFR5cGUpOiBQcm9taXNlPFBvc3RUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ3VwZGF0ZVBvc3QnO1xuICBjb25zdCB7ZGF0YWJhc2VOYW1lLCBzZXNzaW9uOiB7dXNlcklkOiBzZXNzaW9uSWR9fSA9IGNvbnRleHQ7XG4gIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcGFyc2VkUG9zdCA9IHBhcnNlUG9zdChwb3N0KTtcbiAgY29uc3Qge1xuICAgIHBvc3RJZCxcbiAgICB0YWdzID0gW11cbiAgfSA9IHBhcnNlZFBvc3Q7XG5cbiAgY29uc3QgdXBkYXRlOiBQb3N0VHlwZSA9IHtcbiAgICAuLi5wYXJzZWRQb3N0LFxuICAgIG1vZGlmaWVkOiBub3dcbiAgfTtcblxuICBpZighcG9zdElkKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfSURcbiAgICB9LCB7fSk7XG4gIH1cblxuICBjb25zdCBpbnNlcnQgPSB7XG4gICAgLi4udXBkYXRlLFxuICAgIF9rZXk6IHBvc3RJZCxcbiAgICBhZGRlZDogbm93LFxuICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gIH07XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBTRVJUIHtfa2V5OiAke3Bvc3RJZH0sIHVzZXJJZDogJHtzZXNzaW9uSWR9fVxuICAgIElOU0VSVCAke2luc2VydH1cbiAgICBVUERBVEUgJHt1cGRhdGV9XG4gICAgSU4gcG9zdHMgUkVUVVJOIE5FV2A7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB1cGRhdGVkUG9zdDogUG9zdFR5cGUgPSBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpXG4gICAgICAucXVlcnkoYXFsUXJ5KVxuICAgICAgLnRoZW4oKGN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwge30pKTtcbiAgICBjb25zdCB7X2lkOiB1cGRhdGVkUG9zdElkfSA9IHVwZGF0ZWRQb3N0O1xuICAgIGNvbnN0IGNvbnRlbnRUYWdOYW1lcyA9IGF3YWl0IGV4dHJhY3RUYWdzKGluc2VydC5jb250ZW50KTtcblxuICAgIGlmKHRhZ3M/Lmxlbmd0aCB8fCBjb250ZW50VGFnTmFtZXM/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgdXNlclRhZ3MgPSB0YWdzPy5sZW5ndGggPyAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCB0YWdzLm1hcCgoe25hbWV9KSA9PiBuYW1lKSkpXG4gICAgICAgIC5tYXAoKHRhZykgPT4gKHsuLi50YWcsIHRhZ0J5OiBzZXNzaW9uSWR9KSkgOiBbXTtcbiAgICAgIGNvbnN0IGNvbnRlbnRUYWdzID0gY29udGVudFRhZ05hbWVzPy5sZW5ndGggPyAoYXdhaXQgZ2V0VGFnc0J5TmFtZShjb250ZXh0LCBjb250ZW50VGFnTmFtZXMpKVxuICAgICAgICAubWFwKCh0YWcpID0+ICh7Li4udGFnLCB0YWdCeTogJ2V4dHJhY3QnfSkpIDogW107XG4gICAgICBjb25zdCB1cGRhdGVkVGFnczogVGFnVHlwZVtdID0gYXdhaXQgdXBkYXRlVGFnc0luSXRlbShcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAge1xuICAgICAgICAgIGl0ZW1Eb2NJZDogdXBkYXRlZFBvc3RJZCxcbiAgICAgICAgICB0YWdzOiBbLi4uY29udGVudFRhZ3MsIC4uLnVzZXJUYWdzXVxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVkUG9zdCxcbiAgICAgICAgdGFnczogdXBkYXRlZFRhZ3NcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZWRQb3N0O1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWxldGVQb3N0ID0gYXN5bmMgKGNvbnRleHQ6IEFwaUNvbnRleHQsIHBvc3REb2NJZDogc3RyaW5nKTogUHJvbWlzZTxQb3N0VHlwZT4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdkZWxldGVQb3N0JztcbiAgY29uc3Qge2RhdGFiYXNlTmFtZSwgc2Vzc2lvbjoge3VzZXJJZDogc2Vzc2lvbklkfX0gPSBjb250ZXh0O1xuICBjb25zdCBmb3JtYXRQb3N0SWQ6IHN0cmluZyA9IHBhcnNlQXJhbmdvSWQocG9zdERvY0lkKTtcblxuICBpZighZm9ybWF0UG9zdElkKSB7XG4gICAgcmV0dXJuIGxvZ0V4Y2VwdGlvbih7XG4gICAgICBhY3Rpb24sXG4gICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgIHZhbHVlOiBFcnJvclR5cGVzLklOVkFMSURfSURcbiAgICB9LCB7fSk7XG4gIH1cblxuICBjb25zdCBlZGdlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBGT1IgdCBJTiBpc1RhZ2dlZFxuICBGSUxURVIgdC5fdG8gPT0gJHtmb3JtYXRQb3N0SWR9XG4gIFJFTU9WRSB0IElOIGlzVGFnZ2VkYDtcblxuICBhd2FpdCB1c2VEYihkYXRhYmFzZU5hbWUpLnF1ZXJ5KGVkZ2VBcWxRcnkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuXG4gIGNvbnN0IGZpbGVBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBmIElOIGhhc0ZpbGVcbiAgICBGSUxURVIgZi5fdG8gPT0gJHtmb3JtYXRQb3N0SWR9XG4gICAgUkVNT1ZFIGYgSU4gaGFzRmlsZWA7XG5cbiAgYXdhaXQgdXNlRGIoZGF0YWJhc2VOYW1lKS5xdWVyeShmaWxlQXFsUXJ5KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcblxuICBjb25zdCBhcWxRcnkgPSBhcWxgRk9SIHAgSU4gcG9zdHNcbiAgICAgIEZJTFRFUiBwLl9pZCA9PSAke2Zvcm1hdFBvc3RJZH0gJiYgcC51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgcCBJTiBwb3N0c1xuICAgICAgUkVUVVJOIE9MRGA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlTmFtZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVBvc3RFZGdlID0gKFxuICBjb250ZXh0OiBBcGlDb250ZXh0LFxuICBwb3N0RG9jSWQ6IHN0cmluZyxcbiAgaXRlbURvY0lkOiBzdHJpbmcsXG4gIGVkZ2VUeXBlOiBzdHJpbmcgPSAnaXNQb3N0ZWQnLFxuICBwcm9wcyA9IHt9XG4pOiBQcm9taXNlPEZpbGVUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbiA9ICdjcmVhdGVQb3N0RWRnZSc7XG4gIGNvbnN0IHtkYXRhYmFzZU5hbWV9ID0gY29udGV4dDtcbiAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2VOYW1lKS5jb2xsZWN0aW9uKGVkZ2VUeXBlKTtcbiAgY29uc3QgZm9ybWF0UG9zdElkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKHBvc3REb2NJZCk7XG4gIGNvbnN0IGZvcm1hdERvY0lkOiBzdHJpbmcgPSBwYXJzZUFyYW5nb0lkKGl0ZW1Eb2NJZCk7XG5cbiAgaWYoIWZvcm1hdERvY0lkIHx8ICFmb3JtYXRQb3N0SWQpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKEVycm9yVHlwZXMuSU5WQUxJRF9JRCkpO1xuICB9XG5cbiAgY29uc3QgZWRnZUlkOiBzdHJpbmcgPSBjcmVhdGVIYXNoKGBwb3N0RWRnZS0ke2Zvcm1hdFBvc3RJZH0tJHtmb3JtYXREb2NJZH1gKTtcbiAgY29uc3QgZWRnZSA9IHtcbiAgICBfZnJvbTogZm9ybWF0UG9zdElkLFxuICAgIF9rZXk6IGVkZ2VJZCxcbiAgICBfdG86IGZvcm1hdERvY0lkLFxuICAgIGFkZGVkOiBEYXRlLm5vdygpLFxuICAgIC4uLnByb3BzXG4gIH07XG5cbiAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLnNhdmUoZWRnZSwge3JldHVybk5ldzogdHJ1ZX0pXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+XG4gICAgICBsb2dFcnJvcih7XG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgIHZhbHVlOiBFcnJvclR5cGVzLkRBVEFCQVNFX0VSUk9SXG4gICAgICB9LCBlcnJvciwge30pKTtcbn07XG4iXSwKICAibWFwcGluZ3MiOiAiQUFJQSxPQUNFLGNBQUFBLEVBQVksaUJBQUFDLEVBQWUsYUFBQUMsRUFBVyxXQUFBQyxFQUFTLFlBQUFDLEVBQVUsZUFBQUMsRUFBYSxnQkFBQUMsTUFDakUsZUFDUCxPQUFRLE9BQUFDLE1BQVUsV0FHbEIsT0FBUSxlQUFBQyxFQUFhLGlCQUFBQyxFQUFlLG9CQUFBQyxNQUF1QixTQUMzRCxPQUFRLGFBQUFDLE1BQWdCLDBCQUN4QixPQUFRLGNBQUFDLE1BQWlCLHVCQUN6QixPQUFRLFlBQUFDLEVBQVUsZ0JBQUFDLE1BQW1CLDBCQUNyQyxPQUFRLFlBQUFDLEVBQVUsU0FBQUMsTUFBWSx5QkFLOUIsTUFBTUMsRUFBNkIsSUFDN0JDLEVBQXdCLFFBRWpCQyxFQUFtQixDQUFDQyxFQUF1QixDQUFDLElBQU0sQ0FDN0QsS0FBTSxDQUNKLEtBQUFDLEVBQU8s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QU8sSUFBSSxNQUFNN0UsRUFBVyxVQUFVLENBQUMsRUFHeEQsTUFBTXNGLEVBQWlCbEcsRUFBVyxZQUFZeUYsQ0FBWSxJQUFJUSxDQUFXLEVBQUUsRUFDckVFLEVBQU8sQ0FDWCxNQUFPVixFQUNQLEtBQU1TLEVBQ04sSUFBS0QsRUFDTCxNQUFPLEtBQUssSUFBSSxFQUNoQixHQUFHRixDQUNMLEVBRUEsT0FBT0MsRUFBZSxLQUFLRyxFQUFNLENBQUMsVUFBVyxFQUFJLENBQUMsRUFDL0MsTUFBT25ELEdBQ05uQyxFQUFTLENBQ1AsT0FBQXFCLEVBQ0EsU0FBVWhCLEVBQ1YsTUFBT04sRUFBVyxjQUNwQixFQUFHb0MsRUFBTyxDQUFDLENBQUMsQ0FBQyxDQUNuQiIsCiAgIm5hbWVzIjogWyJjcmVhdGVIYXNoIiwgInBhcnNlQXJhbmdvSWQiLCAicGFyc2VDaGFyIiwgInBhcnNlSWQiLCAicGFyc2VOdW0iLCAicGFyc2VTdHJpbmciLCAicGFyc2VWYXJDaGFyIiwgImFxbCIsICJleHRyYWN0VGFncyIsICJnZXRUYWdzQnlOYW1lIiwgInVwZGF0ZVRhZ3NJbkl0ZW0iLCAicGFyc2VQb3N0IiwgIkVycm9yVHlwZXMiLCAibG9nRXJyb3IiLCAibG9nRXhjZXB0aW9uIiwgImdldExpbWl0IiwgInVzZURiIiwgIk1BWF9DT05URU5UX0xFTkdUSCIsICJldmVudENhdGVnb3J5IiwgInBhcnNlUG9zdE9wdGlvbnMiLCAib3B0aW9ucyIsICJmcm9tIiwgImxhdGl0dWRlIiwgImxvbmdpdHVkZSIsICJ0byIsICJ0eXBlIiwgImdldFBvc3RPcHRpb25hbCIsICJmaWVsZHMiLCAic2Vzc2lvbklkIiwgInNlbGVjdHMiLCAiZmllbGQiLCAiZ2V0UG9zdCIsICJjb250ZXh0IiwgInBvc3RJZCIsICJhY3Rpb24iLCAiZGF0YWJhc2VOYW1lIiwgImZvcm1hdEl0ZW1JZCIsICJkYXRhYmFzZSIsICJzZWxlY3RPYmplY3RzIiwgInNlbGVjdFF1ZXJpZXMiLCAiYXFsUXJ5IiwgImN1cnNvciIsICJwb3N0IiwgInBvc3REb2NJZCIsICJ1c2VySWQiLCAiZ3JvdXBJZCIsICJwcml2YWN5IiwgInByaXZhY3lBcWxRcnkiLCAiZXJyb3IiLCAiZ2V0UG9zdHNCeUFyZWEiLCAibGltaXQiLCAiZm9ybWF0TGF0aXR1ZGUiLCAiZm9ybWF0TG9uZ2l0dWRlIiwgImdldFBvc3RzQnlMYXRlc3QiLCAiZ2V0UG9zdHNCeVJlYWN0aW9ucyIsICJyZWFjdGlvbnMiLCAiZm9ybWF0U2Vzc2lvbklkIiwgImZvcm1hdFJlYWN0aW9ucyIsICJyZWFjdGlvbiIsICJzb3J0QnkiLCAiZmlsdGVycyIsICJnZXRQb3N0c0J5VGFncyIsICJ0YWdzIiwgImZvcm1hdFRhZ05hbWVzIiwgInRhZyIsICJnZXRQb3N0c0J5VXNlciIsICJmb3JtYXRVc2VySWQiLCAiZ2V0UG9zdENvbW1lbnRzIiwgIl9rZXkiLCAiYWRkUG9zdCIsICJjb250ZW50IiwgImVuZERhdGUiLCAibG9jYXRpb24iLCAibmFtZSIsICJwYXJlbnRJZCIsICJzdGFydERhdGUiLCAibm93IiwgImluc2VydCIsICJzYXZlZFBvc3QiLCAiY29udGVudFRhZ05hbWVzIiwgInVzZXJUYWdzIiwgImNvbnRlbnRUYWdzIiwgInVwZGF0ZWRUYWdzIiwgInVwZGF0ZVBvc3QiLCAicGFyc2VkUG9zdCIsICJ1cGRhdGUiLCAidXBkYXRlZFBvc3QiLCAidXBkYXRlZFBvc3RJZCIsICJkZWxldGVQb3N0IiwgImZvcm1hdFBvc3RJZCIsICJlZGdlQXFsUXJ5IiwgImZpbGVBcWxRcnkiLCAiY3JlYXRlUG9zdEVkZ2UiLCAiaXRlbURvY0lkIiwgImVkZ2VUeXBlIiwgInByb3BzIiwgImVkZ2VDb2xsZWN0aW9uIiwgImZvcm1hdERvY0lkIiwgImVkZ2VJZCIsICJlZGdlIl0KfQo=
|