parse-server 4.10.4 → 5.0.0-alpha.12

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.
Files changed (134) hide show
  1. package/README.md +461 -157
  2. package/lib/AccountLockout.js +23 -2
  3. package/lib/Adapters/AdapterLoader.js +1 -1
  4. package/lib/Adapters/Analytics/AnalyticsAdapter.js +1 -1
  5. package/lib/Adapters/Auth/AuthAdapter.js +1 -1
  6. package/lib/Adapters/Auth/OAuth1Client.js +1 -1
  7. package/lib/Adapters/Auth/facebook.js +110 -10
  8. package/lib/Adapters/Auth/gcenter.js +1 -1
  9. package/lib/Adapters/Auth/gpgames.js +1 -1
  10. package/lib/Adapters/Auth/instagram.js +4 -2
  11. package/lib/Adapters/Auth/keycloak.js +1 -1
  12. package/lib/Adapters/Auth/ldap.js +3 -1
  13. package/lib/Adapters/Auth/oauth2.js +1 -1
  14. package/lib/Adapters/Auth/phantauth.js +1 -1
  15. package/lib/Adapters/Cache/CacheAdapter.js +1 -1
  16. package/lib/Adapters/Cache/RedisCacheAdapter.js +143 -0
  17. package/lib/Adapters/Cache/SchemaCache.js +31 -0
  18. package/lib/Adapters/Email/MailAdapter.js +1 -1
  19. package/lib/Adapters/Files/FilesAdapter.js +1 -1
  20. package/lib/Adapters/Files/GridFSBucketAdapter.js +1 -1
  21. package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
  22. package/lib/Adapters/Logger/LoggerAdapter.js +1 -1
  23. package/lib/Adapters/Logger/WinstonLogger.js +4 -4
  24. package/lib/Adapters/PubSub/EventEmitterPubSub.js +5 -1
  25. package/lib/Adapters/PubSub/PubSubAdapter.js +1 -1
  26. package/lib/Adapters/Push/PushAdapter.js +1 -1
  27. package/lib/Adapters/Storage/Mongo/MongoCollection.js +1 -1
  28. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +21 -3
  29. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +43 -11
  30. package/lib/Adapters/Storage/Mongo/MongoTransform.js +9 -6
  31. package/lib/Adapters/Storage/Postgres/PostgresClient.js +11 -1
  32. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +107 -62
  33. package/lib/Adapters/WebSocketServer/WSAdapter.js +1 -1
  34. package/lib/Adapters/WebSocketServer/WSSAdapter.js +1 -1
  35. package/lib/Auth.js +2 -39
  36. package/lib/Config.js +201 -8
  37. package/lib/Controllers/AdaptableController.js +1 -9
  38. package/lib/Controllers/CacheController.js +1 -1
  39. package/lib/Controllers/DatabaseController.js +166 -45
  40. package/lib/Controllers/FilesController.js +1 -1
  41. package/lib/Controllers/HooksController.js +2 -2
  42. package/lib/Controllers/LiveQueryController.js +16 -3
  43. package/lib/Controllers/LoggerController.js +1 -1
  44. package/lib/Controllers/ParseGraphQLController.js +2 -2
  45. package/lib/Controllers/PushController.js +1 -1
  46. package/lib/Controllers/SchemaController.js +114 -93
  47. package/lib/Controllers/UserController.js +16 -5
  48. package/lib/Controllers/index.js +10 -11
  49. package/lib/Deprecator/Deprecations.js +28 -0
  50. package/lib/Deprecator/Deprecator.js +135 -0
  51. package/lib/GraphQL/ParseGraphQLSchema.js +71 -39
  52. package/lib/GraphQL/ParseGraphQLServer.js +3 -3
  53. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +2 -2
  54. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +2 -2
  55. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +4 -7
  56. package/lib/GraphQL/loaders/defaultRelaySchema.js +3 -3
  57. package/lib/GraphQL/loaders/filesMutations.js +2 -2
  58. package/lib/GraphQL/loaders/functionsMutations.js +9 -5
  59. package/lib/GraphQL/loaders/parseClassMutations.js +21 -9
  60. package/lib/GraphQL/loaders/parseClassQueries.js +9 -6
  61. package/lib/GraphQL/loaders/parseClassTypes.js +5 -5
  62. package/lib/GraphQL/loaders/schemaDirectives.js +1 -1
  63. package/lib/GraphQL/loaders/schemaMutations.js +8 -6
  64. package/lib/GraphQL/loaders/schemaQueries.js +6 -4
  65. package/lib/GraphQL/loaders/usersMutations.js +65 -7
  66. package/lib/GraphQL/transformers/constraintType.js +2 -2
  67. package/lib/GraphQL/transformers/inputType.js +2 -2
  68. package/lib/GraphQL/transformers/mutation.js +45 -10
  69. package/lib/GraphQL/transformers/outputType.js +2 -2
  70. package/lib/GraphQL/transformers/query.js +2 -2
  71. package/lib/GraphQL/transformers/schemaFields.js +1 -1
  72. package/lib/KeyPromiseQueue.js +59 -0
  73. package/lib/LiveQuery/Client.js +1 -1
  74. package/lib/LiveQuery/Id.js +1 -1
  75. package/lib/LiveQuery/ParseLiveQueryServer.js +144 -38
  76. package/lib/LiveQuery/ParseWebSocketServer.js +2 -2
  77. package/lib/LiveQuery/QueryTools.js +50 -1
  78. package/lib/LiveQuery/equalObjects.js +1 -1
  79. package/lib/Options/Definitions.js +256 -33
  80. package/lib/Options/docs.js +79 -21
  81. package/lib/Options/index.js +3 -1
  82. package/lib/Page.js +53 -0
  83. package/lib/ParseServer.js +40 -16
  84. package/lib/ParseServerRESTController.js +55 -45
  85. package/lib/PromiseRouter.js +7 -20
  86. package/lib/Push/PushQueue.js +1 -1
  87. package/lib/Push/PushWorker.js +2 -2
  88. package/lib/Push/utils.js +1 -1
  89. package/lib/RestQuery.js +44 -8
  90. package/lib/RestWrite.js +60 -10
  91. package/lib/Routers/AggregateRouter.js +23 -18
  92. package/lib/Routers/AudiencesRouter.js +2 -2
  93. package/lib/Routers/ClassesRouter.js +11 -11
  94. package/lib/Routers/CloudCodeRouter.js +1 -1
  95. package/lib/Routers/FeaturesRouter.js +2 -2
  96. package/lib/Routers/FilesRouter.js +34 -7
  97. package/lib/Routers/FunctionsRouter.js +2 -2
  98. package/lib/Routers/GlobalConfigRouter.js +2 -2
  99. package/lib/Routers/GraphQLRouter.js +3 -3
  100. package/lib/Routers/HooksRouter.js +2 -2
  101. package/lib/Routers/LogsRouter.js +2 -2
  102. package/lib/Routers/PagesRouter.js +722 -0
  103. package/lib/Routers/PurgeRouter.js +2 -2
  104. package/lib/Routers/PushRouter.js +3 -3
  105. package/lib/Routers/SchemasRouter.js +43 -16
  106. package/lib/Routers/SecurityRouter.js +47 -0
  107. package/lib/Routers/SessionsRouter.js +4 -2
  108. package/lib/Routers/UsersRouter.js +88 -17
  109. package/lib/SchemaMigrations/DefinedSchemas.js +421 -0
  110. package/lib/SchemaMigrations/Migrations.js +36 -0
  111. package/lib/Security/Check.js +118 -0
  112. package/lib/Security/CheckGroup.js +54 -0
  113. package/lib/Security/CheckGroups/CheckGroupDatabase.js +57 -0
  114. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +82 -0
  115. package/lib/Security/CheckGroups/CheckGroups.js +24 -0
  116. package/lib/Security/CheckRunner.js +236 -0
  117. package/lib/StatusHandler.js +27 -36
  118. package/lib/TestUtils.js +1 -1
  119. package/lib/Utils.js +226 -0
  120. package/lib/batch.js +55 -44
  121. package/lib/cli/utils/commander.js +8 -3
  122. package/lib/cloud-code/HTTPResponse.js +1 -1
  123. package/lib/cloud-code/Parse.Cloud.js +155 -19
  124. package/lib/cloud-code/httpRequest.js +1 -1
  125. package/lib/index.js +10 -12
  126. package/lib/middlewares.js +39 -4
  127. package/lib/rest.js +4 -4
  128. package/lib/triggers.js +134 -121
  129. package/lib/vendor/mongodbUrl.js +8 -10
  130. package/package.json +60 -39
  131. package/CHANGELOG.md +0 -1780
  132. package/lib/Adapters/Cache/RedisCacheAdapter/KeyPromiseQueue.js +0 -59
  133. package/lib/Adapters/Cache/RedisCacheAdapter/index.js +0 -130
  134. package/lib/Controllers/SchemaCache.js +0 -75
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DefinedSchemas = void 0;
7
+
8
+ var _logger = require("../logger");
9
+
10
+ var _Config = _interopRequireDefault(require("../Config"));
11
+
12
+ var _SchemasRouter = require("../Routers/SchemasRouter");
13
+
14
+ var _SchemaController = require("../Controllers/SchemaController");
15
+
16
+ var _Options = require("../Options");
17
+
18
+ var Migrations = _interopRequireWildcard(require("./Migrations"));
19
+
20
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
21
+
22
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
23
+
24
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
+
26
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
27
+
28
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
29
+
30
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
31
+
32
+ // -disable-next Cannot resolve module `parse/node`.
33
+ const Parse = require('parse/node');
34
+
35
+ class DefinedSchemas {
36
+ constructor(schemaOptions, config) {
37
+ this.localSchemas = [];
38
+ this.config = _Config.default.get(config.appId);
39
+ this.schemaOptions = schemaOptions;
40
+
41
+ if (schemaOptions && schemaOptions.definitions) {
42
+ if (!Array.isArray(schemaOptions.definitions)) {
43
+ throw `"schema.definitions" must be an array of schemas`;
44
+ }
45
+
46
+ this.localSchemas = schemaOptions.definitions;
47
+ }
48
+
49
+ this.retries = 0;
50
+ this.maxRetries = 3;
51
+ }
52
+
53
+ async saveSchemaToDB(schema) {
54
+ const payload = {
55
+ className: schema.className,
56
+ fields: schema._fields,
57
+ indexes: schema._indexes,
58
+ classLevelPermissions: schema._clp
59
+ };
60
+ await (0, _SchemasRouter.internalCreateSchema)(schema.className, payload, this.config);
61
+ this.resetSchemaOps(schema);
62
+ }
63
+
64
+ resetSchemaOps(schema) {
65
+ // Reset ops like SDK
66
+ schema._fields = {};
67
+ schema._indexes = {};
68
+ } // Simulate update like the SDK
69
+ // We cannot use SDK since routes are disabled
70
+
71
+
72
+ async updateSchemaToDB(schema) {
73
+ const payload = {
74
+ className: schema.className,
75
+ fields: schema._fields,
76
+ indexes: schema._indexes,
77
+ classLevelPermissions: schema._clp
78
+ };
79
+ await (0, _SchemasRouter.internalUpdateSchema)(schema.className, payload, this.config);
80
+ this.resetSchemaOps(schema);
81
+ }
82
+
83
+ async execute() {
84
+ try {
85
+ _logger.logger.info('Running Migrations');
86
+
87
+ if (this.schemaOptions && this.schemaOptions.beforeMigration) {
88
+ await Promise.resolve(this.schemaOptions.beforeMigration());
89
+ }
90
+
91
+ await this.executeMigrations();
92
+
93
+ if (this.schemaOptions && this.schemaOptions.afterMigration) {
94
+ await Promise.resolve(this.schemaOptions.afterMigration());
95
+ }
96
+
97
+ _logger.logger.info('Running Migrations Completed');
98
+ } catch (e) {
99
+ _logger.logger.error(`Failed to run migrations: ${e}`);
100
+
101
+ if (process.env.NODE_ENV === 'production') process.exit(1);
102
+ }
103
+ }
104
+
105
+ async executeMigrations() {
106
+ let timeout = null;
107
+
108
+ try {
109
+ // Set up a time out in production
110
+ // if we fail to get schema
111
+ // pm2 or K8s and many other process managers will try to restart the process
112
+ // after the exit
113
+ if (process.env.NODE_ENV === 'production') {
114
+ timeout = setTimeout(() => {
115
+ _logger.logger.error('Timeout occurred during execution of migrations. Exiting...');
116
+
117
+ process.exit(1);
118
+ }, 20000);
119
+ } // Hack to force session schema to be created
120
+
121
+
122
+ await this.createDeleteSession();
123
+ this.allCloudSchemas = await Parse.Schema.all();
124
+ clearTimeout(timeout);
125
+ await Promise.all(this.localSchemas.map(async localSchema => this.saveOrUpdate(localSchema)));
126
+ this.checkForMissingSchemas();
127
+ await this.enforceCLPForNonProvidedClass();
128
+ } catch (e) {
129
+ if (timeout) clearTimeout(timeout);
130
+
131
+ if (this.retries < this.maxRetries) {
132
+ this.retries++; // first retry 1sec, 2sec, 3sec total 6sec retry sequence
133
+ // retry will only happen in case of deploying multi parse server instance
134
+ // at the same time. Modern systems like k8 avoid this by doing rolling updates
135
+
136
+ await this.wait(1000 * this.retries);
137
+ await this.executeMigrations();
138
+ } else {
139
+ _logger.logger.error(`Failed to run migrations: ${e}`);
140
+
141
+ if (process.env.NODE_ENV === 'production') process.exit(1);
142
+ }
143
+ }
144
+ }
145
+
146
+ checkForMissingSchemas() {
147
+ if (this.schemaOptions.strict !== true) {
148
+ return;
149
+ }
150
+
151
+ const cloudSchemas = this.allCloudSchemas.map(s => s.className);
152
+ const localSchemas = this.localSchemas.map(s => s.className);
153
+ const missingSchemas = cloudSchemas.filter(c => !localSchemas.includes(c) && !_SchemaController.systemClasses.includes(c));
154
+
155
+ if (new Set(localSchemas).size !== localSchemas.length) {
156
+ _logger.logger.error(`The list of schemas provided contains duplicated "className" "${localSchemas.join('","')}"`);
157
+
158
+ process.exit(1);
159
+ }
160
+
161
+ if (this.schemaOptions.strict && missingSchemas.length) {
162
+ _logger.logger.warn(`The following schemas are currently present in the database, but not explicitly defined in a schema: "${missingSchemas.join('", "')}"`);
163
+ }
164
+ } // Required for testing purpose
165
+
166
+
167
+ wait(time) {
168
+ return new Promise(resolve => setTimeout(resolve, time));
169
+ }
170
+
171
+ async enforceCLPForNonProvidedClass() {
172
+ const nonProvidedClasses = this.allCloudSchemas.filter(cloudSchema => !this.localSchemas.some(localSchema => localSchema.className === cloudSchema.className));
173
+ await Promise.all(nonProvidedClasses.map(async schema => {
174
+ const parseSchema = new Parse.Schema(schema.className);
175
+ this.handleCLP(schema, parseSchema);
176
+ await this.updateSchemaToDB(parseSchema);
177
+ }));
178
+ } // Create a fake session since Parse do not create the _Session until
179
+ // a session is created
180
+
181
+
182
+ async createDeleteSession() {
183
+ const session = new Parse.Session();
184
+ await session.save(null, {
185
+ useMasterKey: true
186
+ });
187
+ await session.destroy({
188
+ useMasterKey: true
189
+ });
190
+ }
191
+
192
+ async saveOrUpdate(localSchema) {
193
+ const cloudSchema = this.allCloudSchemas.find(sc => sc.className === localSchema.className);
194
+
195
+ if (cloudSchema) {
196
+ try {
197
+ await this.updateSchema(localSchema, cloudSchema);
198
+ } catch (e) {
199
+ throw `Error during update of schema for type ${cloudSchema.className}: ${e}`;
200
+ }
201
+ } else {
202
+ try {
203
+ await this.saveSchema(localSchema);
204
+ } catch (e) {
205
+ throw `Error while saving Schema for type ${localSchema.className}: ${e}`;
206
+ }
207
+ }
208
+ }
209
+
210
+ async saveSchema(localSchema) {
211
+ const newLocalSchema = new Parse.Schema(localSchema.className);
212
+
213
+ if (localSchema.fields) {
214
+ // Handle fields
215
+ Object.keys(localSchema.fields).filter(fieldName => !this.isProtectedFields(localSchema.className, fieldName)).forEach(fieldName => {
216
+ if (localSchema.fields) {
217
+ const field = localSchema.fields[fieldName];
218
+ this.handleFields(newLocalSchema, fieldName, field);
219
+ }
220
+ });
221
+ } // Handle indexes
222
+
223
+
224
+ if (localSchema.indexes) {
225
+ Object.keys(localSchema.indexes).forEach(indexName => {
226
+ if (localSchema.indexes && !this.isProtectedIndex(localSchema.className, indexName)) {
227
+ newLocalSchema.addIndex(indexName, localSchema.indexes[indexName]);
228
+ }
229
+ });
230
+ }
231
+
232
+ this.handleCLP(localSchema, newLocalSchema);
233
+ return await this.saveSchemaToDB(newLocalSchema);
234
+ }
235
+
236
+ async updateSchema(localSchema, cloudSchema) {
237
+ const newLocalSchema = new Parse.Schema(localSchema.className); // Handle fields
238
+ // Check addition
239
+
240
+ if (localSchema.fields) {
241
+ Object.keys(localSchema.fields).filter(fieldName => !this.isProtectedFields(localSchema.className, fieldName)).forEach(fieldName => {
242
+ // -disable-next
243
+ const field = localSchema.fields[fieldName];
244
+
245
+ if (!cloudSchema.fields[fieldName]) {
246
+ this.handleFields(newLocalSchema, fieldName, field);
247
+ }
248
+ });
249
+ }
250
+
251
+ const fieldsToDelete = [];
252
+ const fieldsToRecreate = [];
253
+ const fieldsWithChangedParams = []; // Check deletion
254
+
255
+ Object.keys(cloudSchema.fields).filter(fieldName => !this.isProtectedFields(localSchema.className, fieldName)).forEach(fieldName => {
256
+ const field = cloudSchema.fields[fieldName];
257
+
258
+ if (!localSchema.fields || !localSchema.fields[fieldName]) {
259
+ fieldsToDelete.push(fieldName);
260
+ return;
261
+ }
262
+
263
+ const localField = localSchema.fields[fieldName]; // Check if field has a changed type
264
+
265
+ if (!this.paramsAreEquals({
266
+ type: field.type,
267
+ targetClass: field.targetClass
268
+ }, {
269
+ type: localField.type,
270
+ targetClass: localField.targetClass
271
+ })) {
272
+ fieldsToRecreate.push({
273
+ fieldName,
274
+ from: {
275
+ type: field.type,
276
+ targetClass: field.targetClass
277
+ },
278
+ to: {
279
+ type: localField.type,
280
+ targetClass: localField.targetClass
281
+ }
282
+ });
283
+ return;
284
+ } // Check if something changed other than the type (like required, defaultValue)
285
+
286
+
287
+ if (!this.paramsAreEquals(field, localField)) {
288
+ fieldsWithChangedParams.push(fieldName);
289
+ }
290
+ });
291
+
292
+ if (this.schemaOptions.deleteExtraFields === true) {
293
+ fieldsToDelete.forEach(fieldName => {
294
+ newLocalSchema.deleteField(fieldName);
295
+ }); // Delete fields from the schema then apply changes
296
+
297
+ await this.updateSchemaToDB(newLocalSchema);
298
+ } else if (this.schemaOptions.strict === true && fieldsToDelete.length) {
299
+ _logger.logger.warn(`The following fields exist in the database for "${localSchema.className}", but are missing in the schema : "${fieldsToDelete.join('" ,"')}"`);
300
+ }
301
+
302
+ if (this.schemaOptions.recreateModifiedFields === true) {
303
+ fieldsToRecreate.forEach(field => {
304
+ newLocalSchema.deleteField(field.fieldName);
305
+ }); // Delete fields from the schema then apply changes
306
+
307
+ await this.updateSchemaToDB(newLocalSchema);
308
+ fieldsToRecreate.forEach(fieldInfo => {
309
+ if (localSchema.fields) {
310
+ const field = localSchema.fields[fieldInfo.fieldName];
311
+ this.handleFields(newLocalSchema, fieldInfo.fieldName, field);
312
+ }
313
+ });
314
+ } else if (this.schemaOptions.strict === true && fieldsToRecreate.length) {
315
+ fieldsToRecreate.forEach(field => {
316
+ const from = field.from.type + (field.from.targetClass ? ` (${field.from.targetClass})` : '');
317
+ const to = field.to.type + (field.to.targetClass ? ` (${field.to.targetClass})` : '');
318
+
319
+ _logger.logger.warn(`The field "${field.fieldName}" type differ between the schema and the database for "${localSchema.className}"; Schema is defined as "${to}" and current database type is "${from}"`);
320
+ });
321
+ }
322
+
323
+ fieldsWithChangedParams.forEach(fieldName => {
324
+ if (localSchema.fields) {
325
+ const field = localSchema.fields[fieldName];
326
+ this.handleFields(newLocalSchema, fieldName, field);
327
+ }
328
+ }); // Handle Indexes
329
+ // Check addition
330
+
331
+ if (localSchema.indexes) {
332
+ Object.keys(localSchema.indexes).forEach(indexName => {
333
+ if ((!cloudSchema.indexes || !cloudSchema.indexes[indexName]) && !this.isProtectedIndex(localSchema.className, indexName)) {
334
+ if (localSchema.indexes) {
335
+ newLocalSchema.addIndex(indexName, localSchema.indexes[indexName]);
336
+ }
337
+ }
338
+ });
339
+ }
340
+
341
+ const indexesToAdd = []; // Check deletion
342
+
343
+ if (cloudSchema.indexes) {
344
+ Object.keys(cloudSchema.indexes).forEach(indexName => {
345
+ if (!this.isProtectedIndex(localSchema.className, indexName)) {
346
+ if (!localSchema.indexes || !localSchema.indexes[indexName]) {
347
+ newLocalSchema.deleteIndex(indexName);
348
+ } else if (!this.paramsAreEquals(localSchema.indexes[indexName], cloudSchema.indexes[indexName])) {
349
+ newLocalSchema.deleteIndex(indexName);
350
+
351
+ if (localSchema.indexes) {
352
+ indexesToAdd.push({
353
+ indexName,
354
+ index: localSchema.indexes[indexName]
355
+ });
356
+ }
357
+ }
358
+ }
359
+ });
360
+ }
361
+
362
+ this.handleCLP(localSchema, newLocalSchema, cloudSchema); // Apply changes
363
+
364
+ await this.updateSchemaToDB(newLocalSchema); // Apply new/changed indexes
365
+
366
+ if (indexesToAdd.length) {
367
+ _logger.logger.debug(`Updating indexes for "${newLocalSchema.className}" : ${indexesToAdd.join(' ,')}`);
368
+
369
+ indexesToAdd.forEach(o => newLocalSchema.addIndex(o.indexName, o.index));
370
+ await this.updateSchemaToDB(newLocalSchema);
371
+ }
372
+ }
373
+
374
+ handleCLP(localSchema, newLocalSchema, cloudSchema) {
375
+ if (!localSchema.classLevelPermissions && !cloudSchema) {
376
+ _logger.logger.warn(`classLevelPermissions not provided for ${localSchema.className}.`);
377
+ } // Use spread to avoid read only issue (encountered by Moumouls using directAccess)
378
+
379
+
380
+ const clp = _objectSpread({}, localSchema.classLevelPermissions) || {}; // To avoid inconsistency we need to remove all rights on addField
381
+
382
+ clp.addField = {};
383
+ newLocalSchema.setCLP(clp);
384
+ }
385
+
386
+ isProtectedFields(className, fieldName) {
387
+ return !!_SchemaController.defaultColumns._Default[fieldName] || !!(_SchemaController.defaultColumns[className] && _SchemaController.defaultColumns[className][fieldName]);
388
+ }
389
+
390
+ isProtectedIndex(className, indexName) {
391
+ let indexes = ['_id_'];
392
+
393
+ if (className === '_User') {
394
+ indexes = [...indexes, 'case_insensitive_username', 'case_insensitive_email', 'username_1', 'email_1'];
395
+ }
396
+
397
+ return indexes.indexOf(indexName) !== -1;
398
+ }
399
+
400
+ paramsAreEquals(objA, objB) {
401
+ const keysA = Object.keys(objA);
402
+ const keysB = Object.keys(objB); // Check key name
403
+
404
+ if (keysA.length !== keysB.length) return false;
405
+ return keysA.every(k => objA[k] === objB[k]);
406
+ }
407
+
408
+ handleFields(newLocalSchema, fieldName, field) {
409
+ if (field.type === 'Relation') {
410
+ newLocalSchema.addRelation(fieldName, field.targetClass);
411
+ } else if (field.type === 'Pointer') {
412
+ newLocalSchema.addPointer(fieldName, field.targetClass, field);
413
+ } else {
414
+ newLocalSchema.addField(fieldName, field.type, field);
415
+ }
416
+ }
417
+
418
+ }
419
+
420
+ exports.DefinedSchemas = DefinedSchemas;
421
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TY2hlbWFNaWdyYXRpb25zL0RlZmluZWRTY2hlbWFzLmpzIl0sIm5hbWVzIjpbIlBhcnNlIiwicmVxdWlyZSIsIkRlZmluZWRTY2hlbWFzIiwiY29uc3RydWN0b3IiLCJzY2hlbWFPcHRpb25zIiwiY29uZmlnIiwibG9jYWxTY2hlbWFzIiwiQ29uZmlnIiwiZ2V0IiwiYXBwSWQiLCJkZWZpbml0aW9ucyIsIkFycmF5IiwiaXNBcnJheSIsInJldHJpZXMiLCJtYXhSZXRyaWVzIiwic2F2ZVNjaGVtYVRvREIiLCJzY2hlbWEiLCJwYXlsb2FkIiwiY2xhc3NOYW1lIiwiZmllbGRzIiwiX2ZpZWxkcyIsImluZGV4ZXMiLCJfaW5kZXhlcyIsImNsYXNzTGV2ZWxQZXJtaXNzaW9ucyIsIl9jbHAiLCJyZXNldFNjaGVtYU9wcyIsInVwZGF0ZVNjaGVtYVRvREIiLCJleGVjdXRlIiwibG9nZ2VyIiwiaW5mbyIsImJlZm9yZU1pZ3JhdGlvbiIsIlByb21pc2UiLCJyZXNvbHZlIiwiZXhlY3V0ZU1pZ3JhdGlvbnMiLCJhZnRlck1pZ3JhdGlvbiIsImUiLCJlcnJvciIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImV4aXQiLCJ0aW1lb3V0Iiwic2V0VGltZW91dCIsImNyZWF0ZURlbGV0ZVNlc3Npb24iLCJhbGxDbG91ZFNjaGVtYXMiLCJTY2hlbWEiLCJhbGwiLCJjbGVhclRpbWVvdXQiLCJtYXAiLCJsb2NhbFNjaGVtYSIsInNhdmVPclVwZGF0ZSIsImNoZWNrRm9yTWlzc2luZ1NjaGVtYXMiLCJlbmZvcmNlQ0xQRm9yTm9uUHJvdmlkZWRDbGFzcyIsIndhaXQiLCJzdHJpY3QiLCJjbG91ZFNjaGVtYXMiLCJzIiwibWlzc2luZ1NjaGVtYXMiLCJmaWx0ZXIiLCJjIiwiaW5jbHVkZXMiLCJzeXN0ZW1DbGFzc2VzIiwiU2V0Iiwic2l6ZSIsImxlbmd0aCIsImpvaW4iLCJ3YXJuIiwidGltZSIsIm5vblByb3ZpZGVkQ2xhc3NlcyIsImNsb3VkU2NoZW1hIiwic29tZSIsInBhcnNlU2NoZW1hIiwiaGFuZGxlQ0xQIiwic2Vzc2lvbiIsIlNlc3Npb24iLCJzYXZlIiwidXNlTWFzdGVyS2V5IiwiZGVzdHJveSIsImZpbmQiLCJzYyIsInVwZGF0ZVNjaGVtYSIsInNhdmVTY2hlbWEiLCJuZXdMb2NhbFNjaGVtYSIsIk9iamVjdCIsImtleXMiLCJmaWVsZE5hbWUiLCJpc1Byb3RlY3RlZEZpZWxkcyIsImZvckVhY2giLCJmaWVsZCIsImhhbmRsZUZpZWxkcyIsImluZGV4TmFtZSIsImlzUHJvdGVjdGVkSW5kZXgiLCJhZGRJbmRleCIsImZpZWxkc1RvRGVsZXRlIiwiZmllbGRzVG9SZWNyZWF0ZSIsImZpZWxkc1dpdGhDaGFuZ2VkUGFyYW1zIiwicHVzaCIsImxvY2FsRmllbGQiLCJwYXJhbXNBcmVFcXVhbHMiLCJ0eXBlIiwidGFyZ2V0Q2xhc3MiLCJmcm9tIiwidG8iLCJkZWxldGVFeHRyYUZpZWxkcyIsImRlbGV0ZUZpZWxkIiwicmVjcmVhdGVNb2RpZmllZEZpZWxkcyIsImZpZWxkSW5mbyIsImluZGV4ZXNUb0FkZCIsImRlbGV0ZUluZGV4IiwiaW5kZXgiLCJkZWJ1ZyIsIm8iLCJjbHAiLCJhZGRGaWVsZCIsInNldENMUCIsImRlZmF1bHRDb2x1bW5zIiwiX0RlZmF1bHQiLCJpbmRleE9mIiwib2JqQSIsIm9iakIiLCJrZXlzQSIsImtleXNCIiwiZXZlcnkiLCJrIiwiYWRkUmVsYXRpb24iLCJhZGRQb2ludGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBUEE7QUFDQSxNQUFNQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQXJCOztBQVFPLE1BQU1DLGNBQU4sQ0FBcUI7QUFRMUJDLEVBQUFBLFdBQVcsQ0FBQ0MsYUFBRCxFQUEwQ0MsTUFBMUMsRUFBc0U7QUFDL0UsU0FBS0MsWUFBTCxHQUFvQixFQUFwQjtBQUNBLFNBQUtELE1BQUwsR0FBY0UsZ0JBQU9D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S0FBZSxHQUFHdEMsTUFBTSxDQUFDQyxJQUFQLENBQVltQyxJQUFaLENBQXhCLENBRjJELENBSTNEOztBQUNBLFFBQUlDLEtBQUssQ0FBQ3hELE1BQU4sS0FBaUJ5RCxLQUFLLENBQUN6RCxNQUEzQixFQUFtQyxPQUFPLEtBQVA7QUFDbkMsV0FBT3dELEtBQUssQ0FBQ0UsS0FBTixDQUFZQyxDQUFDLElBQUlMLElBQUksQ0FBQ0ssQ0FBRCxDQUFKLEtBQVlKLElBQUksQ0FBQ0ksQ0FBRCxDQUFqQyxDQUFQO0FBQ0Q7O0FBRURsQyxFQUFBQSxZQUFZLENBQUNQLGNBQUQsRUFBK0JHLFNBQS9CLEVBQWtERyxLQUFsRCxFQUErRTtBQUN6RixRQUFJQSxLQUFLLENBQUNXLElBQU4sS0FBZSxVQUFuQixFQUErQjtBQUM3QmpCLE1BQUFBLGNBQWMsQ0FBQzBDLFdBQWYsQ0FBMkJ2QyxTQUEzQixFQUFzQ0csS0FBSyxDQUFDWSxXQUE1QztBQUNELEtBRkQsTUFFTyxJQUFJWixLQUFLLENBQUNXLElBQU4sS0FBZSxTQUFuQixFQUE4QjtBQUNuQ2pCLE1BQUFBLGNBQWMsQ0FBQzJDLFVBQWYsQ0FBMEJ4QyxTQUExQixFQUFxQ0csS0FBSyxDQUFDWSxXQUEzQyxFQUF3RFosS0FBeEQ7QUFDRCxLQUZNLE1BRUE7QUFDTE4sTUFBQUEsY0FBYyxDQUFDK0IsUUFBZixDQUF3QjVCLFNBQXhCLEVBQW1DRyxLQUFLLENBQUNXLElBQXpDLEVBQStDWCxLQUEvQztBQUNEO0FBQ0Y7O0FBdGF5QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG4vLyBAZmxvdy1kaXNhYmxlLW5leHQgQ2Fubm90IHJlc29sdmUgbW9kdWxlIGBwYXJzZS9ub2RlYC5cbmNvbnN0IFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcbmltcG9ydCB7IGludGVybmFsQ3JlYXRlU2NoZW1hLCBpbnRlcm5hbFVwZGF0ZVNjaGVtYSB9IGZyb20gJy4uL1JvdXRlcnMvU2NoZW1hc1JvdXRlcic7XG5pbXBvcnQgeyBkZWZhdWx0Q29sdW1ucywgc3lzdGVtQ2xhc3NlcyB9IGZyb20gJy4uL0NvbnRyb2xsZXJzL1NjaGVtYUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGFyc2VTZXJ2ZXJPcHRpb25zIH0gZnJvbSAnLi4vT3B0aW9ucyc7XG5pbXBvcnQgKiBhcyBNaWdyYXRpb25zIGZyb20gJy4vTWlncmF0aW9ucyc7XG5cbmV4cG9ydCBjbGFzcyBEZWZpbmVkU2NoZW1hcyB7XG4gIGNvbmZpZzogUGFyc2VTZXJ2ZXJPcHRpb25zO1xuICBzY2hlbWFPcHRpb25zOiBNaWdyYXRpb25zLlNjaGVtYU9wdGlvbnM7XG4gIGxvY2FsU2NoZW1hczogTWlncmF0aW9ucy5KU09OU2NoZW1hW107XG4gIHJldHJpZXM6IG51bWJlcjtcbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICBhbGxDbG91ZFNjaGVtYXM6IFBhcnNlLlNjaGVtYVtdO1xuXG4gIGNvbnN0cnVjdG9yKHNjaGVtYU9wdGlvbnM6IE1pZ3JhdGlvbnMuU2NoZW1hT3B0aW9ucywgY29uZmlnOiBQYXJzZVNlcnZlck9wdGlvbnMpIHtcbiAgICB0aGlzLmxvY2FsU2NoZW1hcyA9IFtdO1xuICAgIHRoaXMuY29uZmlnID0gQ29uZmlnLmdldChjb25maWcuYXBwSWQpO1xuICAgIHRoaXMuc2NoZW1hT3B0aW9ucyA9IHNjaGVtYU9wdGlvbnM7XG4gICAgaWYgKHNjaGVtYU9wdGlvbnMgJiYgc2NoZW1hT3B0aW9ucy5kZWZpbml0aW9ucykge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYU9wdGlvbnMuZGVmaW5pdGlvbnMpKSB7XG4gICAgICAgIHRocm93IGBcInNjaGVtYS5kZWZpbml0aW9uc1wiIG11c3QgYmUgYW4gYXJyYXkgb2Ygc2NoZW1hc2A7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9jYWxTY2hlbWFzID0gc2NoZW1hT3B0aW9ucy5kZWZpbml0aW9ucztcbiAgICB9XG5cbiAgICB0aGlzLnJldHJpZXMgPSAwO1xuICAgIHRoaXMubWF4UmV0cmllcyA9IDM7XG4gIH1cblxuICBhc3luYyBzYXZlU2NoZW1hVG9EQihzY2hlbWE6IFBhcnNlLlNjaGVtYSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBjbGFzc05hbWU6IHNjaGVtYS5jbGFzc05hbWUsXG4gICAgICBmaWVsZHM6IHNjaGVtYS5fZmllbGRzLFxuICAgICAgaW5kZXhlczogc2NoZW1hLl9pbmRleGVzLFxuICAgICAgY2xhc3NMZXZlbFBlcm1pc3Npb25zOiBzY2hlbWEuX2NscCxcbiAgICB9O1xuICAgIGF3YWl0IGludGVybmFsQ3JlYXRlU2NoZW1hKHNjaGVtYS5jbGFzc05hbWUsIHBheWxvYWQsIHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLnJlc2V0U2NoZW1hT3BzKHNjaGVtYSk7XG4gIH1cblxuICByZXNldFNjaGVtYU9wcyhzY2hlbWE6IFBhcnNlLlNjaGVtYSkge1xuICAgIC8vIFJlc2V0IG9wcyBsaWtlIFNES1xuICAgIHNjaGVtYS5fZmllbGRzID0ge307XG4gICAgc2NoZW1hLl9pbmRleGVzID0ge307XG4gIH1cblxuICAvLyBTaW11bGF0ZSB1cGRhdGUgbGlrZSB0aGUgU0RLXG4gIC8vIFdlIGNhbm5vdCB1c2UgU0RLIHNpbmNlIHJvdXRlcyBhcmUgZGlzYWJsZWRcbiAgYXN5bmMgdXBkYXRlU2NoZW1hVG9EQihzY2hlbWE6IFBhcnNlLlNjaGVtYSkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBjbGFzc05hbWU6IHNjaGVtYS5jbGFzc05hbWUsXG4gICAgICBmaWVsZHM6IHNjaGVtYS5fZmllbGRzLFxuICAgICAgaW5kZXhlczogc2NoZW1hLl9pbmRleGVzLFxuICAgICAgY2xhc3NMZXZlbFBlcm1pc3Npb25zOiBzY2hlbWEuX2NscCxcbiAgICB9O1xuICAgIGF3YWl0IGludGVybmFsVXBkYXRlU2NoZW1hKHNjaGVtYS5jbGFzc05hbWUsIHBheWxvYWQsIHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLnJlc2V0U2NoZW1hT3BzKHNjaGVtYSk7XG4gIH1cblxuICBhc3luYyBleGVjdXRlKCkge1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbygnUnVubmluZyBNaWdyYXRpb25zJyk7XG4gICAgICBpZiAodGhpcy5zY2hlbWFPcHRpb25zICYmIHRoaXMuc2NoZW1hT3B0aW9ucy5iZWZvcmVNaWdyYXRpb24pIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHRoaXMuc2NoZW1hT3B0aW9ucy5iZWZvcmVNaWdyYXRpb24oKSk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU1pZ3JhdGlvbnMoKTtcblxuICAgICAgaWYgKHRoaXMuc2NoZW1hT3B0aW9ucyAmJiB0aGlzLnNjaGVtYU9wdGlvbnMuYWZ0ZXJNaWdyYXRpb24pIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHRoaXMuc2NoZW1hT3B0aW9ucy5hZnRlck1pZ3JhdGlvbigpKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1J1bm5pbmcgTWlncmF0aW9ucyBDb21wbGV0ZWQnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBydW4gbWlncmF0aW9uczogJHtlfWApO1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBleGVjdXRlTWlncmF0aW9ucygpIHtcbiAgICBsZXQgdGltZW91dCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNldCB1cCBhIHRpbWUgb3V0IGluIHByb2R1Y3Rpb25cbiAgICAgIC8vIGlmIHdlIGZhaWwgdG8gZ2V0IHNjaGVtYVxuICAgICAgLy8gcG0yIG9yIEs4cyBhbmQgbWFueSBvdGhlciBwcm9jZXNzIG1hbmFnZXJzIHdpbGwgdHJ5IHRvIHJlc3RhcnQgdGhlIHByb2Nlc3NcbiAgICAgIC8vIGFmdGVyIHRoZSBleGl0XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdUaW1lb3V0IG9jY3VycmVkIGR1cmluZyBleGVjdXRpb24gb2YgbWlncmF0aW9ucy4gRXhpdGluZy4uLicpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfSwgMjAwMDApO1xuICAgICAgfVxuXG4gICAgICAvLyBIYWNrIHRvIGZvcmNlIHNlc3Npb24gc2NoZW1hIHRvIGJlIGNyZWF0ZWRcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlRGVsZXRlU2Vzc2lvbigpO1xuICAgICAgdGhpcy5hbGxDbG91ZFNjaGVtYXMgPSBhd2FpdCBQYXJzZS5TY2hlbWEuYWxsKCk7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmxvY2FsU2NoZW1hcy5tYXAoYXN5bmMgbG9jYWxTY2hlbWEgPT4gdGhpcy5zYXZlT3JVcGRhdGUobG9jYWxTY2hlbWEpKSk7XG5cbiAgICAgIHRoaXMuY2hlY2tGb3JNaXNzaW5nU2NoZW1hcygpO1xuICAgICAgYXdhaXQgdGhpcy5lbmZvcmNlQ0xQRm9yTm9uUHJvdmlkZWRDbGFzcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICh0aW1lb3V0KSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICBpZiAodGhpcy5yZXRyaWVzIDwgdGhpcy5tYXhSZXRyaWVzKSB7XG4gICAgICAgIHRoaXMucmV0cmllcysrO1xuICAgICAgICAvLyBmaXJzdCByZXRyeSAxc2VjLCAyc2VjLCAzc2VjIHRvdGFsIDZzZWMgcmV0cnkgc2VxdWVuY2VcbiAgICAgICAgLy8gcmV0cnkgd2lsbCBvbmx5IGhhcHBlbiBpbiBjYXNlIG9mIGRlcGxveWluZyBtdWx0aSBwYXJzZSBzZXJ2ZXIgaW5zdGFuY2VcbiAgICAgICAgLy8gYXQgdGhlIHNhbWUgdGltZS4gTW9kZXJuIHN5c3RlbXMgbGlrZSBrOCBhdm9pZCB0aGlzIGJ5IGRvaW5nIHJvbGxpbmcgdXBkYXRlc1xuICAgICAgICBhd2FpdCB0aGlzLndhaXQoMTAwMCAqIHRoaXMucmV0cmllcyk7XG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZU1pZ3JhdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJ1biBtaWdyYXRpb25zOiAke2V9YCk7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGb3JNaXNzaW5nU2NoZW1hcygpIHtcbiAgICBpZiAodGhpcy5zY2hlbWFPcHRpb25zLnN0cmljdCAhPT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNsb3VkU2NoZW1hcyA9IHRoaXMuYWxsQ2xvdWRTY2hlbWFzLm1hcChzID0+IHMuY2xhc3NOYW1lKTtcbiAgICBjb25zdCBsb2NhbFNjaGVtYXMgPSB0aGlzLmxvY2FsU2NoZW1hcy5tYXAocyA9PiBzLmNsYXNzTmFtZSk7XG4gICAgY29uc3QgbWlzc2luZ1NjaGVtYXMgPSBjbG91ZFNjaGVtYXMuZmlsdGVyKFxuICAgICAgYyA9PiAhbG9jYWxTY2hlbWFzLmluY2x1ZGVzKGMpICYmICFzeXN0ZW1DbGFzc2VzLmluY2x1ZGVzKGMpXG4gICAgKTtcblxuICAgIGlmIChuZXcgU2V0KGxvY2FsU2NoZW1hcykuc2l6ZSAhPT0gbG9jYWxTY2hlbWFzLmxlbmd0aCkge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBgVGhlIGxpc3Qgb2Ygc2NoZW1hcyBwcm92aWRlZCBjb250YWlucyBkdXBsaWNhdGVkIFwiY2xhc3NOYW1lXCIgIFwiJHtsb2NhbFNjaGVtYXMuam9pbihcbiAgICAgICAgICAnXCIsXCInXG4gICAgICAgICl9XCJgXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjaGVtYU9wdGlvbnMuc3RyaWN0ICYmIG1pc3NpbmdTY2hlbWFzLmxlbmd0aCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHNjaGVtYXMgYXJlIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSBkYXRhYmFzZSwgYnV0IG5vdCBleHBsaWNpdGx5IGRlZmluZWQgaW4gYSBzY2hlbWE6IFwiJHttaXNzaW5nU2NoZW1hcy5qb2luKFxuICAgICAgICAgICdcIiwgXCInXG4gICAgICAgICl9XCJgXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlcXVpcmVkIGZvciB0ZXN0aW5nIHB1cnBvc2VcbiAgd2FpdCh0aW1lOiBudW1iZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWUpKTtcbiAgfVxuXG4gIGFzeW5jIGVuZm9yY2VDTFBGb3JOb25Qcm92aWRlZENsYXNzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5vblByb3ZpZGVkQ2xhc3NlcyA9IHRoaXMuYWxsQ2xvdWRTY2hlbWFzLmZpbHRlcihcbiAgICAgIGNsb3VkU2NoZW1hID0+XG4gICAgICAgICF0aGlzLmxvY2FsU2NoZW1hcy5zb21lKGxvY2FsU2NoZW1hID0+IGxvY2FsU2NoZW1hLmNsYXNzTmFtZSA9PT0gY2xvdWRTY2hlbWEuY2xhc3NOYW1lKVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBub25Qcm92aWRlZENsYXNzZXMubWFwKGFzeW5jIHNjaGVtYSA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlU2NoZW1hID0gbmV3IFBhcnNlLlNjaGVtYShzY2hlbWEuY2xhc3NOYW1lKTtcbiAgICAgICAgdGhpcy5oYW5kbGVDTFAoc2NoZW1hLCBwYXJzZVNjaGVtYSk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlU2NoZW1hVG9EQihwYXJzZVNjaGVtYSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvLyBDcmVhdGUgYSBmYWtlIHNlc3Npb24gc2luY2UgUGFyc2UgZG8gbm90IGNyZWF0ZSB0aGUgX1Nlc3Npb24gdW50aWxcbiAgLy8gYSBzZXNzaW9uIGlzIGNyZWF0ZWRcbiAgYXN5bmMgY3JlYXRlRGVsZXRlU2Vzc2lvbigpIHtcbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFBhcnNlLlNlc3Npb24oKTtcbiAgICBhd2FpdCBzZXNzaW9uLnNhdmUobnVsbCwgeyB1c2VNYXN0ZXJLZXk6IHRydWUgfSk7XG4gICAgYXdhaXQgc2Vzc2lvbi5kZXN0cm95KHsgdXNlTWFzdGVyS2V5OiB0cnVlIH0pO1xuICB9XG5cbiAgYXN5bmMgc2F2ZU9yVXBkYXRlKGxvY2FsU2NoZW1hOiBNaWdyYXRpb25zLkpTT05TY2hlbWEpIHtcbiAgICBjb25zdCBjbG91ZFNjaGVtYSA9IHRoaXMuYWxsQ2xvdWRTY2hlbWFzLmZpbmQoc2MgPT4gc2MuY2xhc3NOYW1lID09PSBsb2NhbFNjaGVtYS5jbGFzc05hbWUpO1xuICAgIGlmIChjbG91ZFNjaGVtYSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTY2hlbWEobG9jYWxTY2hlbWEsIGNsb3VkU2NoZW1hKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgYEVycm9yIGR1cmluZyB1cGRhdGUgb2Ygc2NoZW1hIGZvciB0eXBlICR7Y2xvdWRTY2hlbWEuY2xhc3NOYW1lfTogJHtlfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZVNjaGVtYShsb2NhbFNjaGVtYSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IGBFcnJvciB3aGlsZSBzYXZpbmcgU2NoZW1hIGZvciB0eXBlICR7bG9jYWxTY2hlbWEuY2xhc3NOYW1lfTogJHtlfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZVNjaGVtYShsb2NhbFNjaGVtYTogTWlncmF0aW9ucy5KU09OU2NoZW1hKSB7XG4gICAgY29uc3QgbmV3TG9jYWxTY2hlbWEgPSBuZXcgUGFyc2UuU2NoZW1hKGxvY2FsU2NoZW1hLmNsYXNzTmFtZSk7XG4gICAgaWYgKGxvY2FsU2NoZW1hLmZpZWxkcykge1xuICAgICAgLy8gSGFuZGxlIGZpZWxkc1xuICAgICAgT2JqZWN0LmtleXMobG9jYWxTY2hlbWEuZmllbGRzKVxuICAgICAgICAuZmlsdGVyKGZpZWxkTmFtZSA9PiAhdGhpcy5pc1Byb3RlY3RlZEZpZWxkcyhsb2NhbFNjaGVtYS5jbGFzc05hbWUsIGZpZWxkTmFtZSkpXG4gICAgICAgIC5mb3JFYWNoKGZpZWxkTmFtZSA9PiB7XG4gICAgICAgICAgaWYgKGxvY2FsU2NoZW1hLmZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBsb2NhbFNjaGVtYS5maWVsZHNbZmllbGROYW1lXTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRmllbGRzKG5ld0xvY2FsU2NoZW1hLCBmaWVsZE5hbWUsIGZpZWxkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBIYW5kbGUgaW5kZXhlc1xuICAgIGlmIChsb2NhbFNjaGVtYS5pbmRleGVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhsb2NhbFNjaGVtYS5pbmRleGVzKS5mb3JFYWNoKGluZGV4TmFtZSA9PiB7XG4gICAgICAgIGlmIChsb2NhbFNjaGVtYS5pbmRleGVzICYmICF0aGlzLmlzUHJvdGVjdGVkSW5kZXgobG9jYWxTY2hlbWEuY2xhc3NOYW1lLCBpbmRleE5hbWUpKSB7XG4gICAgICAgICAgbmV3TG9jYWxTY2hlbWEuYWRkSW5kZXgoaW5kZXhOYW1lLCBsb2NhbFNjaGVtYS5pbmRleGVzW2luZGV4TmFtZV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZUNMUChsb2NhbFNjaGVtYSwgbmV3TG9jYWxTY2hlbWEpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2F2ZVNjaGVtYVRvREIobmV3TG9jYWxTY2hlbWEpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlU2NoZW1hKGxvY2FsU2NoZW1hOiBNaWdyYXRpb25zLkpTT05TY2hlbWEsIGNsb3VkU2NoZW1hOiBQYXJzZS5TY2hlbWEpIHtcbiAgICBjb25zdCBuZXdMb2NhbFNjaGVtYSA9IG5ldyBQYXJzZS5TY2hlbWEobG9jYWxTY2hlbWEuY2xhc3NOYW1lKTtcblxuICAgIC8vIEhhbmRsZSBmaWVsZHNcbiAgICAvLyBDaGVjayBhZGRpdGlvblxuICAgIGlmIChsb2NhbFNjaGVtYS5maWVsZHMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGxvY2FsU2NoZW1hLmZpZWxkcylcbiAgICAgICAgLmZpbHRlcihmaWVsZE5hbWUgPT4gIXRoaXMuaXNQcm90ZWN0ZWRGaWVsZHMobG9jYWxTY2hlbWEuY2xhc3NOYW1lLCBmaWVsZE5hbWUpKVxuICAgICAgICAuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICAgIC8vIEBmbG93LWRpc2FibGUtbmV4dFxuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbG9jYWxTY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV07XG4gICAgICAgICAgaWYgKCFjbG91ZFNjaGVtYS5maWVsZHNbZmllbGROYW1lXSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVGaWVsZHMobmV3TG9jYWxTY2hlbWEsIGZpZWxkTmFtZSwgZmllbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRzVG9EZWxldGU6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZmllbGRzVG9SZWNyZWF0ZToge1xuICAgICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgICBmcm9tOiB7IHR5cGU6IHN0cmluZywgdGFyZ2V0Q2xhc3M/OiBzdHJpbmcgfSxcbiAgICAgIHRvOiB7IHR5cGU6IHN0cmluZywgdGFyZ2V0Q2xhc3M/OiBzdHJpbmcgfSxcbiAgICB9W10gPSBbXTtcbiAgICBjb25zdCBmaWVsZHNXaXRoQ2hhbmdlZFBhcmFtczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIENoZWNrIGRlbGV0aW9uXG4gICAgT2JqZWN0LmtleXMoY2xvdWRTY2hlbWEuZmllbGRzKVxuICAgICAgLmZpbHRlcihmaWVsZE5hbWUgPT4gIXRoaXMuaXNQcm90ZWN0ZWRGaWVsZHMobG9jYWxTY2hlbWEuY2xhc3NOYW1lLCBmaWVsZE5hbWUpKVxuICAgICAgLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjbG91ZFNjaGVtYS5maWVsZHNbZmllbGROYW1lXTtcbiAgICAgICAgaWYgKCFsb2NhbFNjaGVtYS5maWVsZHMgfHwgIWxvY2FsU2NoZW1hLmZpZWxkc1tmaWVsZE5hbWVdKSB7XG4gICAgICAgICAgZmllbGRzVG9EZWxldGUucHVzaChmaWVsZE5hbWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2FsRmllbGQgPSBsb2NhbFNjaGVtYS5maWVsZHNbZmllbGROYW1lXTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZmllbGQgaGFzIGEgY2hhbmdlZCB0eXBlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5wYXJhbXNBcmVFcXVhbHMoXG4gICAgICAgICAgICB7IHR5cGU6IGZpZWxkLnR5cGUsIHRhcmdldENsYXNzOiBmaWVsZC50YXJnZXRDbGFzcyB9LFxuICAgICAgICAgICAgeyB0eXBlOiBsb2NhbEZpZWxkLnR5cGUsIHRhcmdldENsYXNzOiBsb2NhbEZpZWxkLnRhcmdldENsYXNzIH1cbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIGZpZWxkc1RvUmVjcmVhdGUucHVzaCh7XG4gICAgICAgICAgICBmaWVsZE5hbWUsXG4gICAgICAgICAgICBmcm9tOiB7IHR5cGU6IGZpZWxkLnR5cGUsIHRhcmdldENsYXNzOiBmaWVsZC50YXJnZXRDbGFzcyB9LFxuICAgICAgICAgICAgdG86IHsgdHlwZTogbG9jYWxGaWVsZC50eXBlLCB0YXJnZXRDbGFzczogbG9jYWxGaWVsZC50YXJnZXRDbGFzcyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHNvbWV0aGluZyBjaGFuZ2VkIG90aGVyIHRoYW4gdGhlIHR5cGUgKGxpa2UgcmVxdWlyZWQsIGRlZmF1bHRWYWx1ZSlcbiAgICAgICAgaWYgKCF0aGlzLnBhcmFtc0FyZUVxdWFscyhmaWVsZCwgbG9jYWxGaWVsZCkpIHtcbiAgICAgICAgICBmaWVsZHNXaXRoQ2hhbmdlZFBhcmFtcy5wdXNoKGZpZWxkTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuc2NoZW1hT3B0aW9ucy5kZWxldGVFeHRyYUZpZWxkcyA9PT0gdHJ1ZSkge1xuICAgICAgZmllbGRzVG9EZWxldGUuZm9yRWFjaChmaWVsZE5hbWUgPT4ge1xuICAgICAgICBuZXdMb2NhbFNjaGVtYS5kZWxldGVGaWVsZChmaWVsZE5hbWUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIERlbGV0ZSBmaWVsZHMgZnJvbSB0aGUgc2NoZW1hIHRoZW4gYXBwbHkgY2hhbmdlc1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVTY2hlbWFUb0RCKG5ld0xvY2FsU2NoZW1hKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2NoZW1hT3B0aW9ucy5zdHJpY3QgPT09IHRydWUgJiYgZmllbGRzVG9EZWxldGUubGVuZ3RoKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgZmllbGRzIGV4aXN0IGluIHRoZSBkYXRhYmFzZSBmb3IgXCIke1xuICAgICAgICAgIGxvY2FsU2NoZW1hLmNsYXNzTmFtZVxuICAgICAgICB9XCIsIGJ1dCBhcmUgbWlzc2luZyBpbiB0aGUgc2NoZW1hIDogXCIke2ZpZWxkc1RvRGVsZXRlLmpvaW4oJ1wiICxcIicpfVwiYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY2hlbWFPcHRpb25zLnJlY3JlYXRlTW9kaWZpZWRGaWVsZHMgPT09IHRydWUpIHtcbiAgICAgIGZpZWxkc1RvUmVjcmVhdGUuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgIG5ld0xvY2FsU2NoZW1hLmRlbGV0ZUZpZWxkKGZpZWxkLmZpZWxkTmFtZSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gRGVsZXRlIGZpZWxkcyBmcm9tIHRoZSBzY2hlbWEgdGhlbiBhcHBseSBjaGFuZ2VzXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVNjaGVtYVRvREIobmV3TG9jYWxTY2hlbWEpO1xuXG4gICAgICBmaWVsZHNUb1JlY3JlYXRlLmZvckVhY2goZmllbGRJbmZvID0+IHtcbiAgICAgICAgaWYgKGxvY2FsU2NoZW1hLmZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gbG9jYWxTY2hlbWEuZmllbGRzW2ZpZWxkSW5mby5maWVsZE5hbWVdO1xuICAgICAgICAgIHRoaXMuaGFuZGxlRmllbGRzKG5ld0xvY2FsU2NoZW1hLCBmaWVsZEluZm8uZmllbGROYW1lLCBmaWVsZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zY2hlbWFPcHRpb25zLnN0cmljdCA9PT0gdHJ1ZSAmJiBmaWVsZHNUb1JlY3JlYXRlLmxlbmd0aCkge1xuICAgICAgZmllbGRzVG9SZWNyZWF0ZS5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgY29uc3QgZnJvbSA9XG4gICAgICAgICAgZmllbGQuZnJvbS50eXBlICsgKGZpZWxkLmZyb20udGFyZ2V0Q2xhc3MgPyBgICgke2ZpZWxkLmZyb20udGFyZ2V0Q2xhc3N9KWAgOiAnJyk7XG4gICAgICAgIGNvbnN0IHRvID0gZmllbGQudG8udHlwZSArIChmaWVsZC50by50YXJnZXRDbGFzcyA/IGAgKCR7ZmllbGQudG8udGFyZ2V0Q2xhc3N9KWAgOiAnJyk7XG5cbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFRoZSBmaWVsZCBcIiR7ZmllbGQuZmllbGROYW1lfVwiIHR5cGUgZGlmZmVyIGJldHdlZW4gdGhlIHNjaGVtYSBhbmQgdGhlIGRhdGFiYXNlIGZvciBcIiR7bG9jYWxTY2hlbWEuY2xhc3NOYW1lfVwiOyBTY2hlbWEgaXMgZGVmaW5lZCBhcyBcIiR7dG99XCIgYW5kIGN1cnJlbnQgZGF0YWJhc2UgdHlwZSBpcyBcIiR7ZnJvbX1cImBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZpZWxkc1dpdGhDaGFuZ2VkUGFyYW1zLmZvckVhY2goZmllbGROYW1lID0+IHtcbiAgICAgIGlmIChsb2NhbFNjaGVtYS5maWVsZHMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBsb2NhbFNjaGVtYS5maWVsZHNbZmllbGROYW1lXTtcbiAgICAgICAgdGhpcy5oYW5kbGVGaWVsZHMobmV3TG9jYWxTY2hlbWEsIGZpZWxkTmFtZSwgZmllbGQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIEluZGV4ZXNcbiAgICAvLyBDaGVjayBhZGRpdGlvblxuICAgIGlmIChsb2NhbFNjaGVtYS5pbmRleGVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhsb2NhbFNjaGVtYS5pbmRleGVzKS5mb3JFYWNoKGluZGV4TmFtZSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoIWNsb3VkU2NoZW1hLmluZGV4ZXMgfHwgIWNsb3VkU2NoZW1hLmluZGV4ZXNbaW5kZXhOYW1lXSkgJiZcbiAgICAgICAgICAhdGhpcy5pc1Byb3RlY3RlZEluZGV4KGxvY2FsU2NoZW1hLmNsYXNzTmFtZSwgaW5kZXhOYW1lKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAobG9jYWxTY2hlbWEuaW5kZXhlcykge1xuICAgICAgICAgICAgbmV3TG9jYWxTY2hlbWEuYWRkSW5kZXgoaW5kZXhOYW1lLCBsb2NhbFNjaGVtYS5pbmRleGVzW2luZGV4TmFtZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXhlc1RvQWRkID0gW107XG5cbiAgICAvLyBDaGVjayBkZWxldGlvblxuICAgIGlmIChjbG91ZFNjaGVtYS5pbmRleGVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhjbG91ZFNjaGVtYS5pbmRleGVzKS5mb3JFYWNoKGluZGV4TmFtZSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc1Byb3RlY3RlZEluZGV4KGxvY2FsU2NoZW1hLmNsYXNzTmFtZSwgaW5kZXhOYW1lKSkge1xuICAgICAgICAgIGlmICghbG9jYWxTY2hlbWEuaW5kZXhlcyB8fCAhbG9jYWxTY2hlbWEuaW5kZXhlc1tpbmRleE5hbWVdKSB7XG4gICAgICAgICAgICBuZXdMb2NhbFNjaGVtYS5kZWxldGVJbmRleChpbmRleE5hbWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAhdGhpcy5wYXJhbXNBcmVFcXVhbHMobG9jYWxTY2hlbWEuaW5kZXhlc1tpbmRleE5hbWVdLCBjbG91ZFNjaGVtYS5pbmRleGVzW2luZGV4TmFtZV0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBuZXdMb2NhbFNjaGVtYS5kZWxldGVJbmRleChpbmRleE5hbWUpO1xuICAgICAgICAgICAgaWYgKGxvY2FsU2NoZW1hLmluZGV4ZXMpIHtcbiAgICAgICAgICAgICAgaW5kZXhlc1RvQWRkLnB1c2goe1xuICAgICAgICAgICAgICAgIGluZGV4TmFtZSxcbiAgICAgICAgICAgICAgICBpbmRleDogbG9jYWxTY2hlbWEuaW5kZXhlc1tpbmRleE5hbWVdLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlQ0xQKGxvY2FsU2NoZW1hLCBuZXdMb2NhbFNjaGVtYSwgY2xvdWRTY2hlbWEpO1xuICAgIC8vIEFwcGx5IGNoYW5nZXNcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZVNjaGVtYVRvREIobmV3TG9jYWxTY2hlbWEpO1xuICAgIC8vIEFwcGx5IG5ldy9jaGFuZ2VkIGluZGV4ZXNcbiAgICBpZiAoaW5kZXhlc1RvQWRkLmxlbmd0aCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICBgVXBkYXRpbmcgaW5kZXhlcyBmb3IgXCIke25ld0xvY2FsU2NoZW1hLmNsYXNzTmFtZX1cIiA6ICAke2luZGV4ZXNUb0FkZC5qb2luKCcgLCcpfWBcbiAgICAgICk7XG4gICAgICBpbmRleGVzVG9BZGQuZm9yRWFjaChvID0+IG5ld0xvY2FsU2NoZW1hLmFkZEluZGV4KG8uaW5kZXhOYW1lLCBvLmluZGV4KSk7XG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZVNjaGVtYVRvREIobmV3TG9jYWxTY2hlbWEpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUNMUChcbiAgICBsb2NhbFNjaGVtYTogTWlncmF0aW9ucy5KU09OU2NoZW1hLFxuICAgIG5ld0xvY2FsU2NoZW1hOiBQYXJzZS5TY2hlbWEsXG4gICAgY2xvdWRTY2hlbWE6IFBhcnNlLlNjaGVtYVxuICApIHtcbiAgICBpZiAoIWxvY2FsU2NoZW1hLmNsYXNzTGV2ZWxQZXJtaXNzaW9ucyAmJiAhY2xvdWRTY2hlbWEpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBjbGFzc0xldmVsUGVybWlzc2lvbnMgbm90IHByb3ZpZGVkIGZvciAke2xvY2FsU2NoZW1hLmNsYXNzTmFtZX0uYCk7XG4gICAgfVxuICAgIC8vIFVzZSBzcHJlYWQgdG8gYXZvaWQgcmVhZCBvbmx5IGlzc3VlIChlbmNvdW50ZXJlZCBieSBNb3Vtb3VscyB1c2luZyBkaXJlY3RBY2Nlc3MpXG4gICAgY29uc3QgY2xwID0gKHsgLi4ubG9jYWxTY2hlbWEuY2xhc3NMZXZlbFBlcm1pc3Npb25zIH0gfHwge306IFBhcnNlLkNMUC5QZXJtaXNzaW9uc01hcCk7XG4gICAgLy8gVG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgcmlnaHRzIG9uIGFkZEZpZWxkXG4gICAgY2xwLmFkZEZpZWxkID0ge307XG4gICAgbmV3TG9jYWxTY2hlbWEuc2V0Q0xQKGNscCk7XG4gIH1cblxuICBpc1Byb3RlY3RlZEZpZWxkcyhjbGFzc05hbWU6IHN0cmluZywgZmllbGROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFkZWZhdWx0Q29sdW1ucy5fRGVmYXVsdFtmaWVsZE5hbWVdIHx8XG4gICAgICAhIShkZWZhdWx0Q29sdW1uc1tjbGFzc05hbWVdICYmIGRlZmF1bHRDb2x1bW5zW2NsYXNzTmFtZV1bZmllbGROYW1lXSlcbiAgICApO1xuICB9XG5cbiAgaXNQcm90ZWN0ZWRJbmRleChjbGFzc05hbWU6IHN0cmluZywgaW5kZXhOYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgaW5kZXhlcyA9IFsnX2lkXyddO1xuICAgIGlmIChjbGFzc05hbWUgPT09ICdfVXNlcicpIHtcbiAgICAgIGluZGV4ZXMgPSBbXG4gICAgICAgIC4uLmluZGV4ZXMsXG4gICAgICAgICdjYXNlX2luc2Vuc2l0aXZlX3VzZXJuYW1lJyxcbiAgICAgICAgJ2Nhc2VfaW5zZW5zaXRpdmVfZW1haWwnLFxuICAgICAgICAndXNlcm5hbWVfMScsXG4gICAgICAgICdlbWFpbF8xJyxcbiAgICAgIF07XG4gICAgfVxuXG4gICAgcmV0dXJuIGluZGV4ZXMuaW5kZXhPZihpbmRleE5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIHBhcmFtc0FyZUVxdWFsczxUOiB7IFtrZXk6IHN0cmluZ106IGFueSB9PihvYmpBOiBULCBvYmpCOiBUKSB7XG4gICAgY29uc3Qga2V5c0E6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMob2JqQSk7XG4gICAgY29uc3Qga2V5c0I6IHN0cmluZ1tdID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgICAvLyBDaGVjayBrZXkgbmFtZVxuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzQS5ldmVyeShrID0+IG9iakFba10gPT09IG9iakJba10pO1xuICB9XG5cbiAgaGFuZGxlRmllbGRzKG5ld0xvY2FsU2NoZW1hOiBQYXJzZS5TY2hlbWEsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWVsZDogTWlncmF0aW9ucy5GaWVsZFR5cGUpIHtcbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ1JlbGF0aW9uJykge1xuICAgICAgbmV3TG9jYWxTY2hlbWEuYWRkUmVsYXRpb24oZmllbGROYW1lLCBmaWVsZC50YXJnZXRDbGFzcyk7XG4gICAgfSBlbHNlIGlmIChmaWVsZC50eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIG5ld0xvY2FsU2NoZW1hLmFkZFBvaW50ZXIoZmllbGROYW1lLCBmaWVsZC50YXJnZXRDbGFzcywgZmllbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdMb2NhbFNjaGVtYS5hZGRGaWVsZChmaWVsZE5hbWUsIGZpZWxkLnR5cGUsIGZpZWxkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makeSchema = makeSchema;
7
+ exports.CLP = void 0;
8
+
9
+ // @Typescript 4.1+ // type CLPPermission = 'requiresAuthentication' | '*' | `user:${string}` | `role:${string}`
10
+ class CLP {
11
+ static allow(perms) {
12
+ const out = {};
13
+
14
+ for (const [perm, ops] of Object.entries(perms)) {
15
+ // -disable-next Property `@@iterator` is missing in mixed [1] but exists in `$Iterable` [2].
16
+ for (const op of ops) {
17
+ out[op] = out[op] || {};
18
+ out[op][perm] = true;
19
+ }
20
+ }
21
+
22
+ return out;
23
+ }
24
+
25
+ }
26
+
27
+ exports.CLP = CLP;
28
+
29
+ function makeSchema(className, schema) {
30
+ // This function solve two things:
31
+ // 1. It provides auto-completion to the users who are implementing schemas
32
+ // 2. It allows forward-compatible point in order to allow future changes to the internal structure of JSONSchema without affecting all the users
33
+ schema.className = className;
34
+ return schema;
35
+ }
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TY2hlbWFNaWdyYXRpb25zL01pZ3JhdGlvbnMuanMiXSwibmFtZXMiOlsiQ0xQIiwiYWxsb3ciLCJwZXJtcyIsIm91dCIsInBlcm0iLCJvcHMiLCJPYmplY3QiLCJlbnRyaWVzIiwib3AiLCJtYWtlU2NoZW1hIiwiY2xhc3NOYW1lIiwic2NoZW1hIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWlEQTtBQXNCTyxNQUFNQSxHQUFOLENBQVU7QUFDSCxTQUFMQyxLQUFLLENBQUNDLEtBQUQsRUFBa0Q7QUFDNUQsVUFBTUMsR0FBRyxHQUFHLEVBQVo7O0FBRUEsU0FBSyxNQUFNLENBQUNDLElBQUQsRUFBT0MsR0FBUCxDQUFYLElBQTBCQyxNQUFNLENBQUNDLE9BQVAsQ0FBZUwsS0FBZixDQUExQixFQUFpRDtBQUMvQztBQUNBLFdBQUssTUFBTU0sRUFBWCxJQUFpQkgsR0FBakIsRUFBc0I7QUFDcEJGLFFBQUFBLEdBQUcsQ0FBQ0ssRUFBRCxDQUFILEdBQVVMLEdBQUcsQ0FBQ0ssRUFBRCxDQUFILElBQVcsRUFBckI7QUFDQUwsUUFBQUEsR0FBRyxDQUFDSyxFQUFELENBQUgsQ0FBUUosSUFBUixJQUFnQixJQUFoQjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0QsR0FBUDtBQUNEOztBQWJjOzs7O0FBZ0JWLFNBQVNNLFVBQVQsQ0FBb0JDLFNBQXBCLEVBQThDQyxNQUE5QyxFQUE4RTtBQUNuRjtBQUNBO0FBQ0E7QUFDQUEsRUFBQUEsTUFBTSxDQUFDRCxTQUFQLEdBQW1CQSxTQUFuQjtBQUVBLFNBQU9DLE1BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5cbmV4cG9ydCB0eXBlIEZpZWxkVmFsdWVUeXBlID1cbiAgfCAnU3RyaW5nJ1xuICB8ICdCb29sZWFuJ1xuICB8ICdGaWxlJ1xuICB8ICdOdW1iZXInXG4gIHwgJ1JlbGF0aW9uJ1xuICB8ICdQb2ludGVyJ1xuICB8ICdEYXRlJ1xuICB8ICdHZW9Qb2ludCdcbiAgfCAnUG9seWdvbidcbiAgfCAnQXJyYXknXG4gIHwgJ09iamVjdCdcbiAgfCAnQUNMJztcblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFR5cGUge1xuICB0eXBlOiBGaWVsZFZhbHVlVHlwZTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBkZWZhdWx0VmFsdWU/OiBtaXhlZDtcbiAgdGFyZ2V0Q2xhc3M/OiBzdHJpbmc7XG59XG5cbnR5cGUgQ2xhc3NOYW1lVHlwZSA9ICdfVXNlcicgfCAnX1JvbGUnIHwgc3RyaW5nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3RlY3RlZEZpZWxkc0ludGVyZmFjZSB7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluZGV4SW50ZXJmYWNlIHtcbiAgW2tleTogc3RyaW5nXTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluZGV4ZXNJbnRlcmZhY2Uge1xuICBba2V5OiBzdHJpbmddOiBJbmRleEludGVyZmFjZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFPcHRpb25zIHtcbiAgZGVmaW5pdGlvbnM6IEpTT05TY2hlbWFbXTtcbiAgc3RyaWN0OiA/Ym9vbGVhbjtcbiAgZGVsZXRlRXh0cmFGaWVsZHM6ID9ib29sZWFuO1xuICByZWNyZWF0ZU1vZGlmaWVkRmllbGRzOiA/Ym9vbGVhbjtcbiAgbG9ja1NjaGVtYXM6ID9ib29sZWFuO1xuICAvKiBDYWxsYmFjayB3aGVuIHNlcnZlciBoYXMgc3RhcnRlZCBhbmQgYmVmb3JlIHJ1bm5pbmcgc2NoZW1hcyBtaWdyYXRpb24gb3BlcmF0aW9ucyBpZiBzY2hlbWFzIGtleSBwcm92aWRlZCAqL1xuICBiZWZvcmVNaWdyYXRpb246ID8oKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgYWZ0ZXJNaWdyYXRpb246ID8oKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IHR5cGUgQ0xQT3BlcmF0aW9uID0gJ2ZpbmQnIHwgJ2NvdW50JyB8ICdnZXQnIHwgJ3VwZGF0ZScgfCAnY3JlYXRlJyB8ICdkZWxldGUnO1xuLy8gQFR5cGVzY3JpcHQgNC4xKyAvLyB0eXBlIENMUFBlcm1pc3Npb24gPSAncmVxdWlyZXNBdXRoZW50aWNhdGlvbicgfCAnKicgfCAgYHVzZXI6JHtzdHJpbmd9YCB8IGByb2xlOiR7c3RyaW5nfWBcblxudHlwZSBDTFBWYWx1ZSA9IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9O1xudHlwZSBDTFBEYXRhID0geyBba2V5OiBzdHJpbmddOiBDTFBPcGVyYXRpb25bXSB9O1xudHlwZSBDTFBJbnRlcmZhY2UgPSB7IFtrZXk6IHN0cmluZ106IENMUFZhbHVlIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgSlNPTlNjaGVtYSB7XG4gIGNsYXNzTmFtZTogQ2xhc3NOYW1lVHlwZTtcbiAgZmllbGRzPzogeyBba2V5OiBzdHJpbmddOiBGaWVsZFR5cGUgfTtcbiAgaW5kZXhlcz86IEluZGV4ZXNJbnRlcmZhY2U7XG4gIGNsYXNzTGV2ZWxQZXJtaXNzaW9ucz86IHtcbiAgICBmaW5kPzogQ0xQVmFsdWUsXG4gICAgY291bnQ/OiBDTFBWYWx1ZSxcbiAgICBnZXQ/OiBDTFBWYWx1ZSxcbiAgICB1cGRhdGU/OiBDTFBWYWx1ZSxcbiAgICBjcmVhdGU/OiBDTFBWYWx1ZSxcbiAgICBkZWxldGU/OiBDTFBWYWx1ZSxcbiAgICBhZGRGaWVsZD86IENMUFZhbHVlLFxuICAgIHByb3RlY3RlZEZpZWxkcz86IFByb3RlY3RlZEZpZWxkc0ludGVyZmFjZSxcbiAgfTtcbn1cblxuZXhwb3J0IGNsYXNzIENMUCB7XG4gIHN0YXRpYyBhbGxvdyhwZXJtczogeyBba2V5OiBzdHJpbmddOiBDTFBEYXRhIH0pOiBDTFBJbnRlcmZhY2Uge1xuICAgIGNvbnN0IG91dCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBbcGVybSwgb3BzXSBvZiBPYmplY3QuZW50cmllcyhwZXJtcykpIHtcbiAgICAgIC8vIEBmbG93LWRpc2FibGUtbmV4dCBQcm9wZXJ0eSBgQEBpdGVyYXRvcmAgaXMgbWlzc2luZyBpbiBtaXhlZCBbMV0gYnV0IGV4aXN0cyBpbiBgJEl0ZXJhYmxlYCBbMl0uXG4gICAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgICBvdXRbb3BdID0gb3V0W29wXSB8fCB7fTtcbiAgICAgICAgb3V0W29wXVtwZXJtXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVNjaGVtYShjbGFzc05hbWU6IENsYXNzTmFtZVR5cGUsIHNjaGVtYTogSlNPTlNjaGVtYSk6IEpTT05TY2hlbWEge1xuICAvLyBUaGlzIGZ1bmN0aW9uIHNvbHZlIHR3byB0aGluZ3M6XG4gIC8vIDEuIEl0IHByb3ZpZGVzIGF1dG8tY29tcGxldGlvbiB0byB0aGUgdXNlcnMgd2hvIGFyZSBpbXBsZW1lbnRpbmcgc2NoZW1hc1xuICAvLyAyLiBJdCBhbGxvd3MgZm9yd2FyZC1jb21wYXRpYmxlIHBvaW50IGluIG9yZGVyIHRvIGFsbG93IGZ1dHVyZSBjaGFuZ2VzIHRvIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgSlNPTlNjaGVtYSB3aXRob3V0IGFmZmVjdGluZyBhbGwgdGhlIHVzZXJzXG4gIHNjaGVtYS5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG5cbiAgcmV0dXJuIHNjaGVtYTtcbn1cbiJdfQ==
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _Utils = _interopRequireDefault(require("../Utils"));
9
+
10
+ var _lodash = require("lodash");
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ /**
15
+ * @module SecurityCheck
16
+ */
17
+
18
+ /**
19
+ * A security check.
20
+ * @class Check
21
+ */
22
+ class Check {
23
+ /**
24
+ * Constructs a new security check.
25
+ * @param {Object} params The parameters.
26
+ * @param {String} params.title The title.
27
+ * @param {String} params.warning The warning message if the check fails.
28
+ * @param {String} params.solution The solution to fix the check.
29
+ * @param {Promise} params.check The check as synchronous or asynchronous function.
30
+ */
31
+ constructor(params) {
32
+ this._validateParams(params);
33
+
34
+ const {
35
+ title,
36
+ warning,
37
+ solution,
38
+ check
39
+ } = params;
40
+ this.title = title;
41
+ this.warning = warning;
42
+ this.solution = solution;
43
+ this.check = check; // Set default properties
44
+
45
+ this._checkState = CheckState.none;
46
+ this.error;
47
+ }
48
+ /**
49
+ * Returns the current check state.
50
+ * @return {CheckState} The check state.
51
+ */
52
+
53
+
54
+ checkState() {
55
+ return this._checkState;
56
+ }
57
+
58
+ async run() {
59
+ // Get check as synchronous or asynchronous function
60
+ const check = this.check instanceof Promise ? await this.check : this.check; // Run check
61
+
62
+ try {
63
+ check();
64
+ this._checkState = CheckState.success;
65
+ } catch (e) {
66
+ this.stateFailError = e;
67
+ this._checkState = CheckState.fail;
68
+ }
69
+ }
70
+ /**
71
+ * Validates the constructor parameters.
72
+ * @param {Object} params The parameters to validate.
73
+ */
74
+
75
+
76
+ _validateParams(params) {
77
+ _Utils.default.validateParams(params, {
78
+ group: {
79
+ t: 'string',
80
+ v: _lodash.isString
81
+ },
82
+ title: {
83
+ t: 'string',
84
+ v: _lodash.isString
85
+ },
86
+ warning: {
87
+ t: 'string',
88
+ v: _lodash.isString
89
+ },
90
+ solution: {
91
+ t: 'string',
92
+ v: _lodash.isString
93
+ },
94
+ check: {
95
+ t: 'function',
96
+ v: _lodash.isFunction
97
+ }
98
+ });
99
+ }
100
+
101
+ }
102
+ /**
103
+ * The check state.
104
+ */
105
+
106
+
107
+ const CheckState = Object.freeze({
108
+ none: 'none',
109
+ fail: 'fail',
110
+ success: 'success'
111
+ });
112
+ var _default = Check;
113
+ exports.default = _default;
114
+ module.exports = {
115
+ Check,
116
+ CheckState
117
+ };
118
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZWN1cml0eS9DaGVjay5qcyJdLCJuYW1lcyI6WyJDaGVjayIsImNvbnN0cnVjdG9yIiwicGFyYW1zIiwiX3ZhbGlkYXRlUGFyYW1zIiwidGl0bGUiLCJ3YXJuaW5nIiwic29sdXRpb24iLCJjaGVjayIsIl9jaGVja1N0YXRlIiwiQ2hlY2tTdGF0ZSIsIm5vbmUiLCJlcnJvciIsImNoZWNrU3RhdGUiLCJydW4iLCJQcm9taXNlIiwic3VjY2VzcyIsImUiLCJzdGF0ZUZhaWxFcnJvciIsImZhaWwiLCJVdGlscyIsInZhbGlkYXRlUGFyYW1zIiwiZ3JvdXAiLCJ0IiwidiIsImlzU3RyaW5nIiwiaXNGdW5jdGlvbiIsIk9iamVjdCIsImZyZWV6ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFJQTs7QUFDQTs7OztBQUxBO0FBQ0E7QUFDQTs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLEtBQU4sQ0FBWTtBQUNWO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDRUMsRUFBQUEsV0FBVyxDQUFDQyxNQUFELEVBQVM7QUFDbEIsU0FBS0MsZUFBTCxDQUFxQkQsTUFBckI7O0FBQ0EsVUFBTTtBQUFFRSxNQUFBQSxLQUFGO0FBQVNDLE1BQUFBLE9BQVQ7QUFBa0JDLE1BQUFBLFFBQWxCO0FBQTRCQyxNQUFBQTtBQUE1QixRQUFzQ0wsTUFBNUM7QUFFQSxTQUFLRSxLQUFMLEdBQWFBLEtBQWI7QUFDQSxTQUFLQyxPQUFMLEdBQWVBLE9BQWY7QUFDQSxTQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtBQUNBLFNBQUtDLEtBQUwsR0FBYUEsS0FBYixDQVBrQixDQVNsQjs7QUFDQSxTQUFLQyxXQUFMLEdBQW1CQyxVQUFVLENBQUNDLElBQTlCO0FBQ0EsU0FBS0MsS0FBTDtBQUNEO0FBRUQ7QUFDRjtBQUNBO0FBQ0E7OztBQUNFQyxFQUFBQSxVQUFVLEdBQUc7QUFDWCxXQUFPLEtBQUtKLFdBQVo7QUFDRDs7QUFFUSxRQUFISyxHQUFHLEdBQUc7QUFDVjtBQUNBLFVBQU1OLEtBQUssR0FBRyxLQUFLQSxLQUFMLFlBQXNCTyxPQUF0QixHQUFnQyxNQUFNLEtBQUtQLEtBQTNDLEdBQW1ELEtBQUtBLEtBQXRFLENBRlUsQ0FJVjs7QUFDQSxRQUFJO0FBQ0ZBLE1BQUFBLEtBQUs7QUFDTCxXQUFLQyxXQUFMLEdBQW1CQyxVQUFVLENBQUNNLE9BQTlCO0FBQ0QsS0FIRCxDQUdFLE9BQU9DLENBQVAsRUFBVTtBQUNWLFdBQUtDLGNBQUwsR0FBc0JELENBQXRCO0FBQ0EsV0FBS1IsV0FBTCxHQUFtQkMsVUFBVSxDQUFDUyxJQUE5QjtBQUNEO0FBQ0Y7QUFFRDtBQUNGO0FBQ0E7QUFDQTs7O0FBQ0VmLEVBQUFBLGVBQWUsQ0FBQ0QsTUFBRCxFQUFTO0FBQ3RCaUIsbUJBQU1DLGNBQU4sQ0FBcUJsQixNQUFyQixFQUE2QjtBQUMzQm1CLE1BQUFBLEtBQUssRUFBRTtBQUFFQyxRQUFBQSxDQUFDLEVBQUUsUUFBTDtBQUFlQyxRQUFBQSxDQUFDLEVBQUVDO0FBQWxCLE9BRG9CO0FBRTNCcEIsTUFBQUEsS0FBSyxFQUFFO0FBQUVrQixRQUFBQSxDQUFDLEVBQUUsUUFBTDtBQUFlQyxRQUFBQSxDQUFDLEVBQUVDO0FBQWxCLE9BRm9CO0FBRzNCbkIsTUFBQUEsT0FBTyxFQUFFO0FBQUVpQixRQUFBQSxDQUFDLEVBQUUsUUFBTDtBQUFlQyxRQUFBQSxDQUFDLEVBQUVDO0FBQWxCLE9BSGtCO0FBSTNCbEIsTUFBQUEsUUFBUSxFQUFFO0FBQUVnQixRQUFBQSxDQUFDLEVBQUUsUUFBTDtBQUFlQyxRQUFBQSxDQUFDLEVBQUVDO0FBQWxCLE9BSmlCO0FBSzNCakIsTUFBQUEsS0FBSyxFQUFFO0FBQUVlLFFBQUFBLENBQUMsRUFBRSxVQUFMO0FBQWlCQyxRQUFBQSxDQUFDLEVBQUVFO0FBQXBCO0FBTG9CLEtBQTdCO0FBT0Q7O0FBekRTO0FBNERaO0FBQ0E7QUFDQTs7O0FBQ0EsTUFBTWhCLFVBQVUsR0FBR2lCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjO0FBQy9CakIsRUFBQUEsSUFBSSxFQUFFLE1BRHlCO0FBRS9CUSxFQUFBQSxJQUFJLEVBQUUsTUFGeUI7QUFHL0JILEVBQUFBLE9BQU8sRUFBRTtBQUhzQixDQUFkLENBQW5CO2VBTWVmLEs7O0FBQ2Y0QixNQUFNLENBQUNDLE9BQVAsR0FBaUI7QUFDZjdCLEVBQUFBLEtBRGU7QUFFZlMsRUFBQUE7QUFGZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBTZWN1cml0eUNoZWNrXG4gKi9cblxuaW1wb3J0IFV0aWxzIGZyb20gJy4uL1V0aWxzJztcbmltcG9ydCB7IGlzRnVuY3Rpb24sIGlzU3RyaW5nIH0gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBBIHNlY3VyaXR5IGNoZWNrLlxuICogQGNsYXNzIENoZWNrXG4gKi9cbmNsYXNzIENoZWNrIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgc2VjdXJpdHkgY2hlY2suXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgVGhlIHBhcmFtZXRlcnMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMudGl0bGUgVGhlIHRpdGxlLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLndhcm5pbmcgVGhlIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgY2hlY2sgZmFpbHMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuc29sdXRpb24gVGhlIHNvbHV0aW9uIHRvIGZpeCB0aGUgY2hlY2suXG4gICAqIEBwYXJhbSB7UHJvbWlzZX0gcGFyYW1zLmNoZWNrIFRoZSBjaGVjayBhcyBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJhbXMpIHtcbiAgICB0aGlzLl92YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xuICAgIGNvbnN0IHsgdGl0bGUsIHdhcm5pbmcsIHNvbHV0aW9uLCBjaGVjayB9ID0gcGFyYW1zO1xuXG4gICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgIHRoaXMud2FybmluZyA9IHdhcm5pbmc7XG4gICAgdGhpcy5zb2x1dGlvbiA9IHNvbHV0aW9uO1xuICAgIHRoaXMuY2hlY2sgPSBjaGVjaztcblxuICAgIC8vIFNldCBkZWZhdWx0IHByb3BlcnRpZXNcbiAgICB0aGlzLl9jaGVja1N0YXRlID0gQ2hlY2tTdGF0ZS5ub25lO1xuICAgIHRoaXMuZXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBjaGVjayBzdGF0ZS5cbiAgICogQHJldHVybiB7Q2hlY2tTdGF0ZX0gVGhlIGNoZWNrIHN0YXRlLlxuICAgKi9cbiAgY2hlY2tTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hlY2tTdGF0ZTtcbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICAvLyBHZXQgY2hlY2sgYXMgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzIGZ1bmN0aW9uXG4gICAgY29uc3QgY2hlY2sgPSB0aGlzLmNoZWNrIGluc3RhbmNlb2YgUHJvbWlzZSA/IGF3YWl0IHRoaXMuY2hlY2sgOiB0aGlzLmNoZWNrO1xuXG4gICAgLy8gUnVuIGNoZWNrXG4gICAgdHJ5IHtcbiAgICAgIGNoZWNrKCk7XG4gICAgICB0aGlzLl9jaGVja1N0YXRlID0gQ2hlY2tTdGF0ZS5zdWNjZXNzO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuc3RhdGVGYWlsRXJyb3IgPSBlO1xuICAgICAgdGhpcy5fY2hlY2tTdGF0ZSA9IENoZWNrU3RhdGUuZmFpbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIFRoZSBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRlLlxuICAgKi9cbiAgX3ZhbGlkYXRlUGFyYW1zKHBhcmFtcykge1xuICAgIFV0aWxzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgZ3JvdXA6IHsgdDogJ3N0cmluZycsIHY6IGlzU3RyaW5nIH0sXG4gICAgICB0aXRsZTogeyB0OiAnc3RyaW5nJywgdjogaXNTdHJpbmcgfSxcbiAgICAgIHdhcm5pbmc6IHsgdDogJ3N0cmluZycsIHY6IGlzU3RyaW5nIH0sXG4gICAgICBzb2x1dGlvbjogeyB0OiAnc3RyaW5nJywgdjogaXNTdHJpbmcgfSxcbiAgICAgIGNoZWNrOiB7IHQ6ICdmdW5jdGlvbicsIHY6IGlzRnVuY3Rpb24gfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSBjaGVjayBzdGF0ZS5cbiAqL1xuY29uc3QgQ2hlY2tTdGF0ZSA9IE9iamVjdC5mcmVlemUoe1xuICBub25lOiAnbm9uZScsXG4gIGZhaWw6ICdmYWlsJyxcbiAgc3VjY2VzczogJ3N1Y2Nlc3MnLFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IENoZWNrO1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENoZWNrLFxuICBDaGVja1N0YXRlLFxufTtcbiJdfQ==