piper-utils 1.0.4 → 1.0.5-7.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/README.md +1 -119
- package/bin/main.js +137 -107
- package/bin/main.js.map +1 -1
- package/package.json +3 -4
- package/src/database/dbUtils/queryStringUtils/accessRightsUtils.js +82 -36
- package/src/database/dbUtils/queryStringUtils/accessRightsUtils.test.js +368 -216
- package/src/database/dbUtils/queryStringUtils/createFilters.js +36 -1
- package/src/database/dbUtils/queryStringUtils/createFilters.test.js +21 -3
- package/src/database/dbUtils/queryStringUtils/findAll.js +2 -1
- package/src/database/dbUtils/queryStringUtils/mocks/mocks.js +43 -0
- package/src/eventManager/handleEvents.js +31 -1
- package/src/eventManager/handleFile.js +20 -3
- package/src/eventManager/handleFile.test.js +32 -3
- package/src/eventManager/watchBucket.js +22 -3
- package/src/eventManager/watchBucket.test.js +119 -0
- package/src/index.js +10 -0
- package/src/requestResonse/requestResponse.js +43 -6
- package/src/requestResonse/requestResponse.test.js +10 -1
- package/webpack.config.js +1 -1
package/bin/main.js
CHANGED
|
@@ -52,14 +52,13 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.runMigra
|
|
|
52
52
|
\********************************************************************/
|
|
53
53
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
54
54
|
|
|
55
|
-
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.userRoles = undefined;exports.accessRightsUtils = accessRightsUtils;exports.userDefaultBid = userDefaultBid;exports.getBusinessesInfo = getBusinessesInfo;exports.getModuleInfo = getModuleInfo;exports.checkModule = checkModule;exports.checkWriteAccess = checkWriteAccess;var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);var _errorCodes = __webpack_require__(/*! ../../../requestResonse/errorCodes.js */ "./src/requestResonse/errorCodes.js");var _requestResponse = __webpack_require__(/*! ../../../requestResonse/requestResponse.js */ "./src/requestResonse/requestResponse.js");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
|
|
55
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.userRoles = undefined;exports.isSystemUser = isSystemUser;exports.accessRightsUtils = accessRightsUtils;exports.userDefaultBid = userDefaultBid;exports.getRequestedBusinessIds = getRequestedBusinessIds;exports.getAccessRightsInfo = getAccessRightsInfo;exports.getDefaultBusinessIDInfo = getDefaultBusinessIDInfo;exports.getBusinessesInfo = getBusinessesInfo;exports.getModuleInfo = getModuleInfo;exports.checkModule = checkModule;exports.checkWriteAccess = checkWriteAccess;var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);var _errorCodes = __webpack_require__(/*! ../../../requestResonse/errorCodes.js */ "./src/requestResonse/errorCodes.js");var _requestResponse = __webpack_require__(/*! ../../../requestResonse/requestResponse.js */ "./src/requestResonse/requestResponse.js");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function isSystemUser(event) {let jsonToParse = _lodash2.default.get(event, 'requestContext.authorizer.claims.custom:SYSTEM') || _lodash2.default.get(event, 'requestContext.authorizer.custom:SYSTEM') || 'false';let isSys = false;try {isSys = JSON.parse(jsonToParse);return isSys;} catch (e) {console.error('error with system user:', e);return false;}} /**
|
|
56
56
|
* Get the allowed businessIds for a user from the lambda event, compare it to businessIds, return what user has access to.
|
|
57
57
|
*
|
|
58
58
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
59
59
|
* @param {{useCognitoBid:boolean}} [options] - An object with options, useCognitoBid prefers the businessId set in cognito if set and does not return the local bid of 1 if a bid is in the claim.
|
|
60
60
|
* @returns {array} A list of businessIds that have been requested and are allowed to for some user.
|
|
61
|
-
*/function accessRightsUtils(event, options) {const useCognitoBid = _lodash2.default.get(options, 'useCognitoBid', false);const requestedBusinessIds = getRequestedBusinessIds(event);const allowedBusinessIds = getAllowedBusinessIds(event, useCognitoBid);
|
|
62
|
-
if (_lodash2.default.isEmpty(allowedBusinessIds) && !_lodash2.default.get(event, 'requestContext.authorizer.claims') && !_lodash2.default.get(event, 'requestContext.authorizer.custom:AR') && process.env.BUILD_ENV !== 'production' && process.env.BUILD_ENV !== 'staging') {if (requestedBusinessIds.length === 0) {return localBidList;} else {return _lodash2.default.intersection(requestedBusinessIds, localBidList);}} else if (requestedBusinessIds.length === 0) {return allowedBusinessIds;}return _lodash2.default.intersection(requestedBusinessIds, allowedBusinessIds);} /**
|
|
61
|
+
*/function accessRightsUtils(event, options) {const useCognitoBid = _lodash2.default.get(options, 'useCognitoBid', false);const requestedBusinessIds = getRequestedBusinessIds(event);const allowedBusinessIds = getAllowedBusinessIds(event, useCognitoBid);if (isSystemUser(event)) {return requestedBusinessIds;}if (requestedBusinessIds.length === 0) {return allowedBusinessIds;}return _lodash2.default.intersection(requestedBusinessIds, allowedBusinessIds);} /**
|
|
63
62
|
* Get the businessID set in cognito as custom:DBI.
|
|
64
63
|
*
|
|
65
64
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
@@ -69,13 +68,18 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.userRole
|
|
|
69
68
|
*
|
|
70
69
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
71
70
|
* @returns {array} The businessID requested by the query string
|
|
72
|
-
*/function getRequestedBusinessIds(event) {let requestedBusinessIds = _lodash2.default.get(event, 'queryStringParameters.businessIds', null);return requestedBusinessIds ? requestedBusinessIds.split(',') : [];} /**
|
|
71
|
+
*/function getRequestedBusinessIds(event) {let requestedBusinessIds = _lodash2.default.get(event, 'queryStringParameters.businessIds', null);const body = (0, _requestResponse.parseBody)(event);const bodyBid = body?.businessId;if (requestedBusinessIds) {return requestedBusinessIds ? requestedBusinessIds.split(',') : [];} else if (bodyBid) {return [bodyBid];} else {return [];}} /**
|
|
73
72
|
* Get the allowed businessIds for a user from cognito custom:AR property.
|
|
74
73
|
*
|
|
75
74
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
76
75
|
* @param useCognitoBid
|
|
77
76
|
* @returns {array} The businessID requested by the query string
|
|
78
|
-
*/function getAllowedBusinessIds(event, useCognitoBid) {const businesses = getBusinessesInfo(event, useCognitoBid);return Object.keys(businesses);}function
|
|
77
|
+
*/function getAllowedBusinessIds(event, useCognitoBid) {const businesses = getBusinessesInfo(event, useCognitoBid);return Object.keys(businesses);}function getAccessRightsInfo(event) {let jsonToParse = _lodash2.default.get(event, 'requestContext.authorizer.claims.custom:AR') || _lodash2.default.get(event, 'requestContext.authorizer.custom:AR') || '{}';const accessRights = JSON.parse(jsonToParse);return _lodash2.default.get(accessRights, 'businessIds', {});}function getDefaultBusinessIDInfo(event) {let jsonToParse = _lodash2.default.get(event, 'requestContext.authorizer.claims.custom:DBI') || _lodash2.default.get(event, 'requestContext.authorizer.custom:DBI') || '{}';const dbi = JSON.parse(jsonToParse);return _lodash2.default.get(dbi, 'defaultBid', {});}function getBusinessesInfo(event, useCognitoBid = false) {const json = _lodash2.default.get(event, 'requestContext.authorizer.claims.custom:AR') || _lodash2.default.get(event, 'requestContext.authorizer.custom:AR') || '{}';let businessIds = _lodash2.default.get(JSON.parse(json), 'businessIds', {}); // Local environment tweaks
|
|
78
|
+
if (process.env.BUILD_ENV === 'local') {let b;try {b = JSON.parse(event?.body);} catch (e) {}const bodyBid = b?.businessId; // Always inject the default local BID “1” unless the caller explicitly wants
|
|
79
|
+
// what Cognito says **and** Cognito actually returned something.
|
|
80
|
+
if (!useCognitoBid) {businessIds = { ...businessIds, '1': 'A' };} // If Cognito gave no BIDs at all, fall back to the local default.
|
|
81
|
+
if ((0, _lodash.isEmpty)(businessIds)) {businessIds = { '1': 'A' };} // a businessId is found on the body for local allow it
|
|
82
|
+
if (bodyBid) {businessIds[bodyBid] = 'A';}}return businessIds;} /**
|
|
79
83
|
* Get the modules listed in custom:MOD.
|
|
80
84
|
*
|
|
81
85
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
@@ -86,10 +90,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.userRole
|
|
|
86
90
|
* @param {string} moduleName - A sting name for a module.
|
|
87
91
|
* @param {object} event - The lambda event passed in by a validated api request.
|
|
88
92
|
* @returns {array} The Module access list
|
|
89
|
-
*/function checkModule(moduleName, event) {const moduleRights = getModuleInfo(event);let allowAccess = _lodash2.default.get(moduleRights, moduleName, false);if (process.env.BUILD_ENV === 'local') {return;}if (!allowAccess) {throw _errorCodes.errorList.unauthorized;}}const userRoles = exports.userRoles = { admin: 'A', read: 'R', write: 'W' }; /**
|
|
93
|
+
*/function checkModule(moduleName, event) {const moduleRights = getModuleInfo(event);let allowAccess = _lodash2.default.get(moduleRights, moduleName, false);if (isSystemUser(event)) {return;}if (process.env.BUILD_ENV === 'local') {return;}if (!allowAccess) {throw _errorCodes.errorList.unauthorized;}}const userRoles = exports.userRoles = { admin: 'A', read: 'R', write: 'W' }; /**
|
|
90
94
|
* @param {{body: string}} event
|
|
95
|
+
* @param {{useCognitoBid:boolean}} [options] - An object with options, useCognitoBid prefers the businessId set in cognito if set and does not return the local bid of 1 if a bid is in the claim.
|
|
91
96
|
* @returns {string} businessId
|
|
92
|
-
*/function checkWriteAccess(event) {const eventBody = (0, _requestResponse.parseBody)(event);const businessIds = accessRightsUtils(event) || [];const businessId = businessIds.find((id) => id === eventBody.businessId);const raw = getBusinessesInfo(event);const userRight = raw[businessId];if (process.env.BUILD_ENV === 'local') {return eventBody.businessId;}if (userRight !== userRoles.admin && userRight !== userRoles.write || !userRight) {throw _errorCodes.errorList.unauthorized;}return businessId;}
|
|
97
|
+
*/function checkWriteAccess(event, options) {const eventBody = (0, _requestResponse.parseBody)(event);const businessIds = accessRightsUtils(event, options) || [];const businessId = businessIds.find((id) => id === eventBody.businessId);const raw = getBusinessesInfo(event);const userRight = raw[businessId];if (isSystemUser(event)) {return eventBody.businessId;}if (process.env.BUILD_ENV === 'local') {return eventBody.businessId;}if (userRight !== userRoles.admin && userRight !== userRoles.write || !userRight) {throw _errorCodes.errorList.unauthorized;}return businessId;}
|
|
93
98
|
|
|
94
99
|
/***/ }),
|
|
95
100
|
|
|
@@ -114,6 +119,7 @@ var _accessRightsUtils = __webpack_require__(/*! ./accessRightsUtils.js */ "./sr
|
|
|
114
119
|
*/
|
|
115
120
|
const createFilters = exports.createFilters = function (event, objectFilters) {
|
|
116
121
|
let query = _lodash2.default.get(event, 'queryStringParameters', {}) || {};
|
|
122
|
+
const searchString = _lodash2.default.get(query, 'searchString');
|
|
117
123
|
const startDate = _lodash2.default.get(query, 'startDate');
|
|
118
124
|
const endDate = _lodash2.default.get(query, 'endDate');
|
|
119
125
|
const where = Object.keys(query).reduce((acc, item) => {
|
|
@@ -187,6 +193,40 @@ const createFilters = exports.createFilters = function (event, objectFilters) {
|
|
|
187
193
|
filterAdds.createdAt = dates;
|
|
188
194
|
}
|
|
189
195
|
|
|
196
|
+
if (searchString) {
|
|
197
|
+
const adds = Object.keys(objectFilters).reduce((acc, item) => {
|
|
198
|
+
const type = objectFilters[item].filterType;
|
|
199
|
+
const dataType = objectFilters[item].type;
|
|
200
|
+
|
|
201
|
+
if (type === _sequelize2.default.Op.iLike) {
|
|
202
|
+
const newOr = {};
|
|
203
|
+
const itemName = item.includes('.') ?
|
|
204
|
+
`$${item}$` :
|
|
205
|
+
item;
|
|
206
|
+
newOr[itemName] = {
|
|
207
|
+
[_sequelize2.default.Op.iLike]: `%${query['searchString']}%`
|
|
208
|
+
};
|
|
209
|
+
acc.push(newOr);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (!_lodash2.default.isNaN(Number(query['searchString'])) && !(dataType instanceof _sequelize2.default.BOOLEAN)) {
|
|
213
|
+
|
|
214
|
+
if (type === _sequelize2.default.Op.eq) {
|
|
215
|
+
const newOr = {};
|
|
216
|
+
const itemName = item.includes('.') ? `$${item}$` : item;
|
|
217
|
+
newOr[itemName] = {
|
|
218
|
+
[_sequelize2.default.Op.eq]: `${query['searchString']}`
|
|
219
|
+
};
|
|
220
|
+
acc.push(newOr);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
return acc;
|
|
225
|
+
}, []);
|
|
226
|
+
|
|
227
|
+
filterAdds[_sequelize2.default.Op.or] = adds;
|
|
228
|
+
}
|
|
229
|
+
|
|
190
230
|
const withDate = Object.assign(where, filterAdds);
|
|
191
231
|
|
|
192
232
|
return withDate;
|
|
@@ -194,6 +234,23 @@ const createFilters = exports.createFilters = function (event, objectFilters) {
|
|
|
194
234
|
|
|
195
235
|
/***/ }),
|
|
196
236
|
|
|
237
|
+
/***/ "./src/database/dbUtils/queryStringUtils/createIncludes.js":
|
|
238
|
+
/*!*****************************************************************!*\
|
|
239
|
+
!*** ./src/database/dbUtils/queryStringUtils/createIncludes.js ***!
|
|
240
|
+
\*****************************************************************/
|
|
241
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
242
|
+
|
|
243
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.createIncludes = createIncludes;exports.includeSubItem = includeSubItem;var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
|
|
244
|
+
* Create sequelize includes array from query string parameters and default sequelize model
|
|
245
|
+
*
|
|
246
|
+
* @param {object} event - the query parameters from the event passed by lambda
|
|
247
|
+
* @param {object} objectFilters - the default filters object created by createDefaultFilters
|
|
248
|
+
* @returns {object} A sequelize includes array
|
|
249
|
+
*/function createIncludes(event, objectFilters) {const query = _lodash2.default.get(event, 'queryStringParameters', {}) || {};const keys = Object.keys(objectFilters);const canBeIncluded = keys.reduce((acc, item) => {acc = includeSubItem(item, acc);return acc;}, []);const askedForInQuery = Object.keys(query).reduce((acc, item) => {if (item === 'sort') {query[item].split(',').forEach((sortItem) => {sortItem = sortItem.indexOf('-') === 0 ? sortItem.substr(1) : sortItem;acc = includeSubItem(sortItem, acc);});}acc = includeSubItem(item, acc);return acc;}, []);return _lodash2.default.intersection(canBeIncluded, askedForInQuery);}function includeSubItem(queryStringItem, acc = []) {const dot = queryStringItem.indexOf('.');if (dot > 0) {acc.push(queryStringItem.substring(0, dot));}return acc;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/***/ }),
|
|
253
|
+
|
|
197
254
|
/***/ "./src/database/dbUtils/queryStringUtils/createSort.js":
|
|
198
255
|
/*!*************************************************************!*\
|
|
199
256
|
!*** ./src/database/dbUtils/queryStringUtils/createSort.js ***!
|
|
@@ -335,7 +392,8 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.getPagin
|
|
|
335
392
|
* wrapper for Sequelize findAll
|
|
336
393
|
* @param {object} model - instance of Sequelize (must be initialized)
|
|
337
394
|
* @param {*&{include: [{model: *}], where: {businessId: Array}, order: [string[]]}} options - instance of Sequelize (must be initialized)
|
|
338
|
-
*/async function findAll(model, options) {const limit = options.limit || 0;const
|
|
395
|
+
*/async function findAll(model, options) {const limit = options.limit || 0;const includes = options.includes || { all: true, nested: true };const findArgs = Object.assign({ include: includes }, options, { limit: limit + 1 });const results = await model.findAll(findArgs);return getPaginationFromFindAll(results, limit, options.offset);}const findUtils = {
|
|
396
|
+
findAll
|
|
339
397
|
};exports["default"] =
|
|
340
398
|
findUtils;
|
|
341
399
|
|
|
@@ -372,7 +430,7 @@ dynamoUtil;
|
|
|
372
430
|
\******************************************/
|
|
373
431
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
374
432
|
|
|
375
|
-
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.handleEvents = handleEvents;var _handleFile = __webpack_require__(/*! ./handleFile.js */ "./src/eventManager/handleFile.js");var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);var _bluebird = __webpack_require__(/*! bluebird */ "bluebird");var _bluebird2 = _interopRequireDefault(_bluebird);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function handleEvents(event, transformer, errorHandlerPerFile, shouldSkipFailedFolders = false, userImportTypes) {
|
|
433
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.handleEvents = handleEvents;exports.handleDirectS3WriteEvent = handleDirectS3WriteEvent;var _handleFile = __webpack_require__(/*! ./handleFile.js */ "./src/eventManager/handleFile.js");var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);var _bluebird = __webpack_require__(/*! bluebird */ "bluebird");var _bluebird2 = _interopRequireDefault(_bluebird);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}function handleEvents(event, transformer, errorHandlerPerFile, shouldSkipFailedFolders = false, userImportTypes) {if (!event || !event.Records) {return _bluebird2.default.resolve();}let hasErrors = false;return _bluebird2.default.map(event.Records, (record) => {const snsInfo = JSON.parse(_lodash2.default.get(record, 'Sns.Message', '{}'));const s3Bucket = snsInfo.bucket;const files = snsInfo.files || [];return _bluebird2.default.map(files, (file) => {let path = decodeURIComponent(file);if (path) {return (0, _handleFile.handleFile)(path, s3Bucket, transformer, { shouldSkipFailedFolders, userImportTypes }).catch((err) => {console.error('###############--@--->', err);if (errorHandlerPerFile && !errorHandlerPerFile(err, path)) {console.error('HANDLE-FILE-CATCH: ', err);hasErrors = true;}});}});}).then(() => {if (hasErrors) {throw 'ERROR: HANDLE-FILE';}});}function handleDirectS3WriteEvent(event, transformer, errorHandlerPerFile, shouldSkipFailedFolders = false, userImportTypes) {
|
|
376
434
|
if (!event || !event.Records) {
|
|
377
435
|
return _bluebird2.default.resolve();
|
|
378
436
|
}
|
|
@@ -380,23 +438,22 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.handleEv
|
|
|
380
438
|
let hasErrors = false;
|
|
381
439
|
|
|
382
440
|
return _bluebird2.default.map(event.Records, (record) => {
|
|
383
|
-
const
|
|
384
|
-
const
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
});
|
|
441
|
+
const s3Bucket = record.s3.bucket.name;
|
|
442
|
+
const file = record.s3.object.key || [];
|
|
443
|
+
|
|
444
|
+
let path = decodeURIComponent(file);
|
|
445
|
+
if (path) {
|
|
446
|
+
return (0, _handleFile.handleFile)(path, s3Bucket, transformer, { shouldSkipFailedFolders, userImportTypes }).catch((err) => {
|
|
447
|
+
if (errorHandlerPerFile && !errorHandlerPerFile(err, path)) {
|
|
448
|
+
console.error('HANDLE-FILE-CATCH:', err);
|
|
449
|
+
hasErrors = true;
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
|
|
397
454
|
}).then(() => {
|
|
398
455
|
if (hasErrors) {
|
|
399
|
-
throw '
|
|
456
|
+
throw 'ERROR: HANDLE-FILE (DIRECT S3 EVENT)';
|
|
400
457
|
}
|
|
401
458
|
});
|
|
402
459
|
}
|
|
@@ -409,78 +466,11 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.handleEv
|
|
|
409
466
|
\****************************************/
|
|
410
467
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
411
468
|
|
|
412
|
-
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.handleFile = handleFile;var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);var _S3Utils = __webpack_require__(/*! ../s3/S3Utils.js/S3Utils.js */ "./src/s3/S3Utils.js/S3Utils.js");var _S3Utils2 = _interopRequireDefault(_S3Utils);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}async function handleFile(path, s3Bucket, transformer, options) {
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
const
|
|
416
|
-
|
|
417
|
-
Key: path
|
|
418
|
-
};
|
|
419
|
-
let body = '{}';
|
|
420
|
-
try {
|
|
421
|
-
body = await _S3Utils2.default.getObject(params);
|
|
422
|
-
const parsedBody = JSON.parse(body);
|
|
423
|
-
const returnedValue = await transformer(parsedBody);
|
|
424
|
-
await _S3Utils2.default.deleteObject(params);
|
|
425
|
-
|
|
426
|
-
return returnedValue;
|
|
427
|
-
} catch (error) {
|
|
428
|
-
console.error('handle-file-error', error);
|
|
429
|
-
|
|
430
|
-
if (error.code === 'NoSuchKey' || !body) {
|
|
431
|
-
return;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
let newPath = '';
|
|
435
|
-
|
|
436
|
-
if (userImportTypes) {
|
|
437
|
-
// look for items in the userImportTypes
|
|
438
|
-
const usersImports = Object.values(userImportTypes);
|
|
439
|
-
const items = path.split('/');
|
|
440
|
-
const fileName = _lodash2.default.last(items);
|
|
441
|
-
const folderName = _lodash2.default.first(items);
|
|
442
|
-
|
|
443
|
-
if (usersImports.indexOf(folderName) > -1) {
|
|
444
|
-
if (shouldSkipFailedFolders) {
|
|
445
|
-
newPath = `${folderName}/error/${fileName}`;
|
|
446
|
-
} else if (_lodash2.default.startsWith(path, `${folderName}/failed-once/`)) {
|
|
447
|
-
newPath = _lodash2.default.replace(path, `${folderName}/failed-once/`, `${folderName}/failed-twice/`);
|
|
448
|
-
} else if (_lodash2.default.startsWith(path, `${folderName}/failed-twice/`)) {
|
|
449
|
-
newPath = _lodash2.default.replace(path, `${folderName}/failed-twice/`, `${folderName}/error/`);
|
|
450
|
-
} else {
|
|
451
|
-
newPath = `${folderName}/failed-once/${fileName}`;
|
|
452
|
-
}
|
|
453
|
-
} else {
|
|
454
|
-
newPath = `pathAndEventMisMatchError/${path}`;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
} else {
|
|
458
|
-
if (shouldSkipFailedFolders) {
|
|
459
|
-
newPath = `error/${path}`;
|
|
460
|
-
} else if (_lodash2.default.startsWith(path, 'failed-once/')) {
|
|
461
|
-
newPath = _lodash2.default.replace(path, 'failed-once/', 'failed-twice/');
|
|
462
|
-
} else if (_lodash2.default.startsWith(path, 'failed-twice/')) {
|
|
463
|
-
newPath = _lodash2.default.replace(path, 'failed-twice/', 'error/');
|
|
464
|
-
} else {
|
|
465
|
-
if (_lodash2.default.includes(path, 'delayUntil/')) {
|
|
466
|
-
path = _lodash2.default.last(path.split('/'));
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
newPath = `failed-once/${path}`;
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
const newParams = {
|
|
474
|
-
Bucket: s3Bucket,
|
|
475
|
-
Key: newPath,
|
|
476
|
-
Body: body
|
|
477
|
-
};
|
|
478
|
-
|
|
479
|
-
await _S3Utils2.default.putObject(newParams);
|
|
480
|
-
await _S3Utils2.default.deleteObject(params);
|
|
481
|
-
|
|
482
|
-
throw error;
|
|
483
|
-
}
|
|
469
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.handleFile = handleFile;exports.containsErrorTwice = containsErrorTwice;var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);var _S3Utils = __webpack_require__(/*! ../s3/S3Utils.js/S3Utils.js */ "./src/s3/S3Utils.js/S3Utils.js");var _S3Utils2 = _interopRequireDefault(_S3Utils);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}async function handleFile(path, s3Bucket, transformer, options) {const shouldSkipFailedFolders = _lodash2.default.get(options, 'shouldSkipFailedFolders');const userImportTypes = _lodash2.default.get(options, 'userImportTypes');const params = { Bucket: s3Bucket, Key: path };let body = '{}';try {const s3r = await _S3Utils2.default.getObject(params);console.log('------->s3r', s3r);body = s3r;const parsedBody = JSON.parse(body);console.log('------->parsedBody-if this is empty body we need to skip transform?', parsedBody);const returnedValue = await transformer(parsedBody);await _S3Utils2.default.deleteObject(params);return returnedValue;} catch (error) {console.error('HANDLE-FILE-ERROR', error);if (error.code === 'NoSuchKey' || !body) {return;}let newPath = '';if (userImportTypes) {console.log('USER IMPORT'); // look for items in the userImportTypes
|
|
470
|
+
const usersImports = Object.values(userImportTypes);const items = path.split('/');const fileName = _lodash2.default.last(items);const folderName = _lodash2.default.first(items);if (usersImports.indexOf(folderName) > -1) {if (shouldSkipFailedFolders) {newPath = `${folderName}/error/${fileName}`;} else if (_lodash2.default.startsWith(path, `${folderName}/failed-once/`)) {newPath = _lodash2.default.replace(path, `${folderName}/failed-once/`, `${folderName}/failed-twice/`);} else if (_lodash2.default.startsWith(path, `${folderName}/failed-twice/`)) {newPath = _lodash2.default.replace(path, `${folderName}/failed-twice/`, `${folderName}/error/`);} else {newPath = `${folderName}/failed-once/${fileName}`;}} else {newPath = `pathAndEventMisMatchError/${path}`;}} else {if (shouldSkipFailedFolders) {newPath = `error/${path}`;} else if (_lodash2.default.startsWith(path, 'failed-once/')) {newPath = _lodash2.default.replace(path, 'failed-once/', 'failed-twice/');} else if (_lodash2.default.startsWith(path, 'failed-twice/')) {newPath = _lodash2.default.replace(path, 'failed-twice/', 'error/');} else {if (_lodash2.default.includes(path, 'delayUntil/')) {path = _lodash2.default.last(path.split('/'));}newPath = `failed-once/${path}`;}}const newParams = { Bucket: s3Bucket, Key: newPath, Body: body };if (containsErrorTwice(newPath, 'failed-once') || containsErrorTwice(newPath, 'failed-twice') || containsErrorTwice(newPath, 'error')) {throw 'NESTING ERROR';}await _S3Utils2.default.putObject(newParams);await _S3Utils2.default.deleteObject(params);throw error;}}function containsErrorTwice(str, val) {const firstIndex = str.toLowerCase().indexOf(val);
|
|
471
|
+
if (firstIndex === -1) return false;
|
|
472
|
+
const secondIndex = str.toLowerCase().indexOf(val, firstIndex + 1);
|
|
473
|
+
return secondIndex !== -1;
|
|
484
474
|
}
|
|
485
475
|
|
|
486
476
|
/***/ }),
|
|
@@ -538,6 +528,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.loop = l
|
|
|
538
528
|
|
|
539
529
|
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.watchBucket = watchBucket;var _publishEvents = __webpack_require__(/*! ./publishEvents.js */ "./src/eventManager/publishEvents.js");var _handleEvents = __webpack_require__(/*! ./handleEvents.js */ "./src/eventManager/handleEvents.js");var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
|
|
540
530
|
* bucket watcher watches a s3 bucket and publishes events to a sns topic, this allows you to process files in s3 with a some transformer function
|
|
531
|
+
* prefix objects with DIRECT to listen to direct s3 events
|
|
541
532
|
*
|
|
542
533
|
* @param {object} params - The parameters for watchBucket, see below
|
|
543
534
|
* @param {object} params.event - The event of the lambda
|
|
@@ -548,12 +539,29 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.watchBuc
|
|
|
548
539
|
* @param {function} params.transformer - the function to run on each file
|
|
549
540
|
* @param {function} [params.errorHandlerPerFile] - the function to run on as a catch on each file
|
|
550
541
|
* @param {boolean} [params.shouldSkipFailedFolders] - whether to use the failed-once, failed-twice, error or just error folders
|
|
551
|
-
* @param {object} [params.userImportTypes] - user import
|
|
542
|
+
* @param {object} [params.userImportTypes] - user import subdirectories object map
|
|
552
543
|
*/function watchBucket({ event, dynamoConfigTable, dynamoConfigKey, s3Bucket, snsTopic, transformer, errorHandlerPerFile = _lodash2.default.noop, shouldSkipFailedFolders = false, userImportTypes }) {if (!event || !dynamoConfigTable || !dynamoConfigKey || !s3Bucket || !snsTopic || !transformer) {throw new Error('Missing required parameters. Need event, dynamoConfigTable, dynamoConfigKey, s3Bucket, snsTopic, transformer');}
|
|
544
|
+
const EventSource = _lodash2.default.get(event, 'Records[0].eventSource') || _lodash2.default.get(event, 'Records[0].EventSource');
|
|
553
545
|
|
|
554
|
-
const EventSource = _lodash2.default.get(event, 'Records[0].EventSource');
|
|
555
546
|
if (_lodash2.default.isEqual(EventSource, 'aws:sns')) {
|
|
556
547
|
return (0, _handleEvents.handleEvents)(event, transformer, errorHandlerPerFile, shouldSkipFailedFolders, userImportTypes);
|
|
548
|
+
} else if (_lodash2.default.isEqual(EventSource, 'aws:s3')) {
|
|
549
|
+
const failedOnce = 'failed-once';
|
|
550
|
+
const failedTwice = 'failed-twice';
|
|
551
|
+
const error = 'error';
|
|
552
|
+
const direct = 'DIRECT';
|
|
553
|
+
const key = _lodash2.default.get(event, 'Records[0].s3.object.key') || '';
|
|
554
|
+
const startsWithDirect = _lodash2.default.startsWith(key, direct);
|
|
555
|
+
if (key.includes(failedOnce) || key.includes(failedTwice) || key.includes(error)) {
|
|
556
|
+
// this used to throw, but the throw raised useless alarms, I believed turing throw in to a return was ok
|
|
557
|
+
return;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
if (startsWithDirect) {
|
|
561
|
+
console.log('------->DIRECT WRITE FIRE');
|
|
562
|
+
return (0, _handleEvents.handleDirectS3WriteEvent)(event, transformer, errorHandlerPerFile, shouldSkipFailedFolders, userImportTypes);
|
|
563
|
+
}
|
|
564
|
+
|
|
557
565
|
} else {
|
|
558
566
|
// the function is being run from the cron job so publish SNS events
|
|
559
567
|
return (0, _publishEvents.publishEvents)(dynamoConfigTable, dynamoConfigKey, s3Bucket, snsTopic, userImportTypes);
|
|
@@ -709,27 +717,27 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));const errorList
|
|
|
709
717
|
\***********************************************/
|
|
710
718
|
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
711
719
|
|
|
712
|
-
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.success = success;exports.successHtml = successHtml;exports.getCurrentUserNameFromCognitoEvent = getCurrentUserNameFromCognitoEvent;exports.getCurrentUser = getCurrentUser;exports.failure = failure;exports.parseBody = parseBody;exports.parseEvent = parseEvent;exports.detectSequelizeError = detectSequelizeError;exports.detectJoyError = detectJoyError;var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);var _errorCodes = __webpack_require__(/*! ./errorCodes.js */ "./src/requestResonse/errorCodes.js");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
|
|
720
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.success = success;exports.successHtml = successHtml;exports.getCurrentUserNameFromCognitoEvent = getCurrentUserNameFromCognitoEvent;exports.getCurrentUser = getCurrentUser;exports.failure = failure;exports.parseBody = parseBody;exports.parseEvent = parseEvent;exports.detectSequelizeError = detectSequelizeError;exports.detectJoyError = detectJoyError;exports.detectDynamooseError = detectDynamooseError;var _lodash = __webpack_require__(/*! lodash */ "lodash");var _lodash2 = _interopRequireDefault(_lodash);var _errorCodes = __webpack_require__(/*! ./errorCodes.js */ "./src/requestResonse/errorCodes.js");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };} /**
|
|
713
721
|
* @param {Object} body
|
|
714
|
-
* @param {{}} options
|
|
722
|
+
* @param {{dbClose?:function}} [options]
|
|
715
723
|
*/function success(body, options) {const dbClose = _lodash2.default.get(options, 'dbClose', _lodash2.default.noop);dbClose();return buildResponse(200, body);} /**
|
|
716
724
|
* @param {string} html
|
|
717
725
|
* @param {{dbClose:function|undefined}} options
|
|
718
726
|
*/function successHtml(html, options) {const dbClose = _lodash2.default.get(options, 'dbClose', _lodash2.default.noop);dbClose();return { statusCode: 200, headers: { 'Content-Type': 'text/html', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': true }, body: html };} /**
|
|
719
727
|
* @param {string} event
|
|
720
728
|
* @returns string
|
|
721
|
-
*/function getCurrentUserNameFromCognitoEvent(event) {const attributes = _lodash2.default.get(event, 'request.userAttributes');return attributes['cognito:email_alias'] || 'UNKNOWN USER';} /**
|
|
729
|
+
*/function getCurrentUserNameFromCognitoEvent(event) {const attributes = _lodash2.default.get(event, 'request.userAttributes');return attributes['cognito:email_alias'] || attributes['email'] || 'UNKNOWN USER';} /**
|
|
722
730
|
* Get the user information from the event object
|
|
723
731
|
*
|
|
724
732
|
* @param event {Object} an event object
|
|
725
733
|
* @returns {{username: string, id: number}}
|
|
726
|
-
*/function getCurrentUser(event) {let jsonToParse = _lodash2.default.get(event, 'requestContext.authorizer.claims.custom:UID') || _lodash2.default.get(event, 'requestContext.authorizer.custom:UID') || '0';const id = JSON.parse(jsonToParse);const username = _lodash2.default.get(event, 'requestContext.authorizer.claims.email') || _lodash2.default.get(event, 'requestContext.authorizer.email') || '
|
|
734
|
+
*/function getCurrentUser(event) {let jsonToParse = _lodash2.default.get(event, 'requestContext.authorizer.claims.custom:UID') || _lodash2.default.get(event, 'requestContext.authorizer.custom:UID') || '0';const id = JSON.parse(jsonToParse);const username = _lodash2.default.get(event, 'requestContext.authorizer.claims.email') || _lodash2.default.get(event, 'requestContext.authorizer.email') || 'localtestuser@gexample.com';return { username, id };} /**
|
|
727
735
|
* Create a failure response
|
|
728
736
|
*
|
|
729
737
|
* @param body {Object} an event object
|
|
730
738
|
* @param options {Object} an options object
|
|
731
739
|
* @returns {{statusCode:number, headers:object, body:string}} a response object
|
|
732
|
-
*/function failure(body = {}, options) {const dbClose = _lodash2.default.get(options, 'dbClose', _lodash2.default.noop);dbClose();let cleanedErrorBody;if (process.env.UTIL_LOG === 'LOG_ALL') {console.error('------->UTIL ERROR:', body);}const NORMAL_ERROR = { statusCode: 500, errorCode: '5XX', message: 'INTERNAL UTIL ERROR' };cleanedErrorBody = body;if (!_lodash2.default.isUndefined(body.details)) {cleanedErrorBody = detectJoyError(body);} else if (_lodash2.default.isUndefined(body.errorCode) || _lodash2.default.isUndefined(body.statusCode)) {cleanedErrorBody = detectSequelizeError(body);}if (_lodash2.default.get(body, 'response.data.message')) {console.error('------->UTIL ERROR: ' + _lodash2.default.get(body, 'response.data.message'));}const newBody = _lodash2.default.merge(NORMAL_ERROR, cleanedErrorBody);return buildResponse(newBody.statusCode, newBody);} /**
|
|
740
|
+
*/function failure(body = {}, options) {const dbClose = _lodash2.default.get(options, 'dbClose', _lodash2.default.noop);dbClose();let cleanedErrorBody;if (process.env.UTIL_LOG === 'LOG_ALL' || process.env.BUILD_ENV === 'test') {console.error('------->UTIL ERROR:', body);}const NORMAL_ERROR = { statusCode: 500, errorCode: '5XX', message: 'INTERNAL UTIL ERROR' };cleanedErrorBody = body;if (!_lodash2.default.isUndefined(body.details)) {cleanedErrorBody = detectJoyError(body);} else if (_lodash2.default.isUndefined(body.errorCode) || _lodash2.default.isUndefined(body.statusCode)) {cleanedErrorBody = detectSequelizeError(body);}if (_lodash2.default.get(body, 'response.data.message')) {console.error('------->UTIL ERROR: ' + _lodash2.default.get(body, 'response.data.message'));}const newBody = _lodash2.default.merge(NORMAL_ERROR, cleanedErrorBody);return buildResponse(newBody.statusCode, newBody);} /**
|
|
733
741
|
* Create a failure response object
|
|
734
742
|
*
|
|
735
743
|
* @param statusCode {Number} a status code
|
|
@@ -755,7 +763,19 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));exports.success
|
|
|
755
763
|
*
|
|
756
764
|
* @param body {object} part of a body response
|
|
757
765
|
* @returns error message object {message:string}
|
|
758
|
-
*/function detectSequelizeError(body) {const errorBody = {};let sequelizeError = _lodash2.default.get(body, 'errors', []).reduce((acc, err) => {acc = acc + ' ' + _lodash2.default.get(err, 'message');return acc;}, '');const parentError = _lodash2.default.get(body, 'parent', '');sequelizeError = sequelizeError + _lodash2.default.get(body, 'original.detail', '') + _lodash2.default.get(body, 'TypeError', '') + parentError;errorBody.message = sequelizeError.trim();return errorBody;}function detectJoyError(body) {const errorBody = {};const joyError = _lodash2.default.get(body, 'details[0]', {});console.error('USER VALIDATION ERROR:', body);errorBody.message = joyError.message;errorBody.statusCode = 400;errorBody.errorCode = '4000';return errorBody;}
|
|
766
|
+
*/function detectSequelizeError(body) {const errorBody = {};let sequelizeError = _lodash2.default.get(body, 'errors', []).reduce((acc, err) => {acc = acc + ' ' + _lodash2.default.get(err, 'message');return acc;}, '');const parentError = _lodash2.default.get(body, 'parent', '');sequelizeError = sequelizeError + _lodash2.default.get(body, 'original.detail', '') + _lodash2.default.get(body, 'TypeError', '') + parentError;errorBody.message = sequelizeError.trim();return errorBody;}function detectJoyError(body) {const errorBody = {};const joyError = _lodash2.default.get(body, 'details[0]', {});console.error('USER VALIDATION ERROR:', body);errorBody.message = joyError.message;errorBody.statusCode = 400;errorBody.errorCode = '4000';return errorBody;} /**
|
|
767
|
+
* Parse the body of a Dynamoose error response.
|
|
768
|
+
* Attempts to extract a human-readable error message from Dynamoose errors.
|
|
769
|
+
* This is a fallback for unknown database errors.
|
|
770
|
+
*
|
|
771
|
+
* @param {object} body - Part of a body response containing error details.
|
|
772
|
+
* @returns {object} - Error message object { message: string }
|
|
773
|
+
*/function detectDynamooseError(body) {const errorBody = {}; // Start with an empty message string.
|
|
774
|
+
let dynamooseError = ''; // If the error body contains an array of errors, concatenate their messages.
|
|
775
|
+
if (Array.isArray(body.errors)) {dynamooseError += body.errors.reduce((acc, err) => {return acc + ' ' + (err.message || '');}, '');} // If there's a top-level message, add it.
|
|
776
|
+
if (body.message) {dynamooseError += ' ' + body.message;} // If there is any additional detail provided, append it.
|
|
777
|
+
if (body.detail) {dynamooseError += ' ' + body.detail;} // Trim the message to remove extra spaces.
|
|
778
|
+
errorBody.message = dynamooseError.trim();return errorBody;}
|
|
759
779
|
|
|
760
780
|
/***/ }),
|
|
761
781
|
|
|
@@ -941,19 +961,23 @@ module.exports = require("umzug");
|
|
|
941
961
|
/******/
|
|
942
962
|
/************************************************************************/
|
|
943
963
|
var __webpack_exports__ = {};
|
|
944
|
-
// This entry need to be wrapped in an IIFE because it
|
|
964
|
+
// This entry need to be wrapped in an IIFE because it uses a non-standard name for the exports (exports).
|
|
945
965
|
(() => {
|
|
946
966
|
var exports = __webpack_exports__;
|
|
947
967
|
/*!**********************!*\
|
|
948
968
|
!*** ./src/index.js ***!
|
|
949
969
|
\**********************/
|
|
950
|
-
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.checkWriteAccess = exports.userDefaultBid = exports.getBusinessesInfo = exports.parseEvent = exports.parseBody = exports.accessRightsUtils = exports.defaultFilters = exports.getCurrentUserNameFromCognitoEvent = exports.successHtml = exports.getCurrentUser = exports.runMigrations = exports.success = exports.failure = exports.checkModule = exports.findAll = exports.createSort = exports.createFilters = exports.publishEvents = exports.watchBucket = exports.handleFile = undefined;var _handleFile = __webpack_require__(/*! ./eventManager/handleFile.js */ "./src/eventManager/handleFile.js");
|
|
970
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));exports.isSystemUser = exports.checkWriteAccess = exports.userDefaultBid = exports.getBusinessesInfo = exports.parseEvent = exports.parseBody = exports.accessRightsUtils = exports.defaultFilters = exports.getCurrentUserNameFromCognitoEvent = exports.successHtml = exports.getCurrentUser = exports.runMigrations = exports.success = exports.failure = exports.getModuleInfo = exports.getDefaultBusinessIDInfo = exports.getAccessRightsInfo = exports.checkModule = exports.findAll = exports.createSort = exports.createIncludes = exports.createFilters = exports.publishEvents = exports.watchBucket = exports.handleFile = undefined;var _handleFile = __webpack_require__(/*! ./eventManager/handleFile.js */ "./src/eventManager/handleFile.js");
|
|
951
971
|
var _watchBucket = __webpack_require__(/*! ./eventManager/watchBucket.js */ "./src/eventManager/watchBucket.js");
|
|
952
972
|
var _publishEvents = __webpack_require__(/*! ./eventManager/publishEvents.js */ "./src/eventManager/publishEvents.js");
|
|
973
|
+
var _createIncludes = __webpack_require__(/*! ./database/dbUtils/queryStringUtils/createIncludes.js */ "./src/database/dbUtils/queryStringUtils/createIncludes.js");
|
|
953
974
|
var _createFilters = __webpack_require__(/*! ./database/dbUtils/queryStringUtils/createFilters.js */ "./src/database/dbUtils/queryStringUtils/createFilters.js");
|
|
954
975
|
var _createSort = __webpack_require__(/*! ./database/dbUtils/queryStringUtils/createSort.js */ "./src/database/dbUtils/queryStringUtils/createSort.js");
|
|
955
976
|
var _findAll = __webpack_require__(/*! ./database/dbUtils/queryStringUtils/findAll.js */ "./src/database/dbUtils/queryStringUtils/findAll.js");
|
|
956
977
|
var _accessRightsUtils = __webpack_require__(/*! ./database/dbUtils/queryStringUtils/accessRightsUtils.js */ "./src/database/dbUtils/queryStringUtils/accessRightsUtils.js");
|
|
978
|
+
|
|
979
|
+
|
|
980
|
+
|
|
957
981
|
var _requestResponse = __webpack_require__(/*! ./requestResonse/requestResponse.js */ "./src/requestResonse/requestResponse.js");
|
|
958
982
|
var _migrations = __webpack_require__(/*! ./database/dbSetup/migrations.js */ "./src/database/dbSetup/migrations.js");
|
|
959
983
|
|
|
@@ -967,13 +991,18 @@ var _defaultFilters = __webpack_require__(/*! ./database/dbUtils/queryStringUtil
|
|
|
967
991
|
|
|
968
992
|
|
|
969
993
|
|
|
994
|
+
|
|
970
995
|
const handleFile = exports.handleFile = _handleFile.handleFile;
|
|
971
996
|
const watchBucket = exports.watchBucket = _watchBucket.watchBucket;
|
|
972
997
|
const publishEvents = exports.publishEvents = _publishEvents.publishEvents;
|
|
973
998
|
const createFilters = exports.createFilters = _createFilters.createFilters;
|
|
999
|
+
const createIncludes = exports.createIncludes = _createIncludes.createIncludes;
|
|
974
1000
|
const createSort = exports.createSort = _createSort.createSort;
|
|
975
1001
|
const findAll = exports.findAll = _findAll.findAll;
|
|
976
1002
|
const checkModule = exports.checkModule = _accessRightsUtils.checkModule;
|
|
1003
|
+
const getAccessRightsInfo = exports.getAccessRightsInfo = _accessRightsUtils.getAccessRightsInfo;
|
|
1004
|
+
const getDefaultBusinessIDInfo = exports.getDefaultBusinessIDInfo = _accessRightsUtils.getDefaultBusinessIDInfo;
|
|
1005
|
+
const getModuleInfo = exports.getModuleInfo = _accessRightsUtils.getModuleInfo;
|
|
977
1006
|
const failure = exports.failure = _requestResponse.failure;
|
|
978
1007
|
const success = exports.success = _requestResponse.success;
|
|
979
1008
|
const runMigrations = exports.runMigrations = _migrations.runMigrations;
|
|
@@ -987,6 +1016,7 @@ const parseEvent = exports.parseEvent = _requestResponse.parseEvent;
|
|
|
987
1016
|
const getBusinessesInfo = exports.getBusinessesInfo = _accessRightsUtils.getBusinessesInfo;
|
|
988
1017
|
const userDefaultBid = exports.userDefaultBid = _accessRightsUtils.userDefaultBid;
|
|
989
1018
|
const checkWriteAccess = exports.checkWriteAccess = _accessRightsUtils.checkWriteAccess;
|
|
1019
|
+
const isSystemUser = exports.isSystemUser = _accessRightsUtils.isSystemUser;
|
|
990
1020
|
})();
|
|
991
1021
|
|
|
992
1022
|
var __webpack_export_target__ = exports;
|
|
@@ -994,4 +1024,4 @@ for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_expor
|
|
|
994
1024
|
if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true });
|
|
995
1025
|
/******/ })()
|
|
996
1026
|
;
|
|
997
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUdvVSxzQkFBZ0I7QUFDbkMsTUFBTWxNLE9BQU8sR0FBQWxJLGVBQUEsR0FBR3FVLGdCQUFhO0FBQzdCLE1BQU1qVSxXQUFXLEdBQUFKLG1CQUFBLEdBQUdzVSw4QkFBaUI7QUFDckMsTUFBTWpELE9BQU8sR0FBQXJSLGVBQUEsR0FBR3VVLHdCQUFhO0FBQzdCLE1BQU10RCxPQUFPLEdBQUFqUixlQUFBLEdBQUd3VSx3QkFBYTtBQUM3QixNQUFNclgsYUFBYSxHQUFBNkMscUJBQUEsR0FBR3lVLHlCQUFtQjtBQUN6QyxNQUFNckQsY0FBYyxHQUFBcFIsc0JBQUEsR0FBRzBVLCtCQUFvQjtBQUMzQyxNQUFNeEQsV0FBVyxHQUFBbFIsbUJBQUEsR0FBRzJVLDRCQUFpQjtBQUNyQyxNQUFNeEQsa0NBQWtDLEdBQUFuUiwwQ0FBQSxHQUFHNFUsbURBQXdDO0FBQ25GLE1BQU1qTyxjQUFjLEdBQUEzRyxzQkFBQSxHQUFHNlUsOEJBQW9CO0FBQzNDLE1BQU05VSxpQkFBaUIsR0FBQUMseUJBQUEsR0FBRzhVLG9DQUF1QjtBQUNqRCxNQUFNbFMsU0FBUyxHQUFBNUMsaUJBQUEsR0FBRytVLDBCQUFlO0FBQ2pDLE1BQU16RCxVQUFVLEdBQUF0UixrQkFBQSxHQUFHZ1YsMkJBQWdCO0FBQ25DLE1BQU05VSxpQkFBaUIsR0FBQUYseUJBQUEsR0FBR2lWLG9DQUF1QjtBQUNqRCxNQUFNaFYsY0FBYyxHQUFBRCxzQkFBQSxHQUFHa1YsaUNBQW9CO0FBQzNDLE1BQU03VSxnQkFBZ0IsR0FBQUwsd0JBQUEsR0FBR21WLG1DQUFzQixDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZGF0YWJhc2UvZGJTZXR1cC9taWdyYXRpb25zLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9hY2Nlc3NSaWdodHNVdGlscy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvY3JlYXRlRmlsdGVycy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvY3JlYXRlU29ydC5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvZGVmYXVsdEZpbHRlcnMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2ZpbmRBbGwuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZHluYW1vL2R5bmFtb1V0aWxzLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL2V2ZW50TWFuYWdlci9oYW5kbGVFdmVudHMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZXZlbnRNYW5hZ2VyL2hhbmRsZUZpbGUuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZXZlbnRNYW5hZ2VyL3B1Ymxpc2hFdmVudHMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvZXZlbnRNYW5hZ2VyL3dhdGNoQnVja2V0LmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL3JlcXVlc3RSZXNvbnNlL2Vycm9yQ29kZXMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvLi9zcmMvcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzIiwid2VicGFjazovL3BpcGVyLXV0aWxzLy4vc3JjL3MzL1MzVXRpbHMuanMvUzNVdGlscy5qcyIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9zbnMvU05TVXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJAYXdzLXNkay9jbGllbnQtZHluYW1vZGJcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwiQGF3cy1zZGsvY2xpZW50LXNuc1wiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwiQGF3cy1zZGsvbGliLWR5bmFtb2RiXCIiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJibHVlYmlyZFwiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwibG9kYXNoXCIiLCJ3ZWJwYWNrOi8vcGlwZXItdXRpbHMvZXh0ZXJuYWwgY29tbW9uanMgXCJtb21lbnRcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcIm1vbWVudC9tb21lbnQuanNcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy9leHRlcm5hbCBjb21tb25qcyBcInNlcXVlbGl6ZVwiIiwid2VicGFjazovL3BpcGVyLXV0aWxzL2V4dGVybmFsIGNvbW1vbmpzIFwidW16dWdcIiIsIndlYnBhY2s6Ly9waXBlci11dGlscy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9waXBlci11dGlscy8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgU2VxdWVsaXplU3RvcmFnZSwgVW16dWcgfSBmcm9tICd1bXp1Zyc7XG5cbi8qKlxuICogRXhlY3V0ZSBkYXRhYmFzZSBtaWdyYXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VOYW1lIC0gbmFtZSBvZiBkYXRhYmFzZSB0byBjcmVhdGUgKG9yIHZlcmlmeSBleGlzdGVuY2UpXG4gKiBAcGFyYW0ge29iamVjdH0gc2VxdWVsaXplSW5zdGFuY2UgLSBpbnN0YW5jZSBvZiBTZXF1ZWxpemUgKG11c3QgYmUgaW5pdGlhbGl6ZWQpXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBpbml0aWFsaXplTW9kZWxzIC0gZnVuY3Rpb24gdG8gcnVuIHRvIHN5bmMgU2VxdWVsaXplIG1vZGVscyB3aXRoIGRhdGFiYXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFRvTWlncmF0aW9uRm9sZGVyIC0gcGFzcyBpbiB0aGUgcGF0aCBpZiB1c2luZyB3aW5kb3dzLiB3aW5kb3dzIGFuZCBsaW51eCBQV0Qgd2lsbCBiZSBkaWZmZXJlbnRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk1pZ3JhdGlvbnMoZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVsaXplSW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplTW9kZWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFRvTWlncmF0aW9uRm9sZGVyID0gYCR7cHJvY2Vzcy5lbnYuUFdEfS9taWdyYXRpb25zLyouanNgKSB7XG4gICAgY29uc3QgdW16dWcgPSBuZXcgVW16dWcoe1xuICAgICAgICBtaWdyYXRpb25zOiB7IGdsb2I6IHBhdGhUb01pZ3JhdGlvbkZvbGRlciB9LFxuICAgICAgICBjb250ZXh0OiBzZXF1ZWxpemVJbnN0YW5jZS5nZXRRdWVyeUludGVyZmFjZSgpLFxuICAgICAgICBzdG9yYWdlOiBuZXcgU2VxdWVsaXplU3RvcmFnZSh7IHNlcXVlbGl6ZTogc2VxdWVsaXplSW5zdGFuY2UgfSksXG4gICAgICAgIGxvZ2dlcjogY29uc29sZVxuICAgIH0pO1xuXG4gICAgY29uc3QgcGVuZGluZ01pZ3JhdGlvbnMgPSBhd2FpdCB1bXp1Zy5wZW5kaW5nKCk7XG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0+VVRJTCBQZW5kaW5nIE1pZ3JhdGlvbnM6JywgcGVuZGluZ01pZ3JhdGlvbnMsIHBhdGhUb01pZ3JhdGlvbkZvbGRlcik7XG4gICAgYXdhaXQgdW16dWcudXAoKS5jYXRjaCgodXBFcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gdW16dWcuZG93bih7XG4gICAgICAgICAgICBtaWdyYXRpb25zOiBfLmNoYWluKHBlbmRpbmdNaWdyYXRpb25zKVxuICAgICAgICAgICAgICAgIC5tYXAoJ2ZpbGUnKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAgICAgICAudmFsdWUoKVxuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9ICdVVElMIEVycm9yOiBFcnJvciB3aXRoIG1pZ3JhdGluZyB1cDonICsgdXBFcnJvcjtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgICB9LCAoZG93bkVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSAnVVRJTCBFcnJvcjogRXJyb3Igd2l0aCBtaWdyYXRpbmcgZG93bjonICsgZG93bkVycm9yO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIGlzIG5lZWRlZCB0byBzeW5jIChjcmVhdGUpIHRhYmxlcywgYnV0IG5vdCB0byBkYXRhYmFzZSB1cGRhdGVzXG4gICAgLy8gaW4gdGhlIHBhc3QgaXQgd29ya2VkIHRvIGxlYXZlIGl0IGluLCBidXQgbm93IHRoZSB0YWdzIG1vZHVsZSBjYXVzZXMgZm9yZWlnbiBrZXkgcHJvYmxlbXNcbiAgICAvLyBUaGUgdGFibGVzIGFyZSBzdGlsbCBpbml0aWF0ZWQgYnkgYmVpbmcgcGFzc2VkIGluIHRvIHJ1biBtaWdyYXRpb25zXG4gICAgYXdhaXQgaW5pdGlhbGl6ZU1vZGVscygpO1xufSIsImltcG9ydCBfLCB7IGlzRW1wdHkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXJyb3JMaXN0IH0gZnJvbSAnLi4vLi4vLi4vcmVxdWVzdFJlc29uc2UvZXJyb3JDb2Rlcy5qcyc7XG5pbXBvcnQgeyBwYXJzZUJvZHkgfSBmcm9tICcuLi8uLi8uLi9yZXF1ZXN0UmVzb25zZS9yZXF1ZXN0UmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIEdldCB0aGUgYWxsb3dlZCBidXNpbmVzc0lkcyBmb3IgYSB1c2VyIGZyb20gdGhlIGxhbWJkYSBldmVudCwgY29tcGFyZSBpdCB0byBidXNpbmVzc0lkcywgcmV0dXJuIHdoYXQgdXNlciBoYXMgYWNjZXNzIHRvLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCAtIFRoZSBsYW1iZGEgZXZlbnQgcGFzc2VkIGluIGJ5IGEgdmFsaWRhdGVkIGFwaSByZXF1ZXN0LlxuICogQHBhcmFtIHt7dXNlQ29nbml0b0JpZDpib29sZWFufX0gW29wdGlvbnNdIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9ucywgdXNlQ29nbml0b0JpZCBwcmVmZXJzIHRoZSBidXNpbmVzc0lkIHNldCBpbiBjb2duaXRvIGlmIHNldCBhbmQgZG9lcyBub3QgcmV0dXJuIHRoZSBsb2NhbCBiaWQgb2YgMSBpZiBhIGJpZCBpcyBpbiB0aGUgY2xhaW0uXG4gKiBAcmV0dXJucyB7YXJyYXl9IEEgIGxpc3Qgb2YgYnVzaW5lc3NJZHMgdGhhdCBoYXZlIGJlZW4gcmVxdWVzdGVkIGFuZCBhcmUgYWxsb3dlZCB0byBmb3Igc29tZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNjZXNzUmlnaHRzVXRpbHMoZXZlbnQsIG9wdGlvbnMpIHtcbiAgICBjb25zdCB1c2VDb2duaXRvQmlkID0gXy5nZXQob3B0aW9ucywgJ3VzZUNvZ25pdG9CaWQnLCBmYWxzZSk7XG4gICAgY29uc3QgcmVxdWVzdGVkQnVzaW5lc3NJZHMgPSBnZXRSZXF1ZXN0ZWRCdXNpbmVzc0lkcyhldmVudCk7XG4gICAgY29uc3QgYWxsb3dlZEJ1c2luZXNzSWRzID0gZ2V0QWxsb3dlZEJ1c2luZXNzSWRzKGV2ZW50LCB1c2VDb2duaXRvQmlkKTtcbiAgICBjb25zdCBsb2NhbEJpZExpc3QgPSBbJzEnXTtcblxuICAgIC8vIGlmIHdlIGFyZSBvbiBsb2NhbCByZXR1cm4gZm9yIGFsbCBiaWRzIGluIGFjY2VzcyByaWdodHNcbiAgICBpZiAoXy5pc0VtcHR5KGFsbG93ZWRCdXNpbmVzc0lkcykgJiZcbiAgICAgICAgIV8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jbGFpbXMnKSAmJlxuICAgICAgICAhXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmN1c3RvbTpBUicpICYmXG4gICAgICAgIHByb2Nlc3MuZW52LkJVSUxEX0VOViAhPT0gJ3Byb2R1Y3Rpb24nICYmXG4gICAgICAgIHByb2Nlc3MuZW52LkJVSUxEX0VOViAhPT0gJ3N0YWdpbmcnKSB7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRCdXNpbmVzc0lkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbEJpZExpc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gXy5pbnRlcnNlY3Rpb24ocmVxdWVzdGVkQnVzaW5lc3NJZHMsIGxvY2FsQmlkTGlzdCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZEJ1c2luZXNzSWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYWxsb3dlZEJ1c2luZXNzSWRzO1xuICAgIH1cblxuICAgIHJldHVybiBfLmludGVyc2VjdGlvbihyZXF1ZXN0ZWRCdXNpbmVzc0lkcywgYWxsb3dlZEJ1c2luZXNzSWRzKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGJ1c2luZXNzSUQgc2V0IGluIGNvZ25pdG8gYXMgY3VzdG9tOkRCSS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBUaGUgbGFtYmRhIGV2ZW50IHBhc3NlZCBpbiBieSBhIHZhbGlkYXRlZCBhcGkgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBidXNpbmVzc0lEIHNldCBpbiBjb2duaXRvIGFzIGN1c3RvbTpEQklcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJEZWZhdWx0QmlkKGV2ZW50KSB7XG4gICAgbGV0IGpzb25Ub1BhcnNlID0gXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5jdXN0b206REJJJykgfHxcbiAgICAgICAgXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmN1c3RvbTpEQkknKSB8fFxuICAgICAgICAne30nO1xuXG4gICAgY29uc3QgZGJpID0gSlNPTi5wYXJzZShqc29uVG9QYXJzZSk7XG4gICAgcmV0dXJuIF8uZ2V0KGRiaSwgJ2RlZmF1bHRCaWQnLCAnJykgfHwgJzEnO1xufVxuXG4vKipcbiAqIEdldCAgcmVxdWVzdGVkIGJ1c2luZXNzSWRzIGZyb20gdGhlIHF1ZXJ5IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBUaGUgbGFtYmRhIGV2ZW50IHBhc3NlZCBpbiBieSBhIHZhbGlkYXRlZCBhcGkgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHthcnJheX0gVGhlIGJ1c2luZXNzSUQgcmVxdWVzdGVkIGJ5IHRoZSBxdWVyeSBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0UmVxdWVzdGVkQnVzaW5lc3NJZHMoZXZlbnQpIHtcbiAgICBsZXQgcmVxdWVzdGVkQnVzaW5lc3NJZHMgPSBfLmdldChldmVudCwgJ3F1ZXJ5U3RyaW5nUGFyYW1ldGVycy5idXNpbmVzc0lkcycsIG51bGwpO1xuXG4gICAgcmV0dXJuIHJlcXVlc3RlZEJ1c2luZXNzSWRzID8gcmVxdWVzdGVkQnVzaW5lc3NJZHMuc3BsaXQoJywnKSA6IFtdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgYWxsb3dlZCBidXNpbmVzc0lkcyBmb3IgYSB1c2VyIGZyb20gY29nbml0byBjdXN0b206QVIgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IC0gVGhlIGxhbWJkYSBldmVudCBwYXNzZWQgaW4gYnkgYSB2YWxpZGF0ZWQgYXBpIHJlcXVlc3QuXG4gKiBAcGFyYW0gdXNlQ29nbml0b0JpZFxuICogQHJldHVybnMge2FycmF5fSBUaGUgYnVzaW5lc3NJRCByZXF1ZXN0ZWQgYnkgdGhlIHF1ZXJ5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXRBbGxvd2VkQnVzaW5lc3NJZHMoZXZlbnQsIHVzZUNvZ25pdG9CaWQpIHtcbiAgICBjb25zdCBidXNpbmVzc2VzID0gZ2V0QnVzaW5lc3Nlc0luZm8oZXZlbnQsIHVzZUNvZ25pdG9CaWQpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhidXNpbmVzc2VzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1c2luZXNzZXNJbmZvKGV2ZW50LCB1c2VDb2duaXRvQmlkKSB7XG4gICAgbGV0IGpzb25Ub1BhcnNlID0gXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5jdXN0b206QVInKSB8fFxuICAgICAgICBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY3VzdG9tOkFSJykgfHxcbiAgICAgICAgJ3t9JztcbiAgICBjb25zdCBhY2Nlc3NSaWdodHMgPSBKU09OLnBhcnNlKGpzb25Ub1BhcnNlKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5CVUlMRF9FTlYgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgaWYgKCFpc0VtcHR5KGFjY2Vzc1JpZ2h0cykpIHtcbiAgICAgICAgICAgIGNvbnN0IGJpZHMgPSBfLmdldChhY2Nlc3NSaWdodHMsICdidXNpbmVzc0lkcycsIHt9KTtcbiAgICAgICAgICAgIGxldCB3aXRoTG9jYWw7XG4gICAgICAgICAgICBpZiAodXNlQ29nbml0b0JpZCkge1xuICAgICAgICAgICAgICAgIHdpdGhMb2NhbCA9IHsgLi4uYmlkcyB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aXRoTG9jYWwgPSB7IC4uLmJpZHMsICcxJzogJ0EnIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF8uc2V0KGFjY2Vzc1JpZ2h0cywgJ2J1c2luZXNzSWRzJywgd2l0aExvY2FsKTtcblxuICAgICAgICAgICAgcmV0dXJuIF8uZ2V0KGFjY2Vzc1JpZ2h0cywgJ2J1c2luZXNzSWRzJywge30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYXIgPSB7ICdidXNpbmVzc0lkcyc6IHsgJzEnOiAnQScgfSB9O1xuICAgICAgICAgICAgcmV0dXJuIF8uZ2V0KGFyLCAnYnVzaW5lc3NJZHMnLCB7fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gXy5nZXQoYWNjZXNzUmlnaHRzLCAnYnVzaW5lc3NJZHMnLCB7fSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBtb2R1bGVzIGxpc3RlZCBpbiBjdXN0b206TU9ELlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCAtIFRoZSBsYW1iZGEgZXZlbnQgcGFzc2VkIGluIGJ5IGEgdmFsaWRhdGVkIGFwaSByZXF1ZXN0LlxuICogQHJldHVybnMge2FycmF5fSBUaGUgTW9kdWxlIGFjY2VzcyBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVJbmZvKGV2ZW50KSB7XG4gICAgbGV0IGpzb25Ub1BhcnNlID1cbiAgICAgICAgXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5jdXN0b206TU9EJykgfHxcbiAgICAgICAgXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmN1c3RvbTpNT0QnKSB8fFxuICAgICAgICBfLmdldChldmVudCwgJ3JlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY2xhaW1zLmN1c3RvbTpBUicpIHx8XG4gICAgICAgIF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jdXN0b206QVInKSB8fFxuXG4gICAgICAgICd7fSc7XG5cbiAgICBjb25zdCBtb2R1bGVSaWdodHMgPSBKU09OLnBhcnNlKGpzb25Ub1BhcnNlKTtcbiAgICByZXR1cm4gXy5nZXQobW9kdWxlUmlnaHRzLCAnbW9kdWxlJywge30pO1xufVxuXG4vKipcbiAqIEdldCB0aGUgbW9kdWxlcyBsaXN0ZWQgaW4gY3VzdG9tOk1PRC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlTmFtZSAtIEEgc3RpbmcgbmFtZSBmb3IgYSBtb2R1bGUuXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSBUaGUgbGFtYmRhIGV2ZW50IHBhc3NlZCBpbiBieSBhIHZhbGlkYXRlZCBhcGkgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHthcnJheX0gVGhlIE1vZHVsZSBhY2Nlc3MgbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tNb2R1bGUobW9kdWxlTmFtZSwgZXZlbnQpIHtcbiAgICBjb25zdCBtb2R1bGVSaWdodHMgPSBnZXRNb2R1bGVJbmZvKGV2ZW50KTtcbiAgICBsZXQgYWxsb3dBY2Nlc3MgPSBfLmdldChtb2R1bGVSaWdodHMsIG1vZHVsZU5hbWUsIGZhbHNlKTtcblxuICAgIGlmIChwcm9jZXNzLmVudi5CVUlMRF9FTlYgPT09ICdsb2NhbCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWFsbG93QWNjZXNzKSB7XG4gICAgICAgIHRocm93IGVycm9yTGlzdC51bmF1dGhvcml6ZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgdXNlclJvbGVzID0ge1xuICAgIGFkbWluOiAnQScsXG4gICAgcmVhZDogJ1InLFxuICAgIHdyaXRlOiAnVydcbn07XG5cbi8qKlxuICogQHBhcmFtIHt7Ym9keTogc3RyaW5nfX0gZXZlbnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGJ1c2luZXNzSWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrV3JpdGVBY2Nlc3MoZXZlbnQpIHtcbiAgICBjb25zdCBldmVudEJvZHkgPSBwYXJzZUJvZHkoZXZlbnQpO1xuICAgIGNvbnN0IGJ1c2luZXNzSWRzID0gYWNjZXNzUmlnaHRzVXRpbHMoZXZlbnQpIHx8IFtdO1xuICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBidXNpbmVzc0lkcy5maW5kKChpZCkgPT4gaWQgPT09IGV2ZW50Qm9keS5idXNpbmVzc0lkKTtcbiAgICBjb25zdCByYXcgPSBnZXRCdXNpbmVzc2VzSW5mbyhldmVudCk7XG4gICAgY29uc3QgdXNlclJpZ2h0ID0gcmF3W2J1c2luZXNzSWRdO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52LkJVSUxEX0VOViA9PT0gJ2xvY2FsJykge1xuICAgICAgICByZXR1cm4gZXZlbnRCb2R5LmJ1c2luZXNzSWQ7XG4gICAgfVxuXG4gICAgaWYgKCh1c2VyUmlnaHQgIT09IHVzZXJSb2xlcy5hZG1pbiAmJiB1c2VyUmlnaHQgIT09IHVzZXJSb2xlcy53cml0ZSkgfHwgKCF1c2VyUmlnaHQpKSB7XG4gICAgICAgIHRocm93IGVycm9yTGlzdC51bmF1dGhvcml6ZWQ7XG4gICAgfVxuICAgIHJldHVybiBidXNpbmVzc0lkO1xufVxuXG4iLCJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IERCIGZyb20gJ3NlcXVlbGl6ZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudC9tb21lbnQuanMnO1xuaW1wb3J0IHsgZXJyb3JMaXN0IH0gZnJvbSAnLi4vLi4vLi4vcmVxdWVzdFJlc29uc2UvZXJyb3JDb2Rlcy5qcyc7XG5pbXBvcnQgeyBhY2Nlc3NSaWdodHNVdGlscyB9IGZyb20gJy4vYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZSBzZXF1ZWxpemUgd2hlcmUgY2xhdXNlIGZyb20gcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgYW5kIGRlZmF1bHQgc29ydCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgLSB0aGUgcXVlcnkgcGFyYW1ldGVycyBmcm9tIHRoZSBldmVudCBwYXNzZWQgYnkgbGFtYmRhXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0RmlsdGVycyAtIHRoZSBkZWZhdWx0IGZpbHRlcnMgb2JqZWN0IGNyZWF0ZWQgYnkgY3JlYXRlRGVmYXVsdEZpbHRlcnNcbiAqIEByZXR1cm5zIHtvYmplY3R9IEFuIHNlcXVlbGl6ZSB3aGVyZSBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZpbHRlcnMgPSBmdW5jdGlvbiAoZXZlbnQsIG9iamVjdEZpbHRlcnMpe1xuICAgIGxldCBxdWVyeSA9IF8uZ2V0KGV2ZW50LCAncXVlcnlTdHJpbmdQYXJhbWV0ZXJzJywge30pIHx8IHt9O1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IF8uZ2V0KHF1ZXJ5LCAnc3RhcnREYXRlJyk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IF8uZ2V0KHF1ZXJ5LCAnZW5kRGF0ZScpO1xuICAgIGNvbnN0IHdoZXJlID0gT2JqZWN0LmtleXMocXVlcnkpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbCA9IF8uZ2V0KG9iamVjdEZpbHRlcnMsIGl0ZW0sIG51bGwpO1xuXG4gICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1OYW1lID0gaXRlbS5pbmNsdWRlcygnLicpXG4gICAgICAgICAgICAgICAgPyBgJCR7aXRlbX0kYFxuICAgICAgICAgICAgICAgIDogaXRlbTtcblxuICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXSA9IHt9O1xuICAgICAgICAgICAgaWYgKHZhbC5maWx0ZXJUeXBlID09PSBEQi5PcC5pTGlrZSkge1xuICAgICAgICAgICAgICAgIGFjY1tpdGVtTmFtZV1bdmFsLmZpbHRlclR5cGVdID0gYCUke3F1ZXJ5W2l0ZW1dfSVgO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwuZmlsdGVyVHlwZSA9PT0gREIuT3Aub3IpIHtcbiAgICAgICAgICAgICAgICBhY2NbaXRlbU5hbWVdW3ZhbC5maWx0ZXJUeXBlXSA9IFstMSAqICtxdWVyeVtpdGVtXSwgK3F1ZXJ5W2l0ZW1dXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsLmZpbHRlclR5cGUgPT09IERCLk9wLmluKSB7XG4gICAgICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXVt2YWwuZmlsdGVyVHlwZV0gPSBxdWVyeVtpdGVtXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwuZmlsdGVyVHlwZSA9PT0gREIuT3AuaW4pIHtcbiAgICAgICAgICAgICAgICBhY2NbaXRlbU5hbWVdW3ZhbC5maWx0ZXJUeXBlXSA9IHF1ZXJ5W2l0ZW1dLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYXJzZWRKc29uO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIEpTT04sIHBhcnNlIGl0XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZEpzb24gPSBKU09OLnBhcnNlKHF1ZXJ5W2l0ZW1dKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIG5vdCBKU09OLCBwYXNzIHRocm91Z2ggYXMgYSBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSnNvbiA9IHF1ZXJ5W2l0ZW1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhY2NbaXRlbU5hbWVdW3ZhbC5maWx0ZXJUeXBlXSA9IHBhcnNlZEpzb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwudHlwZSA9PT0gREIuQk9PTEVBTikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5VmFsdWUgPSBfLmdldChxdWVyeSwgaXRlbSwgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBib29sZWFuTWFwID0ge1xuICAgICAgICAgICAgICAgICAgICAnZmFsc2UnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgJ251bGwnOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAndHJ1ZSc6IHRydWVcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgYWNjW2l0ZW1OYW1lXVt2YWwuZmlsdGVyVHlwZV0gPSBib29sZWFuTWFwW3F1ZXJ5VmFsdWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG5cbiAgICBpZiAob2JqZWN0RmlsdGVycz8uYWN0aXZlICYmICF3aGVyZT8uYWN0aXZlKSB7XG4gICAgICAgIHdoZXJlLmFjdGl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgYnVzaW5lc3NJZHMgPSBhY2Nlc3NSaWdodHNVdGlscyhldmVudCk7XG4gICAgY29uc3QgZmlsdGVyQWRkcyA9IHtcbiAgICAgICAgYnVzaW5lc3NJZDogYnVzaW5lc3NJZHNcbiAgICB9O1xuXG4gICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlKSB7XG4gICAgICAgIGNvbnN0IHMgPSBtb21lbnQudXRjKHN0YXJ0RGF0ZSk7XG4gICAgICAgIGNvbnN0IGUgPSBtb21lbnQudXRjKGVuZERhdGUpO1xuICAgICAgICBjb25zdCBkYXRlcyA9IHtcbiAgICAgICAgICAgIFtEQi5PcC5iZXR3ZWVuXTogW3MudG9EYXRlKCksIGUudG9EYXRlKCldXG4gICAgICAgIH07XG4gICAgICAgIGlmICghcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRocm93IHsgLi4uZXJyb3JMaXN0LmludmFsaWRTdGFydERhdGUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRocm93IHsgLi4uZXJyb3JMaXN0LmludmFsaWRFbmREYXRlIH07XG4gICAgICAgIH1cblxuICAgICAgICBmaWx0ZXJBZGRzLmNyZWF0ZWRBdCA9IGRhdGVzO1xuICAgIH1cblxuICAgIGNvbnN0IHdpdGhEYXRlID0gT2JqZWN0LmFzc2lnbih3aGVyZSwgZmlsdGVyQWRkcyk7XG5cbiAgICByZXR1cm4gd2l0aERhdGU7XG59O1xuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBDcmVhdGUgc2VxdWVsaXplIG9yZGVyIGNsYXVzZSBmcm9tIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGFuZCBkZWZhdWx0IHNvcnQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IC0gdGhlIGV2ZW50IGNyZWF0ZWQgQVdTIGxhbWJkYSwgaXQgd2lsbCBjb250YWluIHF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB3aXRoIHNvcnQgcHJvcGVydHkgYSBjb21tYSBzZXBlcmF0ZWQgbGlzdCBvZiBzb3J0YWJsZSBmaWVsZHMgKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0RmlsdGVycyAtIHRoZSBkZWZhdWx0IGZpbHRlcnMgb2JqZWN0IGNyZWF0ZWQgYnkgY3JlYXRlRGVmYXVsdEZpbHRlcnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBkZWZhdWx0RmlsdGVyIC0gQSBkZWZhdWx0IGZpbHRlciBvYmplY3QgYXMgYnVpbHQgYnkgY3JlYXRlRGVmYXVsdCBGaWx0ZXJzLCBpZiBpdGVtcyBhcmUgbm90IG9uIHRoZSBzY2hlbWEgdGhleSB3aWxsIG5vdCBiZSBpbiB0aGUgb3JkZXIgYnlcbiAqIEByZXR1cm5zIHtvYmplY3R9ICBBbiBzZXF1ZWxpemUgb3JkZXIgYnkgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVTb3J0ID0gZnVuY3Rpb24gKGV2ZW50LCBkZWZhdWx0RmlsdGVyKSB7XG4gICAgbGV0IGNvcHlPZkRlZmF1bHRGaWx0ZXIgPSBfLmNsb25lKGRlZmF1bHRGaWx0ZXIpO1xuICAgIGxldCBxdWVyeSA9IF8uZ2V0KGV2ZW50LCAncXVlcnlTdHJpbmdQYXJhbWV0ZXJzJywge30pIHx8IHt9O1xuICAgIGxldCBzb3J0ID0gXy5nZXQocXVlcnksICdzb3J0JywgJy11cGRhdGVkQXQnKSB8fCAnLXVwZGF0ZWRBdCc7XG5cbiAgICByZXR1cm4gc29ydC5zcGxpdCgnLCcpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG5cbiAgICAgICAgY29uc3QgdGVzdEl0ZW0gPSBpdGVtLmluZGV4T2YoJy0nKSA9PT0gMCA/IGl0ZW0uc3Vic3RyKDEpIDogaXRlbTtcblxuICAgICAgICBpZiAoXy5nZXQoY29weU9mRGVmYXVsdEZpbHRlciwgdGVzdEl0ZW0sIG51bGwpKSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0SXRlbSA9IFtdO1xuXG4gICAgICAgICAgICB0ZXN0SXRlbS5zcGxpdCgnLicpLmZvckVhY2goKHBhcmVudENoaWxkTGlzdCkgPT4ge1xuICAgICAgICAgICAgICAgIHNvcnRJdGVtLnB1c2gocGFyZW50Q2hpbGRMaXN0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaXRlbS5pbmRleE9mKCctJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBzb3J0SXRlbS5wdXNoKCdERVNDJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvcnRJdGVtLnB1c2goJ0FTQycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWNjLnB1c2goc29ydEl0ZW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59O1xuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBEQiBmcm9tICdzZXF1ZWxpemUnO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGZpbHRlcnMgZm9yIGEgZ2l2ZW4gc2VxdWVsaWF6ZSBTY2hlbWEgT2JqZWN0LCBhbmQgc2V0IG9mIHN1YiBzY2hlbWFzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHNjaGVtYSAtIHR5cGUgaXMgc2VxdWVsaXplIGRhdGEgdHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHN1YlNjaGVtYXMgLSBBbiBvYmplY3Qgd2l0aCBhbGlhcyBhcyB0aGUga2V5IGFuZCBzZXF1ZWxpemUgc2NoZW1hIGFzIHRoZSB2YWx1ZSBodHRwOi8vZG9jcy5zZXF1ZWxpemVqcy5jb20vY2xhc3MvbGliL3NlcXVlbGl6ZS5qc35TZXF1ZWxpemUuaHRtbCNpbnN0YW5jZS1tZXRob2QtZGVmaW5lXG4gKiBzdWIgc2NoZW1hIGNhbiBiZSB7bG9jYXRpb246IGxvY2F0aW9uU2NoZW1hfSBvciB7bG9jYXRpb246IHthczogXCJhc0FsaWFzXCIsIHNjaGVtYTogc2NoZW1hfX1cbiAqIEByZXR1cm5zIHtvYmplY3R9IEFuIE9iamVjdCB3aXRoIGEgZGVmYXVsdCBmaWx0ZXIgZm9yIGVhY2ggZGF0YVR5cGUgQ0hBUiBhbmQgVEVYVCB3aWxsIGdldCBhICRsaWtlIG9wZXJhdG9yLCBJTlRFR0VSLCBERUNJTUFMIGFuZCBCT09MRUFOIHdpbGwgZ2V0IGEgJGVxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEZpbHRlcnMoc2NoZW1hLCBzdWJTY2hlbWFzID0ge30pIHtcbiAgICBzY2hlbWEgPSBfLmNsb25lKHNjaGVtYSk7XG5cbiAgICBjb25zdCBmaWx0ZXJzID0ge307XG5cbiAgICBhZGRGaWx0ZXJzRnJvbVNjaGVtYShzY2hlbWEsIGZpbHRlcnMpO1xuICAgIE9iamVjdC5rZXlzKHN1YlNjaGVtYXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBhZGRGaWx0ZXJzRnJvbVNjaGVtYShzdWJTY2hlbWFzW2tleV0sIGZpbHRlcnMsIGtleSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsdGVycztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpbHRlcnNGcm9tU2NoZW1hKHNjaGVtYSwgYWNjdW11bGF0b3IsIGtleVByZWZpeCA9ICcnKSB7XG4gICAgY29uc3QgYXNMaW5rQWxpYXMgPSBfLmdldChzY2hlbWEsICdhcycsIG51bGwpO1xuICAgIHNjaGVtYSA9IF8uZ2V0KHNjaGVtYSwgJ3NjaGVtYScpIHx8IHNjaGVtYTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzY2hlbWEpLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiB7XG4gICAgICAgIGxldCBrZXkgPSBpdGVtO1xuXG4gICAgICAgIGlmIChhc0xpbmtBbGlhcykge1xuICAgICAgICAgICAgYWNjW2FzTGlua0FsaWFzXSA9IHsgdHlwZTogREIuU1RSSU5HLCBmaWx0ZXJUeXBlOiBEQi5PcC5lcSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGtleVByZWZpeCkge1xuICAgICAgICAgICAga2V5ID0gYCR7a2V5UHJlZml4fS4ke2l0ZW19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY2hlbWFbaXRlbV0uZmlsdGVyVHlwZSkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IHNjaGVtYVtpdGVtXS5maWx0ZXJUeXBlIH07XG5cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IHNjaGVtYVtpdGVtXS50eXBlO1xuXG4gICAgICAgIC8vdG9kbyB0aGVzZSBzaG91bGQgYmUgcmVtb3ZlZCwgdGhlcmUgYXJlIGp1c3QgaGVyZSBmb3Igc29ydCB0ZXN0c1xuICAgICAgICBzd2l0Y2ggKGl0ZW1UeXBlKSB7XG4gICAgICAgICAgICBjYXNlIERCLkNIQVI6XG4gICAgICAgICAgICBjYXNlIERCLlNUUklORzpcbiAgICAgICAgICAgIGNhc2UgREIuVEVYVDpcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IHsgZmlsdGVyVHlwZTogREIuT3AuaUxpa2UgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBEQi5ERUNJTUFMOlxuICAgICAgICAgICAgICAgIGFjY1trZXldID0geyBmaWx0ZXJUeXBlOiBEQi5PcC5vciB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIERCLkJPT0xFQU46XG4gICAgICAgICAgICBjYXNlIERCLkJJR0lOVDpcbiAgICAgICAgICAgIGNhc2UgREIuSU5URUdFUjpcbiAgICAgICAgICAgICAgICBhY2Nba2V5XSA9IHsgdHlwZTogaXRlbVR5cGUsIGZpbHRlclR5cGU6IERCLk9wLmVxIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgREIuREFURTpcbiAgICAgICAgICAgIGNhc2UgREIuREFURU9OTFk6XG4gICAgICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IERCLk9wLmx0IH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvL25ldyBzZXF1ZWxpemUgdXNlcyBjbGFzc2VzIGluc3RlYWQgb2Ygb2JqZWN0c1xuICAgICAgICBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5TVFJJTkcpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0geyBmaWx0ZXJUeXBlOiBEQi5PcC5pTGlrZSB9O1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlIGluc3RhbmNlb2YgREIuREVDSU1BTCkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IERCLk9wLm9yIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5JTlRFR0VSKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHsgZmlsdGVyVHlwZTogREIuT3Aub3IgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtVHlwZSBpbnN0YW5jZW9mIERCLkJJR0lOVCkge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IGZpbHRlclR5cGU6IERCLk9wLm9yIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5CT09MRUFOKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IHsgdHlwZTogaXRlbVR5cGUsIGZpbHRlclR5cGU6IERCLk9wLmVxIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbVR5cGUgaW5zdGFuY2VvZiBEQi5KU09OQikge1xuICAgICAgICAgICAgYWNjW2tleV0gPSB7IHR5cGU6IGl0ZW1UeXBlLCBmaWx0ZXJUeXBlOiBEQi5PcC5jb250YWlucyB9O1xuICAgICAgICB9IGVsc2UgaWYgKGl0ZW1UeXBlIGluc3RhbmNlb2YgREIuREFURU9OTFkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0geyB0eXBlOiBpdGVtVHlwZSwgZmlsdGVyVHlwZTogREIuT3AuZXEgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdGhlc2UgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtb2RlbHMgc28gYWRkIHRoZW0gYWx3YXlzXG4gICAgICAgIGFjY1snY3JlYXRlZEF0J10gPSB7IHR5cGU6IERCLkRBVEUsIGZpbHRlclR5cGU6IERCLk9wLmx0IH07XG4gICAgICAgIGFjY1sndXBkYXRlZEF0J10gPSB7IHR5cGU6IERCLkRBVEUsIGZpbHRlclR5cGU6IERCLk9wLmx0IH07XG4gICAgICAgIGFjY1snaWQnXSA9IHsgdHlwZTogREIuSU5URUdFUiwgZmlsdGVyVHlwZTogREIuT3AuZXEgfTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIGFjY3VtdWxhdG9yKTtcbn1cbiIsIi8qKlxuICogY3JlYXRlIHBhZ2luYXRpb24gb2JqZWN0IGZyb20gU2VxdWVsaXplIGZpbmRBbGxcbiAqIEBwYXJhbSB7b2JqZWN0fSByZXN1bHQgLSBzZXF1ZWxpemUgcmVzdWx0XG4gKiBAcGFyYW0ge251bWJlcn0gbGltaXQgLSBtYXggbnVtYmVyIG9mIHJlc3VsdHMgdG8gcmV0dXJuXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gcGFnZSBvZmZzZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2luYXRpb25Gcm9tRmluZEFsbChyZXN1bHQsIGxpbWl0LCBvZmZzZXQpIHtcbiAgICByZXN1bHQgPSByZXN1bHQgfHwgW107XG4gICAgbGltaXQgPSBsaW1pdCB8fCAwO1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgY29uc3QgaGFzTW9yZSA9IHJlc3VsdC5sZW5ndGggPiBsaW1pdDtcbiAgICBpZiAoaGFzTW9yZSkge1xuICAgICAgICByZXN1bHQuc3BsaWNlKC0xLCAxKTtcbiAgICB9XG4gICAgY29uc3QgcGFnZU9iamVjdCA9IHtcbiAgICAgICAgb2Zmc2V0OiBvZmZzZXQsXG4gICAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgICAgcm93czogcmVzdWx0LFxuICAgICAgICBoYXNNb3JlOiBoYXNNb3JlXG4gICAgfTtcblxuICAgIHJldHVybiBwYWdlT2JqZWN0O1xufVxuXG4vKipcbiAqIHdyYXBwZXIgZm9yIFNlcXVlbGl6ZSBmaW5kQWxsXG4gKiBAcGFyYW0ge29iamVjdH0gbW9kZWwgLSBpbnN0YW5jZSBvZiBTZXF1ZWxpemUgKG11c3QgYmUgaW5pdGlhbGl6ZWQpXG4gKiBAcGFyYW0geyome2luY2x1ZGU6IFt7bW9kZWw6ICp9XSwgd2hlcmU6IHtidXNpbmVzc0lkOiBBcnJheX0sIG9yZGVyOiBbc3RyaW5nW11dfX0gb3B0aW9ucyAtIGluc3RhbmNlIG9mIFNlcXVlbGl6ZSAobXVzdCBiZSBpbml0aWFsaXplZClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBbGwobW9kZWwsIG9wdGlvbnMpIHtcblxuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCB8fCAwO1xuICAgIGNvbnN0IGZpbmRBcmdzID0gT2JqZWN0LmFzc2lnbih7aW5jbHVkZTogeyBhbGw6IHRydWUsIG5lc3RlZDogdHJ1ZSB9fSwgb3B0aW9ucywgeyBsaW1pdDogbGltaXQgKyAxIH0pO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBtb2RlbC5maW5kQWxsKGZpbmRBcmdzKTtcbiAgICByZXR1cm4gZ2V0UGFnaW5hdGlvbkZyb21GaW5kQWxsKHJlc3VsdHMsIGxpbWl0LCBvcHRpb25zLm9mZnNldCk7XG59XG5cbmNvbnN0IGZpbmRVdGlscyA9IHtcbiAgICBmaW5kQWxsXG59O1xuZXhwb3J0IGRlZmF1bHQgZmluZFV0aWxzOyIsImltcG9ydCB7IER5bmFtb0RCRG9jdW1lbnQgfSBmcm9tICdAYXdzLXNkay9saWItZHluYW1vZGInO1xyXG5pbXBvcnQgeyBEeW5hbW9EQiB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1keW5hbW9kYic7XHJcblxyXG5jb25zdCBkeW5hbW9VdGlsID0ge1xyXG4gICAgZ2V0OiAocGFyYW1zKSA9PiBnZXQocGFyYW1zKVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBwYXJhbSB7e1RhYmxlTmFtZTpzdHJpbmcsIEtleTp7a2V5OnN0cmluZ319fSBwYXJhbXNcclxuICovXHJcbmFzeW5jIGZ1bmN0aW9uIGdldChwYXJhbXMpIHtcclxuICAgIGNvbnN0IGR5bmFtb0RiID0gRHluYW1vREJEb2N1bWVudC5mcm9tKG5ldyBEeW5hbW9EQigpKTtcclxuICAgIHJldHVybiBkeW5hbW9EYi5nZXQocGFyYW1zKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZHluYW1vVXRpbDsiLCJpbXBvcnQgeyBoYW5kbGVGaWxlIH0gZnJvbSAnLi9oYW5kbGVGaWxlLmpzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVFdmVudHMoZXZlbnQsIHRyYW5zZm9ybWVyLCBlcnJvckhhbmRsZXJQZXJGaWxlLCBzaG91bGRTa2lwRmFpbGVkRm9sZGVycyA9IGZhbHNlLCB1c2VySW1wb3J0VHlwZXMpIHtcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5SZWNvcmRzKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBsZXQgaGFzRXJyb3JzID0gZmFsc2U7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5tYXAoZXZlbnQuUmVjb3JkcywgKHJlY29yZCkgPT4ge1xuICAgICAgICBjb25zdCBzbnNJbmZvID0gSlNPTi5wYXJzZShfLmdldChyZWNvcmQsICdTbnMuTWVzc2FnZScsICd7fScpKTtcbiAgICAgICAgY29uc3QgczNCdWNrZXQgPSBzbnNJbmZvLmJ1Y2tldDtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBzbnNJbmZvLmZpbGVzIHx8IFtdO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLm1hcChmaWxlcywgKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGxldCBwYXRoID0gZGVjb2RlVVJJQ29tcG9uZW50KGZpbGUpO1xuICAgICAgICAgICAgaWYgKHBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlRmlsZShwYXRoLCBzM0J1Y2tldCwgdHJhbnNmb3JtZXIsIHsgc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMsIHVzZXJJbXBvcnRUeXBlcyB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckhhbmRsZXJQZXJGaWxlICYmICFlcnJvckhhbmRsZXJQZXJGaWxlKGVyciwgcGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0Vycm9ycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChoYXNFcnJvcnMpIHtcbiAgICAgICAgICAgIHRocm93ICdFcnJvcnMgcHJvY2Vzc2luZyBvbmUgb3IgbW9yZSBmaWxlcy4gU2VlIGVycm9yIGxvZ3MgZm9yIGRldGFpbCBvbiBlYWNoIGVycm9yLic7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgUzNVdGlsIGZyb20gJy4uL3MzL1MzVXRpbHMuanMvUzNVdGlscy5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVGaWxlKHBhdGgsIHMzQnVja2V0LCB0cmFuc2Zvcm1lciwgb3B0aW9ucykge1xuICAgIGNvbnN0IHNob3VsZFNraXBGYWlsZWRGb2xkZXJzID0gXy5nZXQob3B0aW9ucywgJ3Nob3VsZFNraXBGYWlsZWRGb2xkZXJzJyk7XG4gICAgY29uc3QgdXNlckltcG9ydFR5cGVzID0gXy5nZXQob3B0aW9ucywgJ3VzZXJJbXBvcnRUeXBlcycpO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgQnVja2V0OiBzM0J1Y2tldCxcbiAgICAgICAgS2V5OiBwYXRoXG4gICAgfTtcbiAgICBsZXQgYm9keSA9ICd7fSdcbiAgICB0cnkge1xuICAgICAgICBib2R5ID0gYXdhaXQgUzNVdGlsLmdldE9iamVjdChwYXJhbXMpO1xuICAgICAgICBjb25zdCBwYXJzZWRCb2R5ID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgICAgY29uc3QgcmV0dXJuZWRWYWx1ZSA9IGF3YWl0IHRyYW5zZm9ybWVyKHBhcnNlZEJvZHkpO1xuICAgICAgICBhd2FpdCBTM1V0aWwuZGVsZXRlT2JqZWN0KHBhcmFtcyk7XG5cbiAgICAgICAgcmV0dXJuIHJldHVybmVkVmFsdWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignaGFuZGxlLWZpbGUtZXJyb3InLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdOb1N1Y2hLZXknIHx8ICFib2R5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbmV3UGF0aCA9ICcnO1xuXG4gICAgICAgIGlmICh1c2VySW1wb3J0VHlwZXMpIHtcbiAgICAgICAgICAgIC8vIGxvb2sgZm9yIGl0ZW1zIGluIHRoZSB1c2VySW1wb3J0VHlwZXNcbiAgICAgICAgICAgIGNvbnN0IHVzZXJzSW1wb3J0cyA9IE9iamVjdC52YWx1ZXModXNlckltcG9ydFR5cGVzKTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gcGF0aC5zcGxpdCgnLycpO1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBfLmxhc3QoaXRlbXMpO1xuICAgICAgICAgICAgY29uc3QgZm9sZGVyTmFtZSA9IF8uZmlyc3QoaXRlbXMpO1xuXG4gICAgICAgICAgICBpZiAodXNlcnNJbXBvcnRzLmluZGV4T2YoZm9sZGVyTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTa2lwRmFpbGVkRm9sZGVycykge1xuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoID0gYCR7Zm9sZGVyTmFtZX0vZXJyb3IvJHtmaWxlTmFtZX1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5zdGFydHNXaXRoKHBhdGgsIGAke2ZvbGRlck5hbWV9L2ZhaWxlZC1vbmNlL2ApKSB7XG4gICAgICAgICAgICAgICAgICAgIG5ld1BhdGggPSBfLnJlcGxhY2UocGF0aCwgYCR7Zm9sZGVyTmFtZX0vZmFpbGVkLW9uY2UvYCwgYCR7Zm9sZGVyTmFtZX0vZmFpbGVkLXR3aWNlL2ApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5zdGFydHNXaXRoKHBhdGgsIGAke2ZvbGRlck5hbWV9L2ZhaWxlZC10d2ljZS9gKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoID0gXy5yZXBsYWNlKHBhdGgsIGAke2ZvbGRlck5hbWV9L2ZhaWxlZC10d2ljZS9gLCBgJHtmb2xkZXJOYW1lfS9lcnJvci9gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXdQYXRoID0gYCR7Zm9sZGVyTmFtZX0vZmFpbGVkLW9uY2UvJHtmaWxlTmFtZX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aCA9IGBwYXRoQW5kRXZlbnRNaXNNYXRjaEVycm9yLyR7cGF0aH1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMpIHtcbiAgICAgICAgICAgICAgICBuZXdQYXRoID0gYGVycm9yLyR7cGF0aH1gO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChfLnN0YXJ0c1dpdGgocGF0aCwgJ2ZhaWxlZC1vbmNlLycpKSB7XG4gICAgICAgICAgICAgICAgbmV3UGF0aCA9IF8ucmVwbGFjZShwYXRoLCAnZmFpbGVkLW9uY2UvJywgJ2ZhaWxlZC10d2ljZS8nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5zdGFydHNXaXRoKHBhdGgsICdmYWlsZWQtdHdpY2UvJykpIHtcbiAgICAgICAgICAgICAgICBuZXdQYXRoID0gXy5yZXBsYWNlKHBhdGgsICdmYWlsZWQtdHdpY2UvJywgJ2Vycm9yLycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhwYXRoLCAnZGVsYXlVbnRpbC8nKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXRoID0gXy5sYXN0KHBhdGguc3BsaXQoJy8nKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV3UGF0aCA9IGBmYWlsZWQtb25jZS8ke3BhdGh9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1BhcmFtcyA9IHtcbiAgICAgICAgICAgIEJ1Y2tldDogczNCdWNrZXQsXG4gICAgICAgICAgICBLZXk6IG5ld1BhdGgsXG4gICAgICAgICAgICBCb2R5OiBib2R5XG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgUzNVdGlsLnB1dE9iamVjdChuZXdQYXJhbXMpO1xuICAgICAgICBhd2FpdCBTM1V0aWwuZGVsZXRlT2JqZWN0KHBhcmFtcyk7XG5cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuIiwiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBQcm9taXNlIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBTM1V0aWxzIGZyb20gJy4uL3MzL1MzVXRpbHMuanMvUzNVdGlscy5qcyc7XG5pbXBvcnQgU05TVXRpbCBmcm9tICcuLi9zbnMvU05TVXRpbHMuanMnO1xuaW1wb3J0IGR5bmFtb1V0aWwgZnJvbSAnLi4vZHluYW1vL2R5bmFtb1V0aWxzLmpzJztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0XG4gKiBAcGFyYW0ge251bWJlcn0gbWF4S2V5c1xuICogQHBhcmFtIHtPYmplY3R9IHVzZXJJbXBvcnRUeXBlc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9vcChidWNrZXQsIG1heEtleXMsIHVzZXJJbXBvcnRUeXBlcykge1xuICAgIGxldCBidWNrZXRSZXN1bHQgPSB7fTtcbiAgICBsZXQgZmlsZUxpc3QgPSBbXTtcblxuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gbW9tZW50KCk7XG5cbiAgICBkbyB7XG4gICAgICAgIGJ1Y2tldFJlc3VsdCA9IGF3YWl0IFMzVXRpbHMubGlzdE9iamVjdHNWMih7XG4gICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICAgIE1heEtleXM6IG1heEtleXMsXG4gICAgICAgICAgICBDb250aW51YXRpb25Ub2tlbjogXy5nZXQoYnVja2V0UmVzdWx0LCAnTmV4dENvbnRpbnVhdGlvblRva2VuJylcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IG5ld0ZpbGVzID0gXy5maWx0ZXIoYnVja2V0UmVzdWx0LkNvbnRlbnRzLCAoZmlsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKF8uc3RhcnRzV2l0aChfLmdldChmaWxlLCAnS2V5JyksICdkZWxheVVudGlsLycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZURlbGF5VGltZSA9IF8uZ2V0KGZpbGUsICdLZXknKS5zcGxpdCgnLycpWzFdO1xuICAgICAgICAgICAgICAgIHJldHVybiBtb21lbnQoZmlsZURlbGF5VGltZSwgJ1lZWVlNTURESEhtbScpLmlzU2FtZU9yQmVmb3JlKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1c2VySW1wb3J0VHlwZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBsb29rIGZvciBpdGVtcyBpbiB0aGUgdXNlckltcG9ydFR5cGVzXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlcnNJbXBvcnRzID0gT2JqZWN0LnZhbHVlcyh1c2VySW1wb3J0VHlwZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gZmlsZS5LZXkuc3BsaXQoJy8nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IF8ubGFzdChpdGVtcyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9sZGVyTmFtZSA9IF8uZmlyc3QoaXRlbXMpO1xuICAgICAgICAgICAgICAgIGlmIChfLmlzRW1wdHkoZmlsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXNlcnNJbXBvcnRzLmluZGV4T2YoZm9sZGVyTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIV8uc3RhcnRzV2l0aChmaWxlLktleSwgYCR7Zm9sZGVyTmFtZX0vZXJyb3JgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhXy5zdGFydHNXaXRoKGZpbGUuS2V5LCAnZXJyb3InKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsZUxpc3QgPSBfLmNvbmNhdChmaWxlTGlzdCwgbmV3RmlsZXMpO1xuICAgIH0gd2hpbGUgKGJ1Y2tldFJlc3VsdC5Jc1RydW5jYXRlZCAmJiBidWNrZXRSZXN1bHQuTmV4dENvbnRpbnVhdGlvblRva2VuICYmIGZpbGVMaXN0Lmxlbmd0aCA8IG1heEtleXMpO1xuXG4gICAgcmV0dXJuIGZpbGVMaXN0O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlZCBTTlMgZXZlbnRzIGF0IGEgc3RlYWR5IHBhY2UgZm9yIGRhdGEgaW4gYSBwYXJ0aWN1bGFyIGJ1Y2tldC4gU2hvdWxkIGJlIGV4ZWN1dGVkIHZpYSBhIGNsb3VkIHdhdGNoIGNyb24gam9iIGFzIGEgcGFydCBvZiBhIG1pY3JvIHNlcnZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnVGFibGUgLSBUaGUgRHluYW1vIERCIHRhYmxlIHdoZXJlIHRvIGdldCB0aGUgY2h1bmstc2l6ZSBhbmQgbWF4TWVzc2FnZSBzaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFibGVLZXkgLSBUaGUga2V5IHRvIHRoZSBpdGVtIGluIHRoZSBEeW5hbW8gREIgdGFibGUgdGhhdCBob2xkcyB0aGUgY2h1bmstc2l6ZSBhbmQgbWF4TWVzc2FnZSBzaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0IC0gVGhlIG5hbWUgb2YgdGhlIHMzIGJ1Y2tldCB0byB3YXRjaCwgd2hlbiB5b3UgZHJvcCBpdGVtcyBpbnRvIHRoaXMgdGFibGUgZXZlbnRzIHdpbGwgYmUgY3JlYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IHNuc1RvcGljIC0gVGhlIG5hbWUgb2YgdGhlIHNuc0V2ZW50IHRvIHB1Ymxpc2hcbiAqIEBwYXJhbSB7b2JqZWN0fSB1c2VySW1wb3J0VHlwZXMgLSBpbXBvcnQgdHlwZXMgdG8gZmlsdGVyIG9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoRXZlbnRzKGNvbmZpZ1RhYmxlLCB0YWJsZUtleSwgYnVja2V0LCBzbnNUb3BpYywgdXNlckltcG9ydFR5cGVzKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBkeW5hbW9VdGlsLmdldCh7XG4gICAgICAgICAgICBUYWJsZU5hbWU6IGNvbmZpZ1RhYmxlLFxuICAgICAgICAgICAgS2V5OiB7IGtleTogdGFibGVLZXkgfVxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBnZXQgY29uZmlnIGZvciBrZXk6ICR7dGFibGVLZXl9IHRhYmxlOiAke2NvbmZpZ1RhYmxlfSBmYWxsaW5nIGJhY2sgdG8gZGVmYXVsdHMgb2YgMiBhbmQgMTBgLCBlKTtcbiAgICB9XG4gICAgbGV0IGNodW5rU2l6ZSA9IF8uZ2V0KHJlc3VsdCwgJ0l0ZW0uc25zQ2h1bmtTaXplJywgMik7XG4gICAgbGV0IG1heE1lc3NhZ2VzID0gXy5nZXQocmVzdWx0LCAnSXRlbS5zbnNNYXhNZXNzYWdlcycsIDEwKTtcblxuICAgIGNvbnN0IHNuc0NyZWF0ZVRvcGljUmVzcG9uc2UgPSBhd2FpdCBTTlNVdGlsLmNyZWF0ZVRvcGljKHsgTmFtZTogc25zVG9waWMgfSk7XG4gICAgY29uc3QgdG9waWNBcm4gPSBzbnNDcmVhdGVUb3BpY1Jlc3BvbnNlLlRvcGljQXJuO1xuICAgIGNvbnN0IG1heEtleXMgPSBjaHVua1NpemUgKiBtYXhNZXNzYWdlcztcblxuICAgIGNvbnN0IGZpbGVMaXN0ID0gYXdhaXQgbG9vcChidWNrZXQsIG1heEtleXMsIHVzZXJJbXBvcnRUeXBlcyk7XG5cbiAgICBjb25zdCBtZXNzYWdlTGlzdCA9IF8uY2hhaW4oZmlsZUxpc3QpXG4gICAgICAgIC5tYXAoJ0tleScpXG4gICAgICAgIC5jaHVuayhjaHVua1NpemUpXG4gICAgICAgIC5zbGljZSgwLCBtYXhNZXNzYWdlcylcbiAgICAgICAgLnZhbHVlKClcbiAgICA7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5tYXAobWVzc2FnZUxpc3QsIChmaWxlcykgPT4ge1xuICAgICAgICByZXR1cm4gU05TVXRpbC5wdWJsaXNoKHtcbiAgICAgICAgICAgIE1lc3NhZ2U6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBidWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXNcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgVG9waWNBcm46IHRvcGljQXJuXG4gICAgICAgIH0pO1xuICAgIH0pO1xufSIsImltcG9ydCB7IHB1Ymxpc2hFdmVudHMgfSBmcm9tICcuL3B1Ymxpc2hFdmVudHMuanMnO1xuaW1wb3J0IHsgaGFuZGxlRXZlbnRzIH0gZnJvbSAnLi9oYW5kbGVFdmVudHMuanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBidWNrZXQgd2F0Y2hlciB3YXRjaGVzIGEgczMgYnVja2V0IGFuZCBwdWJsaXNoZXMgZXZlbnRzIHRvIGEgc25zIHRvcGljLCB0aGlzIGFsbG93cyB5b3UgdG8gcHJvY2VzcyBmaWxlcyBpbiBzMyB3aXRoIGEgc29tZSB0cmFuc2Zvcm1lciBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3Igd2F0Y2hCdWNrZXQsIHNlZSBiZWxvd1xuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtcy5ldmVudCAtIFRoZSBldmVudCBvZiB0aGUgbGFtYmRhXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmR5bmFtb0NvbmZpZ1RhYmxlIC0gVGhlIER5bmFtbyBEQiB0YWJsZSB3aGVyZSB0byBnZXQgdGhlIGNodW5rU2l6ZSBhbmQgbWF4TWVzc2FnZSBzaXplXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmR5bmFtb0NvbmZpZ0tleSAtIFRoZSBrZXkgdG8gdGhlIGl0ZW0gaW4gdGhlIER5bmFtbyBEQiB0YWJsZSB0aGF0IGhvbGRzIHRoZSBjaHVua1NpemUgYW5kIG1heE1lc3NhZ2Ugc2l6ZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zM0J1Y2tldCAtIFRoZSBuYW1lIG9mIHRoZSBzMyBidWNrZXQgdG8gd2F0Y2gsIHdoZW4geW91IGRyb3AgaXRlbXMgaW50byB0aGlzIHRhYmxlIGV2ZW50cyB3aWxsIGJlIGNyZWF0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc25zVG9waWMgLSBUaGUgbmFtZSBvZiB0aGUgc25zRXZlbnQgdG8gcHVibGlzaFxuICogQHBhcmFtIHtmdW5jdGlvbn0gcGFyYW1zLnRyYW5zZm9ybWVyIC0gdGhlIGZ1bmN0aW9uIHRvIHJ1biBvbiBlYWNoIGZpbGVcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtwYXJhbXMuZXJyb3JIYW5kbGVyUGVyRmlsZV0gLSB0aGUgZnVuY3Rpb24gdG8gcnVuIG9uIGFzIGEgY2F0Y2ggb24gZWFjaCBmaWxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbXMuc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnNdIC0gd2hldGhlciB0byB1c2UgdGhlIGZhaWxlZC1vbmNlLCBmYWlsZWQtdHdpY2UsIGVycm9yIG9yIGp1c3QgZXJyb3IgZm9sZGVyc1xuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXMudXNlckltcG9ydFR5cGVzXSAtIHVzZXIgaW1wb3J0IHN1YiBkaXJlY3RvcmllcyBvYmplY3QgbWFwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaEJ1Y2tldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbW9Db25maWdUYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1vQ29uZmlnS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzM0J1Y2tldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25zVG9waWMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXJQZXJGaWxlID0gXy5ub29wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRTa2lwRmFpbGVkRm9sZGVycyA9IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW1wb3J0VHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSB7XG4gICAgaWYgKCFldmVudCB8fCAhZHluYW1vQ29uZmlnVGFibGUgfHwgIWR5bmFtb0NvbmZpZ0tleSB8fCAhczNCdWNrZXQgfHwgIXNuc1RvcGljIHx8ICF0cmFuc2Zvcm1lcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycy4gTmVlZCBldmVudCwgZHluYW1vQ29uZmlnVGFibGUsIGR5bmFtb0NvbmZpZ0tleSwgczNCdWNrZXQsIHNuc1RvcGljLCB0cmFuc2Zvcm1lcicpO1xuICAgIH1cblxuICAgIGNvbnN0IEV2ZW50U291cmNlID0gXy5nZXQoZXZlbnQsICdSZWNvcmRzWzBdLkV2ZW50U291cmNlJyk7XG4gICAgaWYgKF8uaXNFcXVhbChFdmVudFNvdXJjZSwgJ2F3czpzbnMnKSkge1xuICAgICAgICByZXR1cm4gaGFuZGxlRXZlbnRzKGV2ZW50LCB0cmFuc2Zvcm1lciwgZXJyb3JIYW5kbGVyUGVyRmlsZSwgc2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMsIHVzZXJJbXBvcnRUeXBlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIHJ1biBmcm9tIHRoZSBjcm9uIGpvYiBzbyBwdWJsaXNoIFNOUyBldmVudHNcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hFdmVudHMoZHluYW1vQ29uZmlnVGFibGUsIGR5bmFtb0NvbmZpZ0tleSwgczNCdWNrZXQsIHNuc1RvcGljLCB1c2VySW1wb3J0VHlwZXMpO1xuICAgIH1cbn1cbiIsImV4cG9ydCBjb25zdCBlcnJvckxpc3QgPSB7XG4gICAgaW52YWxpZEludmVudG9yeVJlbGVhc2VSZXF1ZXN0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdOT1QgRU5PVUdIIElOVkVOVE9SWSBUTyBGVUxGSUxMIFJFTEVBU0UnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDEwJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBhbHJlYWR5UmVsZWFzZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0FMUkVBRFkgUkVMRUFTRUQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDExJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBhbHJlYWR5UmVjZWl2ZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1JFQ0VJVkFCTEUgQUxSRUFEWSBSRUNFSVZFRCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMTInLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRJdGVtc1JlcXVlc3Q6IHtcbiAgICAgICAgbWVzc2FnZTogJ1ZBTElEIElURU1TIE1VU1QgQkUgSU5DTFVERUQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDEzJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkSUQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lEIGlzIGludmFsaWQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDE0JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkUmVjZWl2YWJsZToge1xuICAgICAgICBtZXNzYWdlOiAnTVVTVCBDT05UQUlOIEFUIExFQVNUIE9ORSBSRUNFSVZBQkxFJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxNScsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZFJlcXVlc3Q6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgUkVRVUVTVCBEQVRBJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxNicsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZEFQSUtleToge1xuICAgICAgICBtZXNzYWdlOiAnSU5WQUxJRCBSRVFVRVNUIC0gQVBJIE1BWSBLRVkgSU5WQUxJRCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMTcnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIHFiQ3JlYXRpb25FcnJvcjoge1xuICAgICAgICBtZXNzYWdlOiAnUVVJQ0tCT09LUyBFUlJPUiAtIEVSUk9SIENSRUFUSU5HIE9CSkVDVCBJTiBRVUlDS0JPT0tTJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxOCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgY2Fubm90UmVvcGVuOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdDQU5OT1QgUkVPUEVOIC0gVEhFIE9SREVSIEhBUyBBTFJFQURZIEJFRU4gT1BFTkVEJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAxOCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZERhdGVGb3JtYXQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgREFURSBGT1JNQVQnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDE5JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkU3RhcnREYXRlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdJTlZBTElEIFNUQVJUIERBVEUnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDIwJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkRW5kRGF0ZToge1xuICAgICAgICBtZXNzYWdlOiAnSU5WQUxJRCBFTkQgREFURScsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMjEnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRPcmRlclN0YXR1czoge1xuICAgICAgICBtZXNzYWdlOiAnVU5BQkxFIFRPIEVESVQgT1JERVIgSVRFTVMgVU5MRVNTIFRIRSBPUkRFUiBJUyBJTiBFU1RJTUFURSBTVEFUVVMnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDIyJyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkUGF5bWVudFN0YXR1czoge1xuICAgICAgICBtZXNzYWdlOiAnVU5BQkxFIFRPIFVQREFURSBQQVlNRU5UIFNUQVRVUyBQQVlNRU5UIE1VU1QgQkUgT1BFTicsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMjMnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRSZWxlYXNlU3RhdHVzOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVTkFCTEUgVE8gVVBEQVRFIFJFTEVBU0UsIFNUQVRVUyBSRUxFQVNFIE1VU1QgQkUgT1BFTicsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMjQnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDBcbiAgICB9LFxuICAgIGludmFsaWRSZWNlaXZhYmxlU3RhdHVzOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVTkFCTEUgVE8gVVBEQVRFIFJFQ0VJVkFCTEUsIFNUQVRVUyBSRUNFSVZBQkxFIE1VU1QgQkUgT1BFTicsXG4gICAgICAgIGVycm9yQ29kZTogJzQwMDI1JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkSnNvbjp7XG4gICAgICAgIG1lc3NhZ2U6ICdJTlZBTElEIEpTT04nLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDA1JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbnZhbGlkRmlsdGVyOntcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgRklMVEVSJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAyNicsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgaW52YWxpZFVzZXJOYW1lVXBkYXRlOntcbiAgICAgICAgbWVzc2FnZTogJ1VOQUJMRSBUTyBVUERBVEUgVVNFUk5BTUUnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDI3JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDAwXG4gICAgfSxcbiAgICBpbWFnZVNpemVMaW1pdDp7XG4gICAgICAgIG1lc3NhZ2U6ICdJTUFHRSBTSVpFIExJTUlUIDEwMEtCIEVYQ0VFREVEJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAyOCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwMFxuICAgIH0sXG4gICAgdW5hdXRob3JpemVkOntcbiAgICAgICAgbWVzc2FnZTogJ1VOQVVUSE9SSVpFRCcsXG4gICAgICAgIGVycm9yQ29kZTogJzQxMTEnLFxuICAgICAgICBzdGF0dXNDb2RlOiA0MDFcbiAgICB9LFxuICAgIG5vdEZvdW5kOntcbiAgICAgICAgbWVzc2FnZTogJ0lURU0gTk9UIEZPVU5EJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNDAwNCcsXG4gICAgICAgIHN0YXR1c0NvZGU6IDQwNFxuICAgIH0sXG4gICAgZW1haWxSZXF1aXJlZDp7XG4gICAgICAgIG1lc3NhZ2U6ICdOTyBFTUFJTCBQUk9WSURFRCwgQ0hFQ0sgQ1VTVE9NRVIgRU1BSUwnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDA0JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDA0XG4gICAgfSxcbiAgICBtb2JpbGVQaG9uZVJlcXVpcmVkOntcbiAgICAgICAgbWVzc2FnZTogJ05PIE1PQklMRSBQSE9ORSBQUk9WSURFRCwgQ0hFQ0sgQ1VTVE9NRVIgQ09OVEFDVFMnLFxuICAgICAgICBlcnJvckNvZGU6ICc0MDA0JyxcbiAgICAgICAgc3RhdHVzQ29kZTogNDA0XG4gICAgfSxcbiAgICBpbnZhbGlkQ2FkZW5jZVR5cGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ0lOVkFMSUQgQ0FERU5DRSBUWVBFJyxcbiAgICAgICAgZXJyb3JDb2RlOiAnNTAwMScsXG4gICAgICAgIHN0YXR1c0NvZGU6IDUwMFxuICAgIH0sXG59OyIsImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckxpc3QgfSBmcm9tICcuL2Vycm9yQ29kZXMuanMnO1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBib2R5XG4gKiBAcGFyYW0ge3t9fSBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWNjZXNzKGJvZHksIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYkNsb3NlID0gXy5nZXQob3B0aW9ucywgJ2RiQ2xvc2UnLCBfLm5vb3ApO1xuICAgIGRiQ2xvc2UoKTtcblxuICAgIHJldHVybiBidWlsZFJlc3BvbnNlKDIwMCwgYm9keSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAqIEBwYXJhbSB7e2RiQ2xvc2U6ZnVuY3Rpb258dW5kZWZpbmVkfX0gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3VjY2Vzc0h0bWwoaHRtbCwgb3B0aW9ucykge1xuICAgIGNvbnN0IGRiQ2xvc2UgPSBfLmdldChvcHRpb25zLCAnZGJDbG9zZScsIF8ubm9vcCk7XG5cbiAgICBkYkNsb3NlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvaHRtbCcsXG4gICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJzogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBodG1sXG4gICAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAqIEByZXR1cm5zIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXJOYW1lRnJvbUNvZ25pdG9FdmVudChldmVudCkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBfLmdldChldmVudCwgJ3JlcXVlc3QudXNlckF0dHJpYnV0ZXMnKTtcblxuICAgIHJldHVybiBhdHRyaWJ1dGVzWydjb2duaXRvOmVtYWlsX2FsaWFzJ10gfHwgJ1VOS05PV04gVVNFUic7XG59XG5cbi8qKlxuICogR2V0IHRoZSB1c2VyIGluZm9ybWF0aW9uIGZyb20gdGhlIGV2ZW50IG9iamVjdFxuICpcbiAqIEBwYXJhbSBldmVudCB7T2JqZWN0fSBhbiBldmVudCBvYmplY3RcbiAqIEByZXR1cm5zIHt7dXNlcm5hbWU6IHN0cmluZywgaWQ6IG51bWJlcn19XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50VXNlcihldmVudCkge1xuICAgIGxldCBqc29uVG9QYXJzZSA9IF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jbGFpbXMuY3VzdG9tOlVJRCcpIHx8XG4gICAgICAgIF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jdXN0b206VUlEJykgfHxcbiAgICAgICAgJzAnO1xuXG4gICAgY29uc3QgaWQgPSBKU09OLnBhcnNlKGpzb25Ub1BhcnNlKTtcblxuICAgIGNvbnN0IHVzZXJuYW1lID0gXy5nZXQoZXZlbnQsICdyZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyLmNsYWltcy5lbWFpbCcpIHx8IF8uZ2V0KGV2ZW50LCAncmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5lbWFpbCcpIHx8ICdMT0NBTCBURVNUIFVTRVInO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgdXNlcm5hbWUsXG4gICAgICAgIGlkXG4gICAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmYWlsdXJlIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIGJvZHkge09iamVjdH0gYW4gZXZlbnQgb2JqZWN0XG4gKiBAcGFyYW0gb3B0aW9ucyB7T2JqZWN0fSBhbiBvcHRpb25zIG9iamVjdFxuICogQHJldHVybnMge3tzdGF0dXNDb2RlOm51bWJlciwgaGVhZGVyczpvYmplY3QsIGJvZHk6c3RyaW5nfX0gYSByZXNwb25zZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUoYm9keSA9IHt9LCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGJDbG9zZSA9IF8uZ2V0KG9wdGlvbnMsICdkYkNsb3NlJywgXy5ub29wKTtcbiAgICBkYkNsb3NlKCk7XG4gICAgbGV0IGNsZWFuZWRFcnJvckJvZHk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuVVRJTF9MT0cgPT09ICdMT0dfQUxMJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCctLS0tLS0tPlVUSUwgRVJST1I6JywgYm9keSk7XG4gICAgfVxuXG4gICAgY29uc3QgTk9STUFMX0VSUk9SID0geyBzdGF0dXNDb2RlOiA1MDAsIGVycm9yQ29kZTogJzVYWCcsIG1lc3NhZ2U6ICdJTlRFUk5BTCBVVElMIEVSUk9SJyB9O1xuICAgIGNsZWFuZWRFcnJvckJvZHkgPSBib2R5O1xuICAgIGlmICghXy5pc1VuZGVmaW5lZChib2R5LmRldGFpbHMpKSB7XG4gICAgICAgIGNsZWFuZWRFcnJvckJvZHkgPSBkZXRlY3RKb3lFcnJvcihib2R5KTtcbiAgICB9IGVsc2UgaWYgKF8uaXNVbmRlZmluZWQoYm9keS5lcnJvckNvZGUpIHx8IF8uaXNVbmRlZmluZWQoYm9keS5zdGF0dXNDb2RlKSkge1xuICAgICAgICBjbGVhbmVkRXJyb3JCb2R5ID0gZGV0ZWN0U2VxdWVsaXplRXJyb3IoYm9keSk7XG4gICAgfVxuICAgIGlmKF8uZ2V0KGJvZHksICdyZXNwb25zZS5kYXRhLm1lc3NhZ2UnKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCctLS0tLS0tPlVUSUwgRVJST1I6ICcrXy5nZXQoYm9keSwgJ3Jlc3BvbnNlLmRhdGEubWVzc2FnZScpKVxuICAgIH1cblxuICAgIGNvbnN0IG5ld0JvZHkgPSBfLm1lcmdlKE5PUk1BTF9FUlJPUiwgY2xlYW5lZEVycm9yQm9keSk7XG5cbiAgICByZXR1cm4gYnVpbGRSZXNwb25zZShuZXdCb2R5LnN0YXR1c0NvZGUsIG5ld0JvZHkpO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGZhaWx1cmUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHBhcmFtIHN0YXR1c0NvZGUge051bWJlcn0gYSBzdGF0dXMgY29kZVxuICogQHBhcmFtIGJvZHkge09iamVjdH0gYW4gZXZlbnQgb2JqZWN0XG4gKiBAcmV0dXJucyB7e3N0YXR1c0NvZGU6bnVtYmVyLCBoZWFkZXJzOm9iamVjdCwgYm9keTpzdHJpbmd9fSBhIHJlc3BvbnNlIG9iamVjdFxuICovXG5mdW5jdGlvbiBidWlsZFJlc3BvbnNlKHN0YXR1c0NvZGUsIGJvZHkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogJyonLFxuICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJzogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgIH07XG59XG5cbi8qKlxuICogcGFyc2UgdGhlIGJvZHkgb2YgdGhlIGV2ZW50IG9iamVjdFxuICpcbiAqIEBwYXJhbSByZXF1ZXN0RXZlbnQge3tib2R5OnN0cmluZ319IGFuIGV2ZW50IG9iamVjdFxuICogQHJldHVybnMgZXZlbnQgeyp9IHRoZSBqc29uIG9iamVjdCBvZiB0aGUgYm9keVxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VCb2R5KHJlcXVlc3RFdmVudCkge1xuXG4gICAgbGV0IGV2ZW50Qm9keSA9IHt9O1xuICAgIGlmIChfLmlzU3RyaW5nKHJlcXVlc3RFdmVudC5ib2R5KSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXZlbnRCb2R5ID0gSlNPTi5wYXJzZShyZXF1ZXN0RXZlbnQuYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEludmFsaWQgSlNPTlxuICAgICAgICAgICAgZXZlbnRCb2R5ID0gbnVsbDtcblxuICAgICAgICAgICAgdGhyb3cgZXJyb3JMaXN0LmludmFsaWRKc29uO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChfLmlzT2JqZWN0KHJlcXVlc3RFdmVudC5ib2R5KSkge1xuICAgICAgICBldmVudEJvZHkgPSByZXF1ZXN0RXZlbnQuYm9keTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXZlbnRCb2R5O1xufVxuXG4vKipcbiAqIHBhcnNlIHRoZSBib2R5IG9mIHRoZSBldmVudCBvYmplY3RcbiAqXG4gKiBAcGFyYW0gcmVxdWVzdEV2ZW50IHtzdHJpbmd8b2JqZWN0fSBhbiBldmVudCBvYmplY3RcbiAqIEBwYXJhbSBbY2FsbGJhY2tdIHtmdW5jdGlvbn0gdW5kZWZpbmVkIGEgY2FsbCBiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyBldmVudCB7Kn0gdGhlIGpzb24gb2JqZWN0IG9mIHRoZSBib2R5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUV2ZW50KHJlcXVlc3RFdmVudCwgY2FsbGJhY2spIHtcbiAgICBsZXQgZXZlbnQgPSB7fTtcbiAgICBpZiAoXy5pc1N0cmluZyhyZXF1ZXN0RXZlbnQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBldmVudCA9IEpTT04ucGFyc2UocmVxdWVzdEV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBKU09OXG4gICAgICAgICAgICBldmVudCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKEVycm9yKGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChyZXF1ZXN0RXZlbnQpKSB7XG4gICAgICAgIGV2ZW50ID0gcmVxdWVzdEV2ZW50O1xuICAgIH1cblxuICAgIHJldHVybiBldmVudDtcbn1cblxuLyoqXG4gKiBwYXJzZSB0aGUgYm9keSBvZiB0aGUgZXZlbnQgb2JqZWN0XG4gKiBsb29rIGZvciBzZXF1ZWxpemUgZXJyb3JzIGFuZCByZXR1cm4gYSBtZXNzYWdlXG4gKiBFUlJPUlMgc2hvdWxkIG5vdCBiZSBjYXVnaHQgaGVyZSB0aGlzIGlzIGEgZmFsbGJhY2sgZm9yIHVua25vd24gZGF0YWJhc2UgZXJyb3JzXG4gKlxuICogQHBhcmFtIGJvZHkge29iamVjdH0gcGFydCBvZiBhIGJvZHkgcmVzcG9uc2VcbiAqIEByZXR1cm5zIGVycm9yIG1lc3NhZ2Ugb2JqZWN0IHttZXNzYWdlOnN0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFNlcXVlbGl6ZUVycm9yKGJvZHkpIHtcbiAgICBjb25zdCBlcnJvckJvZHkgPSB7fTtcblxuICAgIGxldCBzZXF1ZWxpemVFcnJvciA9IF8uZ2V0KGJvZHksICdlcnJvcnMnLCBbXSkucmVkdWNlKChhY2MsIGVycikgPT4ge1xuICAgICAgICBhY2MgPSBhY2MgKyAnICcgKyBfLmdldChlcnIsICdtZXNzYWdlJyk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgJycpO1xuICAgIGNvbnN0IHBhcmVudEVycm9yID0gXy5nZXQoYm9keSwgJ3BhcmVudCcsICcnKTtcblxuICAgIHNlcXVlbGl6ZUVycm9yID0gc2VxdWVsaXplRXJyb3IgKyBfLmdldChib2R5LCAnb3JpZ2luYWwuZGV0YWlsJywgJycpICsgXy5nZXQoYm9keSwgJ1R5cGVFcnJvcicsICcnKSArIHBhcmVudEVycm9yO1xuICAgIGVycm9yQm9keS5tZXNzYWdlID0gc2VxdWVsaXplRXJyb3IudHJpbSgpO1xuICAgIHJldHVybiBlcnJvckJvZHk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RKb3lFcnJvcihib2R5KSB7XG4gICAgY29uc3QgZXJyb3JCb2R5ID0ge307XG4gICAgY29uc3Qgam95RXJyb3IgPSBfLmdldChib2R5LCAnZGV0YWlsc1swXScsIHt9KTtcbiAgICBjb25zb2xlLmVycm9yKCdVU0VSIFZBTElEQVRJT04gRVJST1I6JywgYm9keSk7XG5cbiAgICBlcnJvckJvZHkubWVzc2FnZSA9IGpveUVycm9yLm1lc3NhZ2U7XG4gICAgZXJyb3JCb2R5LnN0YXR1c0NvZGUgPSA0MDA7XG4gICAgZXJyb3JCb2R5LmVycm9yQ29kZSA9ICc0MDAwJztcbiAgICByZXR1cm4gZXJyb3JCb2R5O1xufSIsImltcG9ydCB7IFMzIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXMzJztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzM1V0aWxzKGFjdGlvbiwgcGFyYW1zKSB7XHJcbiAgICBjb25zdCBzMyA9IG5ldyBTMygpO1xyXG4gICAgcmV0dXJuIHMzW2FjdGlvbl0ocGFyYW1zKTtcclxufVxyXG5cclxuY29uc3QgUzNVdGlsID0ge1xyXG4gICAgZ2V0T2JqZWN0OiAocGFyYW1zKSA9PiBnZXRTMyhwYXJhbXMpLFxyXG4gICAgZGVsZXRlT2JqZWN0OiAocGFyYW1zKSA9PiBzM1V0aWxzKCdkZWxldGVPYmplY3QnLCBwYXJhbXMpLFxyXG4gICAgcHV0T2JqZWN0OiAocGFyYW1zKSA9PiBzM1V0aWxzKCdwdXRPYmplY3QnLCBwYXJhbXMpLFxyXG4gICAgbGlzdE9iamVjdHNWMjogKHBhcmFtcykgPT4gczNVdGlscygnbGlzdE9iamVjdHNWMicsIHBhcmFtcylcclxufTtcclxuZXhwb3J0IGRlZmF1bHQgUzNVdGlsO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UzMocGFyYW1zKSB7XHJcbiAgICBjb25zdCBzMyA9IG5ldyBTMygpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzMy5nZXRPYmplY3QocGFyYW1zKTtcclxuICAgIHJldHVybiByZXNwb25zZS5Cb2R5LnRyYW5zZm9ybVRvU3RyaW5nKCd1dGYtOCcpO1xyXG59IiwiaW1wb3J0IHsgU05TIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNucyc7XHJcblxyXG5jb25zdCBTTlNVdGlsID0ge1xyXG4gICAgcHVibGlzaDogKHBhcmFtcykgPT4gcHVibGlzaChwYXJhbXMpLFxyXG4gICAgY3JlYXRlVG9waWM6IChwYXJhbXMpID0+IGNyZWF0ZVRvcGljKHBhcmFtcylcclxufTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2gocGFyYW1zKSB7XHJcbiAgICBjb25zdCBzbnMgPSBuZXcgU05TKCk7XHJcbiAgICByZXR1cm4gYXdhaXQgc25zLnB1Ymxpc2gocGFyYW1zKTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlVG9waWMocGFyYW1zKSB7XHJcbiAgICBjb25zdCBzbnMgPSBuZXcgU05TKCk7XHJcbiAgICByZXR1cm4gYXdhaXQgc25zLmNyZWF0ZVRvcGljKHBhcmFtcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNOU1V0aWw7XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYXdzLXNkay9jbGllbnQtczNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGF3cy1zZGsvY2xpZW50LXNuc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYXdzLXNkay9saWItZHluYW1vZGJcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vbWVudFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJtb21lbnQvbW9tZW50LmpzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInNlcXVlbGl6ZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ1bXp1Z1wiKTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiaW1wb3J0IHsgaGFuZGxlRmlsZSBhcyBoYW5kbGVGaWxlSW1wb3J0IH0gZnJvbSAnLi9ldmVudE1hbmFnZXIvaGFuZGxlRmlsZS5qcyc7XG5pbXBvcnQgeyB3YXRjaEJ1Y2tldCBhcyB3YXRjaEJ1Y2tldEltcG9ydCB9IGZyb20gJy4vZXZlbnRNYW5hZ2VyL3dhdGNoQnVja2V0LmpzJztcbmltcG9ydCB7IHB1Ymxpc2hFdmVudHMgYXMgcHVibGlzaEV2ZW50c0ltcG9ydCB9IGZyb20gJy4vZXZlbnRNYW5hZ2VyL3B1Ymxpc2hFdmVudHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlRmlsdGVycyBhcyBjcmVhdGVGaWx0ZXJzSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvY3JlYXRlRmlsdGVycy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTb3J0IGFzIGNyZWF0ZVNvcnRJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9jcmVhdGVTb3J0LmpzJztcbmltcG9ydCB7IGZpbmRBbGwgYXMgZmluZEFsbEltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2ZpbmRBbGwuanMnO1xuaW1wb3J0IHsgY2hlY2tNb2R1bGUgYXMgY2hlY2tNb2R1bGVJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9hY2Nlc3NSaWdodHNVdGlscy5qcyc7XG5pbXBvcnQgeyBmYWlsdXJlIGFzIGZhaWx1cmVJbXBvcnQsIHN1Y2Nlc3MgYXMgc3VjY2Vzc0ltcG9ydCB9IGZyb20gJy4vcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IHJ1bk1pZ3JhdGlvbnMgYXMgcnVuTWlncmF0aW9uc0ltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJTZXR1cC9taWdyYXRpb25zLmpzJztcbmltcG9ydCB7IGdldEN1cnJlbnRVc2VyIGFzIGdldEN1cnJlbnRVc2VySW1wb3J0IH0gZnJvbSAnLi9yZXF1ZXN0UmVzb25zZS9yZXF1ZXN0UmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc3VjY2Vzc0h0bWwgYXMgc3VjY2Vzc0h0bWxJbXBvcnQgfSBmcm9tICcuL3JlcXVlc3RSZXNvbnNlL3JlcXVlc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50IGFzIGdldEN1cnJlbnRVc2VyTmFtZUZyb21Db2duaXRvRXZlbnRJbXBvcnQgfSBmcm9tICcuL3JlcXVlc3RSZXNvbnNlL3JlcXVlc3RSZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBkZWZhdWx0RmlsdGVycyBhcyBkZWZhdWx0RmlsdGVyc0ltcG9ydCB9IGZyb20gJy4vZGF0YWJhc2UvZGJVdGlscy9xdWVyeVN0cmluZ1V0aWxzL2RlZmF1bHRGaWx0ZXJzLmpzJztcbmltcG9ydCB7IGFjY2Vzc1JpZ2h0c1V0aWxzIGFzIGFjY2Vzc1JpZ2h0c1V0aWxzSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuaW1wb3J0IHsgcGFyc2VCb2R5IGFzIHBhcnNlQm9keUltcG9ydCB9IGZyb20gJy4vcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IHBhcnNlRXZlbnQgYXMgcGFyc2VFdmVudEltcG9ydCB9IGZyb20gJy4vcmVxdWVzdFJlc29uc2UvcmVxdWVzdFJlc3BvbnNlLmpzJztcbmltcG9ydCB7IGdldEJ1c2luZXNzZXNJbmZvIGFzIGdldEJ1c2luZXNzZXNJbmZvSW1wb3J0IH0gZnJvbSAnLi9kYXRhYmFzZS9kYlV0aWxzL3F1ZXJ5U3RyaW5nVXRpbHMvYWNjZXNzUmlnaHRzVXRpbHMuanMnO1xuaW1wb3J0IHsgdXNlckRlZmF1bHRCaWQgYXMgdXNlckRlZmF1bHRCaWRJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9hY2Nlc3NSaWdodHNVdGlscy5qcyc7XG5pbXBvcnQgeyBjaGVja1dyaXRlQWNjZXNzIGFzIGNoZWNrV3JpdGVBY2Nlc3NJbXBvcnQgfSBmcm9tICcuL2RhdGFiYXNlL2RiVXRpbHMvcXVlcnlTdHJpbmdVdGlscy9hY2Nlc3NSaWdodHNVdGlscy5qcyc7XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVGaWxlID0gaGFuZGxlRmlsZUltcG9ydDtcbmV4cG9ydCBjb25zdCB3YXRjaEJ1Y2tldCA9IHdhdGNoQnVja2V0SW1wb3J0O1xuZXhwb3J0IGNvbnN0IHB1Ymxpc2hFdmVudHMgPSBwdWJsaXNoRXZlbnRzSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUZpbHRlcnMgPSBjcmVhdGVGaWx0ZXJzSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVNvcnQgPSBjcmVhdGVTb3J0SW1wb3J0O1xuZXhwb3J0IGNvbnN0IGZpbmRBbGwgPSBmaW5kQWxsSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGNoZWNrTW9kdWxlID0gY2hlY2tNb2R1bGVJbXBvcnQ7XG5leHBvcnQgY29uc3QgZmFpbHVyZSA9IGZhaWx1cmVJbXBvcnQ7XG5leHBvcnQgY29uc3Qgc3VjY2VzcyA9IHN1Y2Nlc3NJbXBvcnQ7XG5leHBvcnQgY29uc3QgcnVuTWlncmF0aW9ucyA9IHJ1bk1pZ3JhdGlvbnNJbXBvcnQ7XG5leHBvcnQgY29uc3QgZ2V0Q3VycmVudFVzZXIgPSBnZXRDdXJyZW50VXNlckltcG9ydDtcbmV4cG9ydCBjb25zdCBzdWNjZXNzSHRtbCA9IHN1Y2Nlc3NIdG1sSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRVc2VyTmFtZUZyb21Db2duaXRvRXZlbnQgPSBnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50SW1wb3J0O1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRGaWx0ZXJzID0gZGVmYXVsdEZpbHRlcnNJbXBvcnQ7XG5leHBvcnQgY29uc3QgYWNjZXNzUmlnaHRzVXRpbHMgPSBhY2Nlc3NSaWdodHNVdGlsc0ltcG9ydDtcbmV4cG9ydCBjb25zdCBwYXJzZUJvZHkgPSBwYXJzZUJvZHlJbXBvcnQ7XG5leHBvcnQgY29uc3QgcGFyc2VFdmVudCA9IHBhcnNlRXZlbnRJbXBvcnQ7XG5leHBvcnQgY29uc3QgZ2V0QnVzaW5lc3Nlc0luZm8gPSBnZXRCdXNpbmVzc2VzSW5mb0ltcG9ydDtcbmV4cG9ydCBjb25zdCB1c2VyRGVmYXVsdEJpZCA9IHVzZXJEZWZhdWx0QmlkSW1wb3J0O1xuZXhwb3J0IGNvbnN0IGNoZWNrV3JpdGVBY2Nlc3MgPSBjaGVja1dyaXRlQWNjZXNzSW1wb3J0O1xuIl0sIm5hbWVzIjpbInJ1bk1pZ3JhdGlvbnMiLCJfbG9kYXNoIiwicmVxdWlyZSIsIl9sb2Rhc2gyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl91bXp1ZyIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiZGF0YWJhc2VOYW1lIiwic2VxdWVsaXplSW5zdGFuY2UiLCJpbml0aWFsaXplTW9kZWxzIiwicGF0aFRvTWlncmF0aW9uRm9sZGVyIiwicHJvY2VzcyIsImVudiIsIlBXRCIsInVtenVnIiwiVW16dWciLCJtaWdyYXRpb25zIiwiZ2xvYiIsImNvbnRleHQiLCJnZXRRdWVyeUludGVyZmFjZSIsInN0b3JhZ2UiLCJTZXF1ZWxpemVTdG9yYWdlIiwic2VxdWVsaXplIiwibG9nZ2VyIiwiY29uc29sZSIsInBlbmRpbmdNaWdyYXRpb25zIiwicGVuZGluZyIsImxvZyIsInVwIiwiY2F0Y2giLCJ1cEVycm9yIiwiZG93biIsIl8iLCJjaGFpbiIsIm1hcCIsInJldmVyc2UiLCJ2YWx1ZSIsInRoZW4iLCJtc2ciLCJlcnJvciIsIkVycm9yIiwiZG93bkVycm9yIiwiYWNjZXNzUmlnaHRzVXRpbHMiLCJleHBvcnRzIiwidXNlckRlZmF1bHRCaWQiLCJnZXRCdXNpbmVzc2VzSW5mbyIsImdldE1vZHVsZUluZm8iLCJjaGVja01vZHVsZSIsImNoZWNrV3JpdGVBY2Nlc3MiLCJfZXJyb3JDb2RlcyIsIl9yZXF1ZXN0UmVzcG9uc2UiLCJldmVudCIsIm9wdGlvbnMiLCJ1c2VDb2duaXRvQmlkIiwiZ2V0IiwicmVxdWVzdGVkQnVzaW5lc3NJZHMiLCJnZXRSZXF1ZXN0ZWRCdXNpbmVzc0lkcyIsImFsbG93ZWRCdXNpbmVzc0lkcyIsImdldEFsbG93ZWRCdXNpbmVzc0lkcyIsImxvY2FsQmlkTGlzdCIsImlzRW1wdHkiLCJCVUlMRF9FTlYiLCJsZW5ndGgiLCJpbnRlcnNlY3Rpb24iLCJqc29uVG9QYXJzZSIsImRiaSIsIkpTT04iLCJwYXJzZSIsInNwbGl0IiwiYnVzaW5lc3NlcyIsIk9iamVjdCIsImtleXMiLCJhY2Nlc3NSaWdodHMiLCJiaWRzIiwid2l0aExvY2FsIiwic2V0IiwiYXIiLCJtb2R1bGVSaWdodHMiLCJtb2R1bGVOYW1lIiwiYWxsb3dBY2Nlc3MiLCJlcnJvckxpc3QiLCJ1bmF1dGhvcml6ZWQiLCJ1c2VyUm9sZXMiLCJhZG1pbiIsInJlYWQiLCJ3cml0ZSIsImV2ZW50Qm9keSIsInBhcnNlQm9keSIsImJ1c2luZXNzSWRzIiwiYnVzaW5lc3NJZCIsImZpbmQiLCJpZCIsInJhdyIsInVzZXJSaWdodCIsIl9zZXF1ZWxpemUiLCJfc2VxdWVsaXplMiIsIl9tb21lbnQiLCJfbW9tZW50MiIsIl9hY2Nlc3NSaWdodHNVdGlscyIsImNyZWF0ZUZpbHRlcnMiLCJvYmplY3RGaWx0ZXJzIiwicXVlcnkiLCJzdGFydERhdGUiLCJlbmREYXRlIiwid2hlcmUiLCJyZWR1Y2UiLCJhY2MiLCJpdGVtIiwidmFsIiwiaXRlbU5hbWUiLCJpbmNsdWRlcyIsImZpbHRlclR5cGUiLCJEQiIsIk9wIiwiaUxpa2UiLCJvciIsImluIiwicGFyc2VkSnNvbiIsImUiLCJ0eXBlIiwiQk9PTEVBTiIsInF1ZXJ5VmFsdWUiLCJ0b0xvd2VyQ2FzZSIsImJvb2xlYW5NYXAiLCJhY3RpdmUiLCJmaWx0ZXJBZGRzIiwicyIsIm1vbWVudCIsInV0YyIsImRhdGVzIiwiYmV0d2VlbiIsInRvRGF0ZSIsImlzVmFsaWQiLCJpbnZhbGlkU3RhcnREYXRlIiwiaW52YWxpZEVuZERhdGUiLCJjcmVhdGVkQXQiLCJ3aXRoRGF0ZSIsImFzc2lnbiIsImNyZWF0ZVNvcnQiLCJkZWZhdWx0RmlsdGVyIiwiY29weU9mRGVmYXVsdEZpbHRlciIsImNsb25lIiwic29ydCIsInRlc3RJdGVtIiwiaW5kZXhPZiIsInN1YnN0ciIsInNvcnRJdGVtIiwiZm9yRWFjaCIsInBhcmVudENoaWxkTGlzdCIsInB1c2giLCJkZWZhdWx0RmlsdGVycyIsImFkZEZpbHRlcnNGcm9tU2NoZW1hIiwic2NoZW1hIiwic3ViU2NoZW1hcyIsImZpbHRlcnMiLCJrZXkiLCJhY2N1bXVsYXRvciIsImtleVByZWZpeCIsImFzTGlua0FsaWFzIiwiU1RSSU5HIiwiZXEiLCJpdGVtVHlwZSIsIkNIQVIiLCJURVhUIiwiREVDSU1BTCIsIkJJR0lOVCIsIklOVEVHRVIiLCJEQVRFIiwiREFURU9OTFkiLCJsdCIsIkpTT05CIiwiY29udGFpbnMiLCJnZXRQYWdpbmF0aW9uRnJvbUZpbmRBbGwiLCJmaW5kQWxsIiwicmVzdWx0IiwibGltaXQiLCJvZmZzZXQiLCJoYXNNb3JlIiwic3BsaWNlIiwicGFnZU9iamVjdCIsInJvd3MiLCJtb2RlbCIsImZpbmRBcmdzIiwiaW5jbHVkZSIsImFsbCIsIm5lc3RlZCIsInJlc3VsdHMiLCJmaW5kVXRpbHMiLCJfbGliRHluYW1vZGIiLCJfY2xpZW50RHluYW1vZGIiLCJkeW5hbW9VdGlsIiwicGFyYW1zIiwiZHluYW1vRGIiLCJEeW5hbW9EQkRvY3VtZW50IiwiZnJvbSIsIkR5bmFtb0RCIiwiaGFuZGxlRXZlbnRzIiwiX2hhbmRsZUZpbGUiLCJfYmx1ZWJpcmQiLCJfYmx1ZWJpcmQyIiwidHJhbnNmb3JtZXIiLCJlcnJvckhhbmRsZXJQZXJGaWxlIiwic2hvdWxkU2tpcEZhaWxlZEZvbGRlcnMiLCJ1c2VySW1wb3J0VHlwZXMiLCJSZWNvcmRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJoYXNFcnJvcnMiLCJyZWNvcmQiLCJzbnNJbmZvIiwiczNCdWNrZXQiLCJidWNrZXQiLCJmaWxlcyIsImZpbGUiLCJwYXRoIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaGFuZGxlRmlsZSIsImVyciIsIl9TM1V0aWxzIiwiX1MzVXRpbHMyIiwiQnVja2V0IiwiS2V5IiwiYm9keSIsIlMzVXRpbCIsImdldE9iamVjdCIsInBhcnNlZEJvZHkiLCJyZXR1cm5lZFZhbHVlIiwiZGVsZXRlT2JqZWN0IiwiY29kZSIsIm5ld1BhdGgiLCJ1c2Vyc0ltcG9ydHMiLCJ2YWx1ZXMiLCJpdGVtcyIsImZpbGVOYW1lIiwibGFzdCIsImZvbGRlck5hbWUiLCJmaXJzdCIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwibmV3UGFyYW1zIiwiQm9keSIsInB1dE9iamVjdCIsImxvb3AiLCJwdWJsaXNoRXZlbnRzIiwiX1NOU1V0aWxzIiwiX1NOU1V0aWxzMiIsIl9keW5hbW9VdGlscyIsIl9keW5hbW9VdGlsczIiLCJtYXhLZXlzIiwiYnVja2V0UmVzdWx0IiwiZmlsZUxpc3QiLCJjdXJyZW50VGltZSIsIlMzVXRpbHMiLCJsaXN0T2JqZWN0c1YyIiwiTWF4S2V5cyIsIkNvbnRpbnVhdGlvblRva2VuIiwibmV3RmlsZXMiLCJmaWx0ZXIiLCJDb250ZW50cyIsImZpbGVEZWxheVRpbWUiLCJpc1NhbWVPckJlZm9yZSIsImNvbmNhdCIsIklzVHJ1bmNhdGVkIiwiTmV4dENvbnRpbnVhdGlvblRva2VuIiwiY29uZmlnVGFibGUiLCJ0YWJsZUtleSIsInNuc1RvcGljIiwiVGFibGVOYW1lIiwiY2h1bmtTaXplIiwibWF4TWVzc2FnZXMiLCJzbnNDcmVhdGVUb3BpY1Jlc3BvbnNlIiwiU05TVXRpbCIsImNyZWF0ZVRvcGljIiwiTmFtZSIsInRvcGljQXJuIiwiVG9waWNBcm4iLCJtZXNzYWdlTGlzdCIsImNodW5rIiwic2xpY2UiLCJwdWJsaXNoIiwiTWVzc2FnZSIsInN0cmluZ2lmeSIsIndhdGNoQnVja2V0IiwiX3B1Ymxpc2hFdmVudHMiLCJfaGFuZGxlRXZlbnRzIiwiZHluYW1vQ29uZmlnVGFibGUiLCJkeW5hbW9Db25maWdLZXkiLCJub29wIiwiRXZlbnRTb3VyY2UiLCJpc0VxdWFsIiwiaW52YWxpZEludmVudG9yeVJlbGVhc2VSZXF1ZXN0IiwibWVzc2FnZSIsImVycm9yQ29kZSIsInN0YXR1c0NvZGUiLCJhbHJlYWR5UmVsZWFzZWQiLCJhbHJlYWR5UmVjZWl2ZWQiLCJpbnZhbGlkSXRlbXNSZXF1ZXN0IiwiaW52YWxpZElEIiwiaW52YWxpZFJlY2VpdmFibGUiLCJpbnZhbGlkUmVxdWVzdCIsImludmFsaWRBUElLZXkiLCJxYkNyZWF0aW9uRXJyb3IiLCJjYW5ub3RSZW9wZW4iLCJpbnZhbGlkRGF0ZUZvcm1hdCIsImludmFsaWRPcmRlclN0YXR1cyIsImludmFsaWRQYXltZW50U3RhdHVzIiwiaW52YWxpZFJlbGVhc2VTdGF0dXMiLCJpbnZhbGlkUmVjZWl2YWJsZVN0YXR1cyIsImludmFsaWRKc29uIiwiaW52YWxpZEZpbHRlciIsImludmFsaWRVc2VyTmFtZVVwZGF0ZSIsImltYWdlU2l6ZUxpbWl0Iiwibm90Rm91bmQiLCJlbWFpbFJlcXVpcmVkIiwibW9iaWxlUGhvbmVSZXF1aXJlZCIsImludmFsaWRDYWRlbmNlVHlwZSIsInN1Y2Nlc3MiLCJzdWNjZXNzSHRtbCIsImdldEN1cnJlbnRVc2VyTmFtZUZyb21Db2duaXRvRXZlbnQiLCJnZXRDdXJyZW50VXNlciIsImZhaWx1cmUiLCJwYXJzZUV2ZW50IiwiZGV0ZWN0U2VxdWVsaXplRXJyb3IiLCJkZXRlY3RKb3lFcnJvciIsImRiQ2xvc2UiLCJidWlsZFJlc3BvbnNlIiwiaHRtbCIsImhlYWRlcnMiLCJhdHRyaWJ1dGVzIiwidXNlcm5hbWUiLCJjbGVhbmVkRXJyb3JCb2R5IiwiVVRJTF9MT0ciLCJOT1JNQUxfRVJST1IiLCJpc1VuZGVmaW5lZCIsImRldGFpbHMiLCJuZXdCb2R5IiwibWVyZ2UiLCJyZXF1ZXN0RXZlbnQiLCJpc1N0cmluZyIsImlzT2JqZWN0IiwiY2FsbGJhY2siLCJlcnJvckJvZHkiLCJzZXF1ZWxpemVFcnJvciIsInBhcmVudEVycm9yIiwidHJpbSIsImpveUVycm9yIiwiczNVdGlscyIsIl9jbGllbnRTIiwiYWN0aW9uIiwiczMiLCJTMyIsImdldFMzIiwicmVzcG9uc2UiLCJ0cmFuc2Zvcm1Ub1N0cmluZyIsIl9jbGllbnRTbnMiLCJzbnMiLCJTTlMiLCJfd2F0Y2hCdWNrZXQiLCJfY3JlYXRlRmlsdGVycyIsIl9jcmVhdGVTb3J0IiwiX2ZpbmRBbGwiLCJfbWlncmF0aW9ucyIsIl9kZWZhdWx0RmlsdGVycyIsImhhbmRsZUZpbGVJbXBvcnQiLCJ3YXRjaEJ1Y2tldEltcG9ydCIsInB1Ymxpc2hFdmVudHNJbXBvcnQiLCJjcmVhdGVGaWx0ZXJzSW1wb3J0IiwiY3JlYXRlU29ydEltcG9ydCIsImZpbmRBbGxJbXBvcnQiLCJjaGVja01vZHVsZUltcG9ydCIsImZhaWx1cmVJbXBvcnQiLCJzdWNjZXNzSW1wb3J0IiwicnVuTWlncmF0aW9uc0ltcG9ydCIsImdldEN1cnJlbnRVc2VySW1wb3J0Iiwic3VjY2Vzc0h0bWxJbXBvcnQiLCJnZXRDdXJyZW50VXNlck5hbWVGcm9tQ29nbml0b0V2ZW50SW1wb3J0IiwiZGVmYXVsdEZpbHRlcnNJbXBvcnQiLCJhY2Nlc3NSaWdodHNVdGlsc0ltcG9ydCIsInBhcnNlQm9keUltcG9ydCIsInBhcnNlRXZlbnRJbXBvcnQiLCJnZXRCdXNpbmVzc2VzSW5mb0ltcG9ydCIsInVzZXJEZWZhdWx0QmlkSW1wb3J0IiwiY2hlY2tXcml0ZUFjY2Vzc0ltcG9ydCJdLCJzb3VyY2VSb290IjoiIn0=
|
|
1027
|
+
//# sourceMappingURL=main.js.map
|