@beiguancyc/parse-server 9.9.0-ruixiang.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/LICENSE +176 -0
- package/NOTICE +10 -0
- package/README.md +1311 -0
- package/bin/parse-live-query-server +3 -0
- package/bin/parse-server +3 -0
- package/lib/AccountLockout.js +149 -0
- package/lib/Adapters/AdapterLoader.js +60 -0
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
- package/lib/Adapters/Auth/AuthAdapter.js +132 -0
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
- package/lib/Adapters/Auth/OAuth1Client.js +204 -0
- package/lib/Adapters/Auth/apple.js +125 -0
- package/lib/Adapters/Auth/facebook.js +187 -0
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +125 -0
- package/lib/Adapters/Auth/google.js +122 -0
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +41 -0
- package/lib/Adapters/Auth/index.js +248 -0
- package/lib/Adapters/Auth/instagram.js +118 -0
- package/lib/Adapters/Auth/janraincapture.js +85 -0
- package/lib/Adapters/Auth/janrainengage.js +57 -0
- package/lib/Adapters/Auth/keycloak.js +168 -0
- package/lib/Adapters/Auth/ldap.js +193 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +117 -0
- package/lib/Adapters/Auth/meetup.js +44 -0
- package/lib/Adapters/Auth/mfa.js +334 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +115 -0
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +113 -0
- package/lib/Adapters/Auth/spotify.js +115 -0
- package/lib/Adapters/Auth/twitter.js +197 -0
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +55 -0
- package/lib/Adapters/Auth/wechat.js +110 -0
- package/lib/Adapters/Auth/weibo.js +141 -0
- package/lib/Adapters/Cache/CacheAdapter.js +40 -0
- package/lib/Adapters/Cache/InMemoryCache.js +61 -0
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
- package/lib/Adapters/Cache/LRUCache.js +35 -0
- package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
- package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +32 -0
- package/lib/Adapters/Files/FilesAdapter.js +129 -0
- package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
- package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
- package/lib/Adapters/Logger/WinstonLogger.js +107 -0
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
- package/lib/Adapters/Push/PushAdapter.js +40 -0
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
- package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
- package/lib/Adapters/Storage/StorageAdapter.js +2 -0
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +687 -0
- package/lib/AuthDataLock.js +53 -0
- package/lib/ClientSDK.js +39 -0
- package/lib/Config.js +879 -0
- package/lib/Controllers/AdaptableController.js +72 -0
- package/lib/Controllers/AnalyticsController.js +43 -0
- package/lib/Controllers/CacheController.js +71 -0
- package/lib/Controllers/DatabaseController.js +1685 -0
- package/lib/Controllers/FilesController.js +122 -0
- package/lib/Controllers/HooksController.js +254 -0
- package/lib/Controllers/LiveQueryController.js +72 -0
- package/lib/Controllers/LoggerController.js +222 -0
- package/lib/Controllers/ParseGraphQLController.js +294 -0
- package/lib/Controllers/PushController.js +224 -0
- package/lib/Controllers/SchemaController.js +1563 -0
- package/lib/Controllers/UserController.js +364 -0
- package/lib/Controllers/index.js +251 -0
- package/lib/Controllers/types.js +2 -0
- package/lib/Deprecator/Deprecations.js +100 -0
- package/lib/Deprecator/Deprecator.js +140 -0
- package/lib/Error.js +50 -0
- package/lib/FileUrlValidator.js +69 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +241 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/helpers/queryComplexity.js +138 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1099 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +77 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +161 -0
- package/lib/GraphQL/loaders/schemaQueries.js +80 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +71 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +280 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/InstallationDedup.js +178 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +90 -0
- package/lib/LiveQuery/Id.js +20 -0
- package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
- package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
- package/lib/LiveQuery/ParsePubSub.js +37 -0
- package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
- package/lib/LiveQuery/QueryTools.js +443 -0
- package/lib/LiveQuery/RequestSchema.js +161 -0
- package/lib/LiveQuery/SessionTokenCache.js +51 -0
- package/lib/LiveQuery/Subscription.js +47 -0
- package/lib/LiveQuery/equalObjects.js +50 -0
- package/lib/Options/Definitions.js +1599 -0
- package/lib/Options/docs.js +389 -0
- package/lib/Options/index.js +12 -0
- package/lib/Options/parsers.js +89 -0
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +24 -0
- package/lib/ParseServer.js +632 -0
- package/lib/ParseServerRESTController.js +173 -0
- package/lib/PromiseRouter.js +208 -0
- package/lib/Push/PushQueue.js +67 -0
- package/lib/Push/PushWorker.js +101 -0
- package/lib/Push/utils.js +129 -0
- package/lib/RestQuery.js +1208 -0
- package/lib/RestWrite.js +1671 -0
- package/lib/Routers/AggregateRouter.js +150 -0
- package/lib/Routers/AnalyticsRouter.js +26 -0
- package/lib/Routers/AudiencesRouter.js +54 -0
- package/lib/Routers/ClassesRouter.js +191 -0
- package/lib/Routers/CloudCodeRouter.js +87 -0
- package/lib/Routers/FeaturesRouter.js +72 -0
- package/lib/Routers/FilesRouter.js +772 -0
- package/lib/Routers/FunctionsRouter.js +341 -0
- package/lib/Routers/GlobalConfigRouter.js +123 -0
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +121 -0
- package/lib/Routers/IAPValidationRouter.js +113 -0
- package/lib/Routers/InstallationsRouter.js +46 -0
- package/lib/Routers/LogsRouter.js +57 -0
- package/lib/Routers/PagesRouter.js +676 -0
- package/lib/Routers/PurgeRouter.js +45 -0
- package/lib/Routers/PushRouter.js +75 -0
- package/lib/Routers/RolesRouter.js +33 -0
- package/lib/Routers/SchemasRouter.js +118 -0
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +126 -0
- package/lib/Routers/UsersRouter.js +733 -0
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +160 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +34 -0
- package/lib/StatusHandler.js +329 -0
- package/lib/TestUtils.js +87 -0
- package/lib/Utils.js +577 -0
- package/lib/batch.js +185 -0
- package/lib/cache.js +12 -0
- package/lib/cli/definitions/parse-live-query-server.js +9 -0
- package/lib/cli/definitions/parse-server.js +9 -0
- package/lib/cli/parse-live-query-server.js +14 -0
- package/lib/cli/parse-server.js +101 -0
- package/lib/cli/utils/commander.js +132 -0
- package/lib/cli/utils/runner.js +53 -0
- package/lib/cloud-code/Parse.Cloud.js +797 -0
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +54 -0
- package/lib/defaults.js +58 -0
- package/lib/deprecated.js +12 -0
- package/lib/index.js +89 -0
- package/lib/logger.js +40 -0
- package/lib/middlewares.js +810 -0
- package/lib/password.js +40 -0
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +11 -0
- package/lib/rest.js +264 -0
- package/lib/triggers.js +949 -0
- package/lib/vendor/README.md +8 -0
- package/lib/vendor/mongodbUrl.js +1012 -0
- package/package.json +172 -0
- package/postinstall.js +38 -0
- package/public/custom_json.html +17 -0
- package/public/custom_json.json +23 -0
- package/public/custom_page.html +15 -0
- package/public/de/email_verification_link_expired.html +24 -0
- package/public/de/email_verification_link_invalid.html +21 -0
- package/public/de/email_verification_send_fail.html +21 -0
- package/public/de/email_verification_send_success.html +19 -0
- package/public/de/email_verification_success.html +18 -0
- package/public/de/password_reset.html +65 -0
- package/public/de/password_reset_link_invalid.html +19 -0
- package/public/de/password_reset_success.html +18 -0
- package/public/de-AT/email_verification_link_expired.html +24 -0
- package/public/de-AT/email_verification_link_invalid.html +21 -0
- package/public/de-AT/email_verification_send_fail.html +21 -0
- package/public/de-AT/email_verification_send_success.html +19 -0
- package/public/de-AT/email_verification_success.html +18 -0
- package/public/de-AT/password_reset.html +65 -0
- package/public/de-AT/password_reset_link_invalid.html +19 -0
- package/public/de-AT/password_reset_success.html +18 -0
- package/public/email_verification_link_expired.html +24 -0
- package/public/email_verification_link_invalid.html +21 -0
- package/public/email_verification_send_fail.html +21 -0
- package/public/email_verification_send_success.html +19 -0
- package/public/email_verification_success.html +18 -0
- package/public/password_reset.html +65 -0
- package/public/password_reset_link_invalid.html +19 -0
- package/public/password_reset_success.html +18 -0
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +320 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/views/choose_password +215 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.load = void 0;
|
|
7
|
+
var _graphql = require("graphql");
|
|
8
|
+
var _graphqlRelay = require("graphql-relay");
|
|
9
|
+
var _graphqlListFields = _interopRequireDefault(require("graphql-list-fields"));
|
|
10
|
+
var _pluralize = _interopRequireDefault(require("pluralize"));
|
|
11
|
+
var defaultGraphQLTypes = _interopRequireWildcard(require("./defaultGraphQLTypes"));
|
|
12
|
+
var objectsQueries = _interopRequireWildcard(require("../helpers/objectsQueries"));
|
|
13
|
+
var _ParseGraphQLController = require("../../Controllers/ParseGraphQLController");
|
|
14
|
+
var _className = require("../transformers/className");
|
|
15
|
+
var _parseGraphQLUtils = require("../parseGraphQLUtils");
|
|
16
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
17
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
|
+
const getParseClassQueryConfig = function (parseClassConfig) {
|
|
19
|
+
return parseClassConfig && parseClassConfig.query || {};
|
|
20
|
+
};
|
|
21
|
+
const getQuery = async (parseClass, _source, args, context, queryInfo, parseClasses) => {
|
|
22
|
+
let {
|
|
23
|
+
id
|
|
24
|
+
} = args;
|
|
25
|
+
const {
|
|
26
|
+
options
|
|
27
|
+
} = args;
|
|
28
|
+
const {
|
|
29
|
+
readPreference,
|
|
30
|
+
includeReadPreference
|
|
31
|
+
} = options || {};
|
|
32
|
+
const {
|
|
33
|
+
config,
|
|
34
|
+
auth,
|
|
35
|
+
info
|
|
36
|
+
} = context;
|
|
37
|
+
const selectedFields = (0, _graphqlListFields.default)(queryInfo);
|
|
38
|
+
const globalIdObject = (0, _graphqlRelay.fromGlobalId)(id);
|
|
39
|
+
if (globalIdObject.type === parseClass.className) {
|
|
40
|
+
id = globalIdObject.id;
|
|
41
|
+
}
|
|
42
|
+
const {
|
|
43
|
+
keys,
|
|
44
|
+
include
|
|
45
|
+
} = (0, _parseGraphQLUtils.extractKeysAndInclude)(selectedFields);
|
|
46
|
+
return await objectsQueries.getObject(parseClass.className, id, keys, include, readPreference, includeReadPreference, config, auth, info, parseClasses);
|
|
47
|
+
};
|
|
48
|
+
const load = function (parseGraphQLSchema, parseClass, parseClassConfig) {
|
|
49
|
+
const className = parseClass.className;
|
|
50
|
+
const graphQLClassName = (0, _className.transformClassNameToGraphQL)(className);
|
|
51
|
+
const {
|
|
52
|
+
get: isGetEnabled = true,
|
|
53
|
+
find: isFindEnabled = true,
|
|
54
|
+
getAlias = '',
|
|
55
|
+
findAlias = ''
|
|
56
|
+
} = getParseClassQueryConfig(parseClassConfig);
|
|
57
|
+
const {
|
|
58
|
+
classGraphQLOutputType,
|
|
59
|
+
classGraphQLFindArgs,
|
|
60
|
+
classGraphQLFindResultType
|
|
61
|
+
} = parseGraphQLSchema.parseClassTypes[className];
|
|
62
|
+
if (isGetEnabled) {
|
|
63
|
+
const lowerCaseClassName = graphQLClassName.charAt(0).toLowerCase() + graphQLClassName.slice(1);
|
|
64
|
+
const getGraphQLQueryName = getAlias || lowerCaseClassName;
|
|
65
|
+
parseGraphQLSchema.addGraphQLQuery(getGraphQLQueryName, {
|
|
66
|
+
description: `The ${getGraphQLQueryName} query can be used to get an object of the ${graphQLClassName} class by its id.`,
|
|
67
|
+
args: {
|
|
68
|
+
id: defaultGraphQLTypes.GLOBAL_OR_OBJECT_ID_ATT,
|
|
69
|
+
options: defaultGraphQLTypes.READ_OPTIONS_ATT
|
|
70
|
+
},
|
|
71
|
+
type: new _graphql.GraphQLNonNull(classGraphQLOutputType || defaultGraphQLTypes.OBJECT),
|
|
72
|
+
async resolve(_source, args, context, queryInfo) {
|
|
73
|
+
try {
|
|
74
|
+
return await getQuery(parseClass, _source, (0, _parseGraphQLUtils.cloneArgs)(args), context, queryInfo, parseGraphQLSchema.parseClasses);
|
|
75
|
+
} catch (e) {
|
|
76
|
+
parseGraphQLSchema.handleError(e);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
if (isFindEnabled) {
|
|
82
|
+
const lowerCaseClassName = graphQLClassName.charAt(0).toLowerCase() + graphQLClassName.slice(1);
|
|
83
|
+
const findGraphQLQueryName = findAlias || (0, _pluralize.default)(lowerCaseClassName);
|
|
84
|
+
parseGraphQLSchema.addGraphQLQuery(findGraphQLQueryName, {
|
|
85
|
+
description: `The ${findGraphQLQueryName} query can be used to find objects of the ${graphQLClassName} class.`,
|
|
86
|
+
args: classGraphQLFindArgs,
|
|
87
|
+
type: new _graphql.GraphQLNonNull(classGraphQLFindResultType || defaultGraphQLTypes.OBJECT),
|
|
88
|
+
async resolve(_source, args, context, queryInfo) {
|
|
89
|
+
try {
|
|
90
|
+
// Deep copy args to avoid internal re assign issue
|
|
91
|
+
const {
|
|
92
|
+
where,
|
|
93
|
+
order,
|
|
94
|
+
skip,
|
|
95
|
+
first,
|
|
96
|
+
after,
|
|
97
|
+
last,
|
|
98
|
+
before,
|
|
99
|
+
options
|
|
100
|
+
} = (0, _parseGraphQLUtils.cloneArgs)(args);
|
|
101
|
+
const {
|
|
102
|
+
readPreference,
|
|
103
|
+
includeReadPreference,
|
|
104
|
+
subqueryReadPreference
|
|
105
|
+
} = options || {};
|
|
106
|
+
const {
|
|
107
|
+
config,
|
|
108
|
+
auth,
|
|
109
|
+
info
|
|
110
|
+
} = context;
|
|
111
|
+
const selectedFields = (0, _graphqlListFields.default)(queryInfo);
|
|
112
|
+
const {
|
|
113
|
+
keys,
|
|
114
|
+
include
|
|
115
|
+
} = (0, _parseGraphQLUtils.extractKeysAndInclude)(selectedFields.filter(field => field.startsWith('edges.node.')).map(field => field.replace('edges.node.', '')).filter(field => field.indexOf('edges.node') < 0));
|
|
116
|
+
const parseOrder = order && order.join(',');
|
|
117
|
+
return await objectsQueries.findObjects(className, where, parseOrder, skip, first, after, last, before, keys, include, false, readPreference, includeReadPreference, subqueryReadPreference, config, auth, info, selectedFields, parseGraphQLSchema.parseClasses);
|
|
118
|
+
} catch (e) {
|
|
119
|
+
parseGraphQLSchema.handleError(e);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
exports.load = load;
|
|
126
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ3JhcGhxbCIsInJlcXVpcmUiLCJfZ3JhcGhxbFJlbGF5IiwiX2dyYXBocWxMaXN0RmllbGRzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9wbHVyYWxpemUiLCJkZWZhdWx0R3JhcGhRTFR5cGVzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJvYmplY3RzUXVlcmllcyIsIl9QYXJzZUdyYXBoUUxDb250cm9sbGVyIiwiX2NsYXNzTmFtZSIsIl9wYXJzZUdyYXBoUUxVdGlscyIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldFBhcnNlQ2xhc3NRdWVyeUNvbmZpZyIsInBhcnNlQ2xhc3NDb25maWciLCJxdWVyeSIsImdldFF1ZXJ5IiwicGFyc2VDbGFzcyIsIl9zb3VyY2UiLCJhcmdzIiwiY29udGV4dCIsInF1ZXJ5SW5mbyIsInBhcnNlQ2xhc3NlcyIsImlkIiwib3B0aW9ucyIsInJlYWRQcmVmZXJlbmNlIiwiaW5jbHVkZVJlYWRQcmVmZXJlbmNlIiwiY29uZmlnIiwiYXV0aCIsImluZm8iLCJzZWxlY3RlZEZpZWxkcyIsImdldEZpZWxkTmFtZXMiLCJnbG9iYWxJZE9iamVjdCIsImZyb21HbG9iYWxJZCIsInR5cGUiLCJjbGFzc05hbWUiLCJrZXlzIiwiaW5jbHVkZSIsImV4dHJhY3RLZXlzQW5kSW5jbHVkZSIsImdldE9iamVjdCIsImxvYWQiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJncmFwaFFMQ2xhc3NOYW1lIiwidHJhbnNmb3JtQ2xhc3NOYW1lVG9HcmFwaFFMIiwiaXNHZXRFbmFibGVkIiwiZmluZCIsImlzRmluZEVuYWJsZWQiLCJnZXRBbGlhcyIsImZpbmRBbGlhcyIsImNsYXNzR3JhcGhRTE91dHB1dFR5cGUiLCJjbGFzc0dyYXBoUUxGaW5kQXJncyIsImNsYXNzR3JhcGhRTEZpbmRSZXN1bHRUeXBlIiwicGFyc2VDbGFzc1R5cGVzIiwibG93ZXJDYXNlQ2xhc3NOYW1lIiwiY2hhckF0IiwidG9Mb3dlckNhc2UiLCJzbGljZSIsImdldEdyYXBoUUxRdWVyeU5hbWUiLCJhZGRHcmFwaFFMUXVlcnkiLCJkZXNjcmlwdGlvbiIsIkdMT0JBTF9PUl9PQkpFQ1RfSURfQVRUIiwiUkVBRF9PUFRJT05TX0FUVCIsIkdyYXBoUUxOb25OdWxsIiwiT0JKRUNUIiwicmVzb2x2ZSIsImNsb25lQXJncyIsImhhbmRsZUVycm9yIiwiZmluZEdyYXBoUUxRdWVyeU5hbWUiLCJwbHVyYWxpemUiLCJ3aGVyZSIsIm9yZGVyIiwic2tpcCIsImZpcnN0IiwiYWZ0ZXIiLCJsYXN0IiwiYmVmb3JlIiwic3VicXVlcnlSZWFkUHJlZmVyZW5jZSIsImZpbHRlciIsImZpZWxkIiwic3RhcnRzV2l0aCIsIm1hcCIsInJlcGxhY2UiLCJpbmRleE9mIiwicGFyc2VPcmRlciIsImpvaW4iLCJmaW5kT2JqZWN0cyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvR3JhcGhRTC9sb2FkZXJzL3BhcnNlQ2xhc3NRdWVyaWVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyYXBoUUxOb25OdWxsIH0gZnJvbSAnZ3JhcGhxbCc7XG5pbXBvcnQgeyBmcm9tR2xvYmFsSWQgfSBmcm9tICdncmFwaHFsLXJlbGF5JztcbmltcG9ydCBnZXRGaWVsZE5hbWVzIGZyb20gJ2dyYXBocWwtbGlzdC1maWVsZHMnO1xuXG5pbXBvcnQgcGx1cmFsaXplIGZyb20gJ3BsdXJhbGl6ZSc7XG5pbXBvcnQgKiBhcyBkZWZhdWx0R3JhcGhRTFR5cGVzIGZyb20gJy4vZGVmYXVsdEdyYXBoUUxUeXBlcyc7XG5pbXBvcnQgKiBhcyBvYmplY3RzUXVlcmllcyBmcm9tICcuLi9oZWxwZXJzL29iamVjdHNRdWVyaWVzJztcbmltcG9ydCB7IFBhcnNlR3JhcGhRTENsYXNzQ29uZmlnIH0gZnJvbSAnLi4vLi4vQ29udHJvbGxlcnMvUGFyc2VHcmFwaFFMQ29udHJvbGxlcic7XG5pbXBvcnQgeyB0cmFuc2Zvcm1DbGFzc05hbWVUb0dyYXBoUUwgfSBmcm9tICcuLi90cmFuc2Zvcm1lcnMvY2xhc3NOYW1lJztcbmltcG9ydCB7IGV4dHJhY3RLZXlzQW5kSW5jbHVkZSwgY2xvbmVBcmdzIH0gZnJvbSAnLi4vcGFyc2VHcmFwaFFMVXRpbHMnO1xuXG5jb25zdCBnZXRQYXJzZUNsYXNzUXVlcnlDb25maWcgPSBmdW5jdGlvbiAocGFyc2VDbGFzc0NvbmZpZzogP1BhcnNlR3JhcGhRTENsYXNzQ29uZmlnKSB7XG4gIHJldHVybiAocGFyc2VDbGFzc0NvbmZpZyAmJiBwYXJzZUNsYXNzQ29uZmlnLnF1ZXJ5KSB8fCB7fTtcbn07XG5cbmNvbnN0IGdldFF1ZXJ5ID0gYXN5bmMgKHBhcnNlQ2xhc3MsIF9zb3VyY2UsIGFyZ3MsIGNvbnRleHQsIHF1ZXJ5SW5mbywgcGFyc2VDbGFzc2VzKSA9PiB7XG4gIGxldCB7IGlkIH0gPSBhcmdzO1xuICBjb25zdCB7IG9wdGlvbnMgfSA9IGFyZ3M7XG4gIGNvbnN0IHsgcmVhZFByZWZlcmVuY2UsIGluY2x1ZGVSZWFkUHJlZmVyZW5jZSB9ID0gb3B0aW9ucyB8fCB7fTtcbiAgY29uc3QgeyBjb25maWcsIGF1dGgsIGluZm8gfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHNlbGVjdGVkRmllbGRzID0gZ2V0RmllbGROYW1lcyhxdWVyeUluZm8pO1xuXG4gIGNvbnN0IGdsb2JhbElkT2JqZWN0ID0gZnJvbUdsb2JhbElkKGlkKTtcblxuICBpZiAoZ2xvYmFsSWRPYmplY3QudHlwZSA9PT0gcGFyc2VDbGFzcy5jbGFzc05hbWUpIHtcbiAgICBpZCA9IGdsb2JhbElkT2JqZWN0LmlkO1xuICB9XG5cbiAgY29uc3QgeyBrZXlzLCBpbmNsdWRlIH0gPSBleHRyYWN0S2V5c0FuZEluY2x1ZGUoc2VsZWN0ZWRGaWVsZHMpO1xuXG4gIHJldHVybiBhd2FpdCBvYmplY3RzUXVlcmllcy5nZXRPYmplY3QoXG4gICAgcGFyc2VDbGFzcy5jbGFzc05hbWUsXG4gICAgaWQsXG4gICAga2V5cyxcbiAgICBpbmNsdWRlLFxuICAgIHJlYWRQcmVmZXJlbmNlLFxuICAgIGluY2x1ZGVSZWFkUHJlZmVyZW5jZSxcbiAgICBjb25maWcsXG4gICAgYXV0aCxcbiAgICBpbmZvLFxuICAgIHBhcnNlQ2xhc3Nlc1xuICApO1xufTtcblxuY29uc3QgbG9hZCA9IGZ1bmN0aW9uIChwYXJzZUdyYXBoUUxTY2hlbWEsIHBhcnNlQ2xhc3MsIHBhcnNlQ2xhc3NDb25maWc6ID9QYXJzZUdyYXBoUUxDbGFzc0NvbmZpZykge1xuICBjb25zdCBjbGFzc05hbWUgPSBwYXJzZUNsYXNzLmNsYXNzTmFtZTtcbiAgY29uc3QgZ3JhcGhRTENsYXNzTmFtZSA9IHRyYW5zZm9ybUNsYXNzTmFtZVRvR3JhcGhRTChjbGFzc05hbWUpO1xuICBjb25zdCB7XG4gICAgZ2V0OiBpc0dldEVuYWJsZWQgPSB0cnVlLFxuICAgIGZpbmQ6IGlzRmluZEVuYWJsZWQgPSB0cnVlLFxuICAgIGdldEFsaWFzOiBnZXRBbGlhcyA9ICcnLFxuICAgIGZpbmRBbGlhczogZmluZEFsaWFzID0gJycsXG4gIH0gPSBnZXRQYXJzZUNsYXNzUXVlcnlDb25maWcocGFyc2VDbGFzc0NvbmZpZyk7XG5cbiAgY29uc3Qge1xuICAgIGNsYXNzR3JhcGhRTE91dHB1dFR5cGUsXG4gICAgY2xhc3NHcmFwaFFMRmluZEFyZ3MsXG4gICAgY2xhc3NHcmFwaFFMRmluZFJlc3VsdFR5cGUsXG4gIH0gPSBwYXJzZUdyYXBoUUxTY2hlbWEucGFyc2VDbGFzc1R5cGVzW2NsYXNzTmFtZV07XG5cbiAgaWYgKGlzR2V0RW5hYmxlZCkge1xuICAgIGNvbnN0IGxvd2VyQ2FzZUNsYXNzTmFtZSA9IGdyYXBoUUxDbGFzc05hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBncmFwaFFMQ2xhc3NOYW1lLnNsaWNlKDEpO1xuXG4gICAgY29uc3QgZ2V0R3JhcGhRTFF1ZXJ5TmFtZSA9IGdldEFsaWFzIHx8IGxvd2VyQ2FzZUNsYXNzTmFtZTtcblxuICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMUXVlcnkoZ2V0R3JhcGhRTFF1ZXJ5TmFtZSwge1xuICAgICAgZGVzY3JpcHRpb246IGBUaGUgJHtnZXRHcmFwaFFMUXVlcnlOYW1lfSBxdWVyeSBjYW4gYmUgdXNlZCB0byBnZXQgYW4gb2JqZWN0IG9mIHRoZSAke2dyYXBoUUxDbGFzc05hbWV9IGNsYXNzIGJ5IGl0cyBpZC5gLFxuICAgICAgYXJnczoge1xuICAgICAgICBpZDogZGVmYXVsdEdyYXBoUUxUeXBlcy5HTE9CQUxfT1JfT0JKRUNUX0lEX0FUVCxcbiAgICAgICAgb3B0aW9uczogZGVmYXVsdEdyYXBoUUxUeXBlcy5SRUFEX09QVElPTlNfQVRULFxuICAgICAgfSxcbiAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChjbGFzc0dyYXBoUUxPdXRwdXRUeXBlIHx8IGRlZmF1bHRHcmFwaFFMVHlwZXMuT0JKRUNUKSxcbiAgICAgIGFzeW5jIHJlc29sdmUoX3NvdXJjZSwgYXJncywgY29udGV4dCwgcXVlcnlJbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGdldFF1ZXJ5KFxuICAgICAgICAgICAgcGFyc2VDbGFzcyxcbiAgICAgICAgICAgIF9zb3VyY2UsXG4gICAgICAgICAgICBjbG9uZUFyZ3MoYXJncyksXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgcXVlcnlJbmZvLFxuICAgICAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLnBhcnNlQ2xhc3Nlc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEuaGFuZGxlRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNGaW5kRW5hYmxlZCkge1xuICAgIGNvbnN0IGxvd2VyQ2FzZUNsYXNzTmFtZSA9IGdyYXBoUUxDbGFzc05hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBncmFwaFFMQ2xhc3NOYW1lLnNsaWNlKDEpO1xuXG4gICAgY29uc3QgZmluZEdyYXBoUUxRdWVyeU5hbWUgPSBmaW5kQWxpYXMgfHwgcGx1cmFsaXplKGxvd2VyQ2FzZUNsYXNzTmFtZSk7XG5cbiAgICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFF1ZXJ5KGZpbmRHcmFwaFFMUXVlcnlOYW1lLCB7XG4gICAgICBkZXNjcmlwdGlvbjogYFRoZSAke2ZpbmRHcmFwaFFMUXVlcnlOYW1lfSBxdWVyeSBjYW4gYmUgdXNlZCB0byBmaW5kIG9iamVjdHMgb2YgdGhlICR7Z3JhcGhRTENsYXNzTmFtZX0gY2xhc3MuYCxcbiAgICAgIGFyZ3M6IGNsYXNzR3JhcGhRTEZpbmRBcmdzLFxuICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKGNsYXNzR3JhcGhRTEZpbmRSZXN1bHRUeXBlIHx8IGRlZmF1bHRHcmFwaFFMVHlwZXMuT0JKRUNUKSxcbiAgICAgIGFzeW5jIHJlc29sdmUoX3NvdXJjZSwgYXJncywgY29udGV4dCwgcXVlcnlJbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGVlcCBjb3B5IGFyZ3MgdG8gYXZvaWQgaW50ZXJuYWwgcmUgYXNzaWduIGlzc3VlXG4gICAgICAgICAgY29uc3QgeyB3aGVyZSwgb3JkZXIsIHNraXAsIGZpcnN0LCBhZnRlciwgbGFzdCwgYmVmb3JlLCBvcHRpb25zIH0gPSBjbG9uZUFyZ3MoYXJncyk7XG4gICAgICAgICAgY29uc3QgeyByZWFkUHJlZmVyZW5jZSwgaW5jbHVkZVJlYWRQcmVmZXJlbmNlLCBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIH0gPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgIGNvbnN0IHsgY29uZmlnLCBhdXRoLCBpbmZvIH0gPSBjb250ZXh0O1xuICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRmllbGRzID0gZ2V0RmllbGROYW1lcyhxdWVyeUluZm8pO1xuXG4gICAgICAgICAgY29uc3QgeyBrZXlzLCBpbmNsdWRlIH0gPSBleHRyYWN0S2V5c0FuZEluY2x1ZGUoXG4gICAgICAgICAgICBzZWxlY3RlZEZpZWxkc1xuICAgICAgICAgICAgICAuZmlsdGVyKGZpZWxkID0+IGZpZWxkLnN0YXJ0c1dpdGgoJ2VkZ2VzLm5vZGUuJykpXG4gICAgICAgICAgICAgIC5tYXAoZmllbGQgPT4gZmllbGQucmVwbGFjZSgnZWRnZXMubm9kZS4nLCAnJykpXG4gICAgICAgICAgICAgIC5maWx0ZXIoZmllbGQgPT4gZmllbGQuaW5kZXhPZignZWRnZXMubm9kZScpIDwgMClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHBhcnNlT3JkZXIgPSBvcmRlciAmJiBvcmRlci5qb2luKCcsJyk7XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgb2JqZWN0c1F1ZXJpZXMuZmluZE9iamVjdHMoXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICAgIHBhcnNlT3JkZXIsXG4gICAgICAgICAgICBza2lwLFxuICAgICAgICAgICAgZmlyc3QsXG4gICAgICAgICAgICBhZnRlcixcbiAgICAgICAgICAgIGxhc3QsXG4gICAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgaW5jbHVkZSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgcmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgICBpbmNsdWRlUmVhZFByZWZlcmVuY2UsXG4gICAgICAgICAgICBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlLFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICBzZWxlY3RlZEZpZWxkcyxcbiAgICAgICAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5wYXJzZUNsYXNzZXNcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLmhhbmRsZUVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59O1xuXG5leHBvcnQgeyBsb2FkIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLFFBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLGFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGtCQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFFQSxJQUFBSSxVQUFBLEdBQUFELHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSyxtQkFBQSxHQUFBQyx1QkFBQSxDQUFBTixPQUFBO0FBQ0EsSUFBQU8sY0FBQSxHQUFBRCx1QkFBQSxDQUFBTixPQUFBO0FBQ0EsSUFBQVEsdUJBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLFVBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLGtCQUFBLEdBQUFWLE9BQUE7QUFBd0UsU0FBQU0sd0JBQUFLLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFQLHVCQUFBLFlBQUFBLENBQUFLLENBQUEsRUFBQUMsQ0FBQSxTQUFBQSxDQUFBLElBQUFELENBQUEsSUFBQUEsQ0FBQSxDQUFBSyxVQUFBLFNBQUFMLENBQUEsTUFBQU0sQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsS0FBQUMsU0FBQSxRQUFBQyxPQUFBLEVBQUFWLENBQUEsaUJBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsU0FBQVEsQ0FBQSxNQUFBRixDQUFBLEdBQUFMLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLFFBQUFHLENBQUEsQ0FBQUssR0FBQSxDQUFBWCxDQUFBLFVBQUFNLENBQUEsQ0FBQU0sR0FBQSxDQUFBWixDQUFBLEdBQUFN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
|