payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
330 lines (329 loc) • 39.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _httpstatus = /*#__PURE__*/ _interop_require_default(require("http-status"));
const _executeAccess = /*#__PURE__*/ _interop_require_default(require("../../auth/executeAccess"));
const _combineQueries = require("../../database/combineQueries");
const _validateQueryPaths = require("../../database/queryValidation/validateQueryPaths");
const _errors = require("../../errors");
const _afterChange = require("../../fields/hooks/afterChange");
const _afterRead = require("../../fields/hooks/afterRead");
const _beforeChange = require("../../fields/hooks/beforeChange");
const _beforeValidate = require("../../fields/hooks/beforeValidate");
const _deleteAssociatedFiles = require("../../uploads/deleteAssociatedFiles");
const _generateFileData = require("../../uploads/generateFileData");
const _unlinkTempFiles = require("../../uploads/unlinkTempFiles");
const _uploadFiles = require("../../uploads/uploadFiles");
const _commitTransaction = require("../../utilities/commitTransaction");
const _initTransaction = require("../../utilities/initTransaction");
const _killTransaction = require("../../utilities/killTransaction");
const _buildCollectionFields = require("../../versions/buildCollectionFields");
const _appendVersionToQueryKey = require("../../versions/drafts/appendVersionToQueryKey");
const _saveVersion = require("../../versions/saveVersion");
const _utils = require("./utils");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
async function update(incomingArgs) {
let args = incomingArgs;
try {
const shouldCommit = await (0, _initTransaction.initTransaction)(args.req);
// /////////////////////////////////////
// beforeOperation - Collection
// /////////////////////////////////////
await args.collection.config.hooks.beforeOperation.reduce(async (priorHook, hook)=>{
await priorHook;
args = await hook({
args,
collection: args.collection.config,
context: args.req.context,
operation: 'update',
req: args.req
}) || args;
}, Promise.resolve());
const { collection: { config: collectionConfig }, collection, depth, draft: draftArg = false, overrideAccess, overwriteExistingFiles = false, req: { fallbackLocale, locale, payload: { config }, payload, t }, req, showHiddenFields, where } = args;
if (!where) {
throw new _errors.APIError("Missing 'where' query of documents to update.", _httpstatus.default.BAD_REQUEST);
}
const { data: bulkUpdateData } = args;
const shouldSaveDraft = Boolean(draftArg && collectionConfig.versions.drafts);
// /////////////////////////////////////
// Access
// /////////////////////////////////////
let accessResult;
if (!overrideAccess) {
accessResult = await (0, _executeAccess.default)({
req
}, collectionConfig.access.update);
}
await (0, _validateQueryPaths.validateQueryPaths)({
collectionConfig,
overrideAccess,
req,
where
});
// /////////////////////////////////////
// Retrieve documents
// /////////////////////////////////////
const fullWhere = (0, _combineQueries.combineQueries)(where, accessResult);
let docs;
if (collectionConfig.versions?.drafts && shouldSaveDraft) {
const versionsWhere = (0, _appendVersionToQueryKey.appendVersionToQueryKey)(fullWhere);
await (0, _validateQueryPaths.validateQueryPaths)({
collectionConfig: collection.config,
overrideAccess,
req,
versionFields: (0, _buildCollectionFields.buildVersionCollectionFields)(collection.config),
where: versionsWhere
});
const query = await payload.db.queryDrafts({
collection: collectionConfig.slug,
locale,
req,
where: versionsWhere
});
docs = query.docs;
} else {
const query = await payload.db.find({
collection: collectionConfig.slug,
limit: 0,
locale,
pagination: false,
req,
where: fullWhere
});
docs = query.docs;
}
// /////////////////////////////////////
// Generate data for all files and sizes
// /////////////////////////////////////
const { data: newFileData, files: filesToUpload } = await (0, _generateFileData.generateFileData)({
collection,
config,
data: bulkUpdateData,
overwriteExistingFiles,
req,
throwOnMissingFile: false
});
const errors = [];
const promises = docs.map(async (doc)=>{
const { id } = doc;
let data = {
...newFileData,
...bulkUpdateData
};
try {
const originalDoc = await (0, _afterRead.afterRead)({
collection: collectionConfig,
context: req.context,
depth: 0,
doc,
fallbackLocale,
global: null,
locale,
overrideAccess: true,
req,
showHiddenFields: true
});
await (0, _deleteAssociatedFiles.deleteAssociatedFiles)({
collectionConfig,
config,
doc,
files: filesToUpload,
overrideDelete: false,
t
});
// /////////////////////////////////////
// beforeValidate - Fields
// /////////////////////////////////////
data = await (0, _beforeValidate.beforeValidate)({
id,
collection: collectionConfig,
context: req.context,
data,
doc: originalDoc,
global: null,
operation: 'update',
overrideAccess,
req
});
// /////////////////////////////////////
// beforeValidate - Collection
// /////////////////////////////////////
await collectionConfig.hooks.beforeValidate.reduce(async (priorHook, hook)=>{
await priorHook;
data = await hook({
collection: collectionConfig,
context: req.context,
data,
operation: 'update',
originalDoc,
req
}) || data;
}, Promise.resolve());
// /////////////////////////////////////
// Write files to local storage
// /////////////////////////////////////
if (!collectionConfig.upload.disableLocalStorage) {
await (0, _uploadFiles.uploadFiles)(payload, filesToUpload, t);
}
// /////////////////////////////////////
// beforeChange - Collection
// /////////////////////////////////////
await collectionConfig.hooks.beforeChange.reduce(async (priorHook, hook)=>{
await priorHook;
data = await hook({
collection: collectionConfig,
context: req.context,
data,
operation: 'update',
originalDoc,
req
}) || data;
}, Promise.resolve());
// /////////////////////////////////////
// beforeChange - Fields
// /////////////////////////////////////
let result = await (0, _beforeChange.beforeChange)({
id,
collection: collectionConfig,
context: req.context,
data,
doc: originalDoc,
docWithLocales: doc,
global: null,
operation: 'update',
req,
skipValidation: shouldSaveDraft || data._status === 'draft'
});
// /////////////////////////////////////
// Update
// /////////////////////////////////////
if (!shouldSaveDraft) {
result = await req.payload.db.updateOne({
id,
collection: collectionConfig.slug,
data: result,
locale,
req
});
}
// /////////////////////////////////////
// Create version
// /////////////////////////////////////
if (collectionConfig.versions) {
result = await (0, _saveVersion.saveVersion)({
id,
collection: collectionConfig,
docWithLocales: {
...result,
createdAt: doc.createdAt
},
draft: shouldSaveDraft,
payload,
req
});
}
// /////////////////////////////////////
// afterRead - Fields
// /////////////////////////////////////
result = await (0, _afterRead.afterRead)({
collection: collectionConfig,
context: req.context,
depth,
doc: result,
fallbackLocale: null,
global: null,
locale,
overrideAccess,
req,
showHiddenFields
});
// /////////////////////////////////////
// afterRead - Collection
// /////////////////////////////////////
await collectionConfig.hooks.afterRead.reduce(async (priorHook, hook)=>{
await priorHook;
result = await hook({
collection: collectionConfig,
context: req.context,
doc: result,
req
}) || result;
}, Promise.resolve());
// /////////////////////////////////////
// afterChange - Fields
// /////////////////////////////////////
result = await (0, _afterChange.afterChange)({
collection: collectionConfig,
context: req.context,
data,
doc: result,
global: null,
operation: 'update',
previousDoc: originalDoc,
req
});
// /////////////////////////////////////
// afterChange - Collection
// /////////////////////////////////////
await collectionConfig.hooks.afterChange.reduce(async (priorHook, hook)=>{
await priorHook;
result = await hook({
collection: collectionConfig,
context: req.context,
doc: result,
operation: 'update',
previousDoc: originalDoc,
req
}) || result;
}, Promise.resolve());
await (0, _unlinkTempFiles.unlinkTempFiles)({
collectionConfig,
config,
req
});
// /////////////////////////////////////
// Return results
// /////////////////////////////////////
return result;
} catch (error) {
errors.push({
id,
message: error.message
});
}
return null;
});
const awaitedDocs = await Promise.all(promises);
let result = {
docs: awaitedDocs.filter(Boolean),
errors
};
// /////////////////////////////////////
// afterOperation - Collection
// /////////////////////////////////////
result = await (0, _utils.buildAfterOperation)({
args,
collection: collectionConfig,
operation: 'update',
result
});
if (shouldCommit) await (0, _commitTransaction.commitTransaction)(req);
return result;
} catch (error) {
await (0, _killTransaction.killTransaction)(args.req);
throw error;
}
}
const _default = update;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL3VwZGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IERlZXBQYXJ0aWFsIH0gZnJvbSAndHMtZXNzZW50aWFscydcblxuaW1wb3J0IGh0dHBTdGF0dXMgZnJvbSAnaHR0cC1zdGF0dXMnXG5cbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVkVHlwZXMgfSBmcm9tICcuLi8uLi8nXG5pbXBvcnQgdHlwZSB7IEFjY2Vzc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgUGF5bG9hZFJlcXVlc3QgfSBmcm9tICcuLi8uLi9leHByZXNzL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBXaGVyZSB9IGZyb20gJy4uLy4uL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBCdWxrT3BlcmF0aW9uUmVzdWx0LCBDb2xsZWN0aW9uIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVVcGRhdGVUeXBlIH0gZnJvbSAnLi9jcmVhdGUnXG5cbmltcG9ydCBleGVjdXRlQWNjZXNzIGZyb20gJy4uLy4uL2F1dGgvZXhlY3V0ZUFjY2VzcydcbmltcG9ydCB7IGNvbWJpbmVRdWVyaWVzIH0gZnJvbSAnLi4vLi4vZGF0YWJhc2UvY29tYmluZVF1ZXJpZXMnXG5pbXBvcnQgeyB2YWxpZGF0ZVF1ZXJ5UGF0aHMgfSBmcm9tICcuLi8uLi9kYXRhYmFzZS9xdWVyeVZhbGlkYXRpb24vdmFsaWRhdGVRdWVyeVBhdGhzJ1xuaW1wb3J0IHsgQVBJRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMnXG5pbXBvcnQgeyBhZnRlckNoYW5nZSB9IGZyb20gJy4uLy4uL2ZpZWxkcy9ob29rcy9hZnRlckNoYW5nZSdcbmltcG9ydCB7IGFmdGVyUmVhZCB9IGZyb20gJy4uLy4uL2ZpZWxkcy9ob29rcy9hZnRlclJlYWQnXG5pbXBvcnQgeyBiZWZvcmVDaGFuZ2UgfSBmcm9tICcuLi8uLi9maWVsZHMvaG9va3MvYmVmb3JlQ2hhbmdlJ1xuaW1wb3J0IHsgYmVmb3JlVmFsaWRhdGUgfSBmcm9tICcuLi8uLi9maWVsZHMvaG9va3MvYmVmb3JlVmFsaWRhdGUnXG5pbXBvcnQgeyBkZWxldGVBc3NvY2lhdGVkRmlsZXMgfSBmcm9tICcuLi8uLi91cGxvYWRzL2RlbGV0ZUFzc29jaWF0ZWRGaWxlcydcbmltcG9ydCB7IGdlbmVyYXRlRmlsZURhdGEgfSBmcm9tICcuLi8uLi91cGxvYWRzL2dlbmVyYXRlRmlsZURhdGEnXG5pbXBvcnQgeyB1bmxpbmtUZW1wRmlsZXMgfSBmcm9tICcuLi8uLi91cGxvYWRzL3VubGlua1RlbXBGaWxlcydcbmltcG9ydCB7IHVwbG9hZEZpbGVzIH0gZnJvbSAnLi4vLi4vdXBsb2Fkcy91cGxvYWRGaWxlcydcbmltcG9ydCB7IGNvbW1pdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2NvbW1pdFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsgaW5pdFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL2luaXRUcmFuc2FjdGlvbidcbmltcG9ydCB7IGtpbGxUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9raWxsVHJhbnNhY3Rpb24nXG5pbXBvcnQgeyBidWlsZFZlcnNpb25Db2xsZWN0aW9uRmllbGRzIH0gZnJvbSAnLi4vLi4vdmVyc2lvbnMvYnVpbGRDb2xsZWN0aW9uRmllbGRzJ1xuaW1wb3J0IHsgYXBwZW5kVmVyc2lvblRvUXVlcnlLZXkgfSBmcm9tICcuLi8uLi92ZXJzaW9ucy9kcmFmdHMvYXBwZW5kVmVyc2lvblRvUXVlcnlLZXknXG5pbXBvcnQgeyBzYXZlVmVyc2lvbiB9IGZyb20gJy4uLy4uL3ZlcnNpb25zL3NhdmVWZXJzaW9uJ1xuaW1wb3J0IHsgYnVpbGRBZnRlck9wZXJhdGlvbiB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCB0eXBlIEFyZ3VtZW50czxUIGV4dGVuZHMgQ3JlYXRlVXBkYXRlVHlwZT4gPSB7XG4gIGNvbGxlY3Rpb246IENvbGxlY3Rpb25cbiAgZGF0YTogRGVlcFBhcnRpYWw8VD5cbiAgZGVwdGg/OiBudW1iZXJcbiAgZGlzYWJsZVZlcmlmaWNhdGlvbkVtYWlsPzogYm9vbGVhblxuICBkcmFmdD86IGJvb2xlYW5cbiAgb3ZlcnJpZGVBY2Nlc3M/OiBib29sZWFuXG4gIG92ZXJ3cml0ZUV4aXN0aW5nRmlsZXM/OiBib29sZWFuXG4gIHJlcTogUGF5bG9hZFJlcXVlc3RcbiAgc2hvd0hpZGRlbkZpZWxkcz86IGJvb2xlYW5cbiAgd2hlcmU6IFdoZXJlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZTxUU2x1ZyBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddPihcbiAgaW5jb21pbmdBcmdzOiBBcmd1bWVudHM8R2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVFNsdWddPixcbik6IFByb21pc2U8QnVsa09wZXJhdGlvblJlc3VsdDxUU2x1Zz4+IHtcbiAgbGV0IGFyZ3MgPSBpbmNvbWluZ0FyZ3NcblxuICB0cnkge1xuICAgIGNvbnN0IHNob3VsZENvbW1pdCA9IGF3YWl0IGluaXRUcmFuc2FjdGlvbihhcmdzLnJlcSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBiZWZvcmVPcGVyYXRpb24gLSBDb2xsZWN0aW9uXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgYXdhaXQgYXJncy5jb2xsZWN0aW9uLmNvbmZpZy5ob29rcy5iZWZvcmVPcGVyYXRpb24ucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgIGF3YWl0IHByaW9ySG9va1xuXG4gICAgICBhcmdzID1cbiAgICAgICAgKGF3YWl0IGhvb2soe1xuICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgY29sbGVjdGlvbjogYXJncy5jb2xsZWN0aW9uLmNvbmZpZyxcbiAgICAgICAgICBjb250ZXh0OiBhcmdzLnJlcS5jb250ZXh0LFxuICAgICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgICAgcmVxOiBhcmdzLnJlcSxcbiAgICAgICAgfSkpIHx8IGFyZ3NcbiAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgIGNvbnN0IHtcbiAgICAgIGNvbGxlY3Rpb246IHsgY29uZmlnOiBjb2xsZWN0aW9uQ29uZmlnIH0sXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgZGVwdGgsXG4gICAgICBkcmFmdDogZHJhZnRBcmcgPSBmYWxzZSxcbiAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgb3ZlcndyaXRlRXhpc3RpbmdGaWxlcyA9IGZhbHNlLFxuICAgICAgcmVxOiB7XG4gICAgICAgIGZhbGxiYWNrTG9jYWxlLFxuICAgICAgICBsb2NhbGUsXG4gICAgICAgIHBheWxvYWQ6IHsgY29uZmlnIH0sXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIHQsXG4gICAgICB9LFxuICAgICAgcmVxLFxuICAgICAgc2hvd0hpZGRlbkZpZWxkcyxcbiAgICAgIHdoZXJlLFxuICAgIH0gPSBhcmdzXG5cbiAgICBpZiAoIXdoZXJlKSB7XG4gICAgICB0aHJvdyBuZXcgQVBJRXJyb3IoXCJNaXNzaW5nICd3aGVyZScgcXVlcnkgb2YgZG9jdW1lbnRzIHRvIHVwZGF0ZS5cIiwgaHR0cFN0YXR1cy5CQURfUkVRVUVTVClcbiAgICB9XG5cbiAgICBjb25zdCB7IGRhdGE6IGJ1bGtVcGRhdGVEYXRhIH0gPSBhcmdzXG4gICAgY29uc3Qgc2hvdWxkU2F2ZURyYWZ0ID0gQm9vbGVhbihkcmFmdEFyZyAmJiBjb2xsZWN0aW9uQ29uZmlnLnZlcnNpb25zLmRyYWZ0cylcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBBY2Nlc3NcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBsZXQgYWNjZXNzUmVzdWx0OiBBY2Nlc3NSZXN1bHRcbiAgICBpZiAoIW92ZXJyaWRlQWNjZXNzKSB7XG4gICAgICBhY2Nlc3NSZXN1bHQgPSBhd2FpdCBleGVjdXRlQWNjZXNzKHsgcmVxIH0sIGNvbGxlY3Rpb25Db25maWcuYWNjZXNzLnVwZGF0ZSlcbiAgICB9XG5cbiAgICBhd2FpdCB2YWxpZGF0ZVF1ZXJ5UGF0aHMoe1xuICAgICAgY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgIG92ZXJyaWRlQWNjZXNzLFxuICAgICAgcmVxLFxuICAgICAgd2hlcmUsXG4gICAgfSlcblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBSZXRyaWV2ZSBkb2N1bWVudHNcbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICBjb25zdCBmdWxsV2hlcmUgPSBjb21iaW5lUXVlcmllcyh3aGVyZSwgYWNjZXNzUmVzdWx0KVxuXG4gICAgbGV0IGRvY3NcblxuICAgIGlmIChjb2xsZWN0aW9uQ29uZmlnLnZlcnNpb25zPy5kcmFmdHMgJiYgc2hvdWxkU2F2ZURyYWZ0KSB7XG4gICAgICBjb25zdCB2ZXJzaW9uc1doZXJlID0gYXBwZW5kVmVyc2lvblRvUXVlcnlLZXkoZnVsbFdoZXJlKVxuXG4gICAgICBhd2FpdCB2YWxpZGF0ZVF1ZXJ5UGF0aHMoe1xuICAgICAgICBjb2xsZWN0aW9uQ29uZmlnOiBjb2xsZWN0aW9uLmNvbmZpZyxcbiAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgIHJlcSxcbiAgICAgICAgdmVyc2lvbkZpZWxkczogYnVpbGRWZXJzaW9uQ29sbGVjdGlvbkZpZWxkcyhjb2xsZWN0aW9uLmNvbmZpZyksXG4gICAgICAgIHdoZXJlOiB2ZXJzaW9uc1doZXJlLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgcXVlcnkgPSBhd2FpdCBwYXlsb2FkLmRiLnF1ZXJ5RHJhZnRzPEdlbmVyYXRlZFR5cGVzWydjb2xsZWN0aW9ucyddW1RTbHVnXT4oe1xuICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLnNsdWcsXG4gICAgICAgIGxvY2FsZSxcbiAgICAgICAgcmVxLFxuICAgICAgICB3aGVyZTogdmVyc2lvbnNXaGVyZSxcbiAgICAgIH0pXG5cbiAgICAgIGRvY3MgPSBxdWVyeS5kb2NzXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gYXdhaXQgcGF5bG9hZC5kYi5maW5kKHtcbiAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZy5zbHVnLFxuICAgICAgICBsaW1pdDogMCxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBwYWdpbmF0aW9uOiBmYWxzZSxcbiAgICAgICAgcmVxLFxuICAgICAgICB3aGVyZTogZnVsbFdoZXJlLFxuICAgICAgfSlcblxuICAgICAgZG9jcyA9IHF1ZXJ5LmRvY3NcbiAgICB9XG5cbiAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgLy8gR2VuZXJhdGUgZGF0YSBmb3IgYWxsIGZpbGVzIGFuZCBzaXplc1xuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIGNvbnN0IHsgZGF0YTogbmV3RmlsZURhdGEsIGZpbGVzOiBmaWxlc1RvVXBsb2FkIH0gPSBhd2FpdCBnZW5lcmF0ZUZpbGVEYXRhKHtcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBjb25maWcsXG4gICAgICBkYXRhOiBidWxrVXBkYXRlRGF0YSxcbiAgICAgIG92ZXJ3cml0ZUV4aXN0aW5nRmlsZXMsXG4gICAgICByZXEsXG4gICAgICB0aHJvd09uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgIH0pXG5cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBkb2NzLm1hcChhc3luYyAoZG9jKSA9PiB7XG4gICAgICBjb25zdCB7IGlkIH0gPSBkb2NcbiAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAuLi5uZXdGaWxlRGF0YSxcbiAgICAgICAgLi4uYnVsa1VwZGF0ZURhdGEsXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRG9jID0gYXdhaXQgYWZ0ZXJSZWFkKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgIGNvbnRleHQ6IHJlcS5jb250ZXh0LFxuICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgIGRvYyxcbiAgICAgICAgICBmYWxsYmFja0xvY2FsZSxcbiAgICAgICAgICBnbG9iYWw6IG51bGwsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIG92ZXJyaWRlQWNjZXNzOiB0cnVlLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICBzaG93SGlkZGVuRmllbGRzOiB0cnVlLFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IGRlbGV0ZUFzc29jaWF0ZWRGaWxlcyh7XG4gICAgICAgICAgY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgZG9jLFxuICAgICAgICAgIGZpbGVzOiBmaWxlc1RvVXBsb2FkLFxuICAgICAgICAgIG92ZXJyaWRlRGVsZXRlOiBmYWxzZSxcbiAgICAgICAgICB0LFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gYmVmb3JlVmFsaWRhdGUgLSBGaWVsZHNcbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGRhdGEgPSBhd2FpdCBiZWZvcmVWYWxpZGF0ZTxEZWVwUGFydGlhbDxHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXVtUU2x1Z10+Pih7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGRvYzogb3JpZ2luYWxEb2MsXG4gICAgICAgICAgZ2xvYmFsOiBudWxsLFxuICAgICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgICAgb3ZlcnJpZGVBY2Nlc3MsXG4gICAgICAgICAgcmVxLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gYmVmb3JlVmFsaWRhdGUgLSBDb2xsZWN0aW9uXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICBhd2FpdCBjb2xsZWN0aW9uQ29uZmlnLmhvb2tzLmJlZm9yZVZhbGlkYXRlLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBob29rKSA9PiB7XG4gICAgICAgICAgYXdhaXQgcHJpb3JIb29rXG5cbiAgICAgICAgICBkYXRhID1cbiAgICAgICAgICAgIChhd2FpdCBob29rKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRG9jLFxuICAgICAgICAgICAgICByZXEsXG4gICAgICAgICAgICB9KSkgfHwgZGF0YVxuICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFdyaXRlIGZpbGVzIHRvIGxvY2FsIHN0b3JhZ2VcbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGlmICghY29sbGVjdGlvbkNvbmZpZy51cGxvYWQuZGlzYWJsZUxvY2FsU3RvcmFnZSkge1xuICAgICAgICAgIGF3YWl0IHVwbG9hZEZpbGVzKHBheWxvYWQsIGZpbGVzVG9VcGxvYWQsIHQpXG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIGJlZm9yZUNoYW5nZSAtIENvbGxlY3Rpb25cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGF3YWl0IGNvbGxlY3Rpb25Db25maWcuaG9va3MuYmVmb3JlQ2hhbmdlLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBob29rKSA9PiB7XG4gICAgICAgICAgYXdhaXQgcHJpb3JIb29rXG5cbiAgICAgICAgICBkYXRhID1cbiAgICAgICAgICAgIChhd2FpdCBob29rKHtcbiAgICAgICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRG9jLFxuICAgICAgICAgICAgICByZXEsXG4gICAgICAgICAgICB9KSkgfHwgZGF0YVxuICAgICAgICB9LCBQcm9taXNlLnJlc29sdmUoKSlcblxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIGJlZm9yZUNoYW5nZSAtIEZpZWxkc1xuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGJlZm9yZUNoYW5nZTxHZW5lcmF0ZWRUeXBlc1snY29sbGVjdGlvbnMnXVtUU2x1Z10+KHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgIGNvbnRleHQ6IHJlcS5jb250ZXh0LFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgZG9jOiBvcmlnaW5hbERvYyxcbiAgICAgICAgICBkb2NXaXRoTG9jYWxlczogZG9jLFxuICAgICAgICAgIGdsb2JhbDogbnVsbCxcbiAgICAgICAgICBvcGVyYXRpb246ICd1cGRhdGUnLFxuICAgICAgICAgIHJlcSxcbiAgICAgICAgICBza2lwVmFsaWRhdGlvbjogc2hvdWxkU2F2ZURyYWZ0IHx8IGRhdGEuX3N0YXR1cyA9PT0gJ2RyYWZ0JyxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIFVwZGF0ZVxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgaWYgKCFzaG91bGRTYXZlRHJhZnQpIHtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZXEucGF5bG9hZC5kYi51cGRhdGVPbmUoe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLnNsdWcsXG4gICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gQ3JlYXRlIHZlcnNpb25cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGlmIChjb2xsZWN0aW9uQ29uZmlnLnZlcnNpb25zKSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgc2F2ZVZlcnNpb24oe1xuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgICAgZG9jV2l0aExvY2FsZXM6IHtcbiAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGRvYy5jcmVhdGVkQXQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZHJhZnQ6IHNob3VsZFNhdmVEcmFmdCxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgICByZXEsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gYWZ0ZXJSZWFkIC0gRmllbGRzXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgICAgICByZXN1bHQgPSBhd2FpdCBhZnRlclJlYWQoe1xuICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgICAgY29udGV4dDogcmVxLmNvbnRleHQsXG4gICAgICAgICAgZGVwdGgsXG4gICAgICAgICAgZG9jOiByZXN1bHQsXG4gICAgICAgICAgZmFsbGJhY2tMb2NhbGU6IG51bGwsXG4gICAgICAgICAgZ2xvYmFsOiBudWxsLFxuICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICBvdmVycmlkZUFjY2VzcyxcbiAgICAgICAgICByZXEsXG4gICAgICAgICAgc2hvd0hpZGRlbkZpZWxkcyxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gICAgICAgIC8vIGFmdGVyUmVhZCAtIENvbGxlY3Rpb25cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGF3YWl0IGNvbGxlY3Rpb25Db25maWcuaG9va3MuYWZ0ZXJSZWFkLnJlZHVjZShhc3luYyAocHJpb3JIb29rLCBob29rKSA9PiB7XG4gICAgICAgICAgYXdhaXQgcHJpb3JIb29rXG5cbiAgICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgKGF3YWl0IGhvb2soe1xuICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBjb2xsZWN0aW9uQ29uZmlnLFxuICAgICAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICAgICAgZG9jOiByZXN1bHQsXG4gICAgICAgICAgICAgIHJlcSxcbiAgICAgICAgICAgIH0pKSB8fCByZXN1bHRcbiAgICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKCkpXG5cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBhZnRlckNoYW5nZSAtIEZpZWxkc1xuICAgICAgICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgYWZ0ZXJDaGFuZ2U8R2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVFNsdWddPih7XG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBjb250ZXh0OiByZXEuY29udGV4dCxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGRvYzogcmVzdWx0LFxuICAgICAgICAgIGdsb2JhbDogbnVsbCxcbiAgICAgICAgICBvcGVyYXRpb246ICd1cGRhdGUnLFxuICAgICAgICAgIHByZXZpb3VzRG9jOiBvcmlnaW5hbERvYyxcbiAgICAgICAgICByZXEsXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgICAgICAvLyBhZnRlckNoYW5nZSAtIENvbGxlY3Rpb25cbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIGF3YWl0IGNvbGxlY3Rpb25Db25maWcuaG9va3MuYWZ0ZXJDaGFuZ2UucmVkdWNlKGFzeW5jIChwcmlvckhvb2ssIGhvb2spID0+IHtcbiAgICAgICAgICBhd2FpdCBwcmlvckhvb2tcblxuICAgICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgICAoYXdhaXQgaG9vayh7XG4gICAgICAgICAgICAgIGNvbGxlY3Rpb246IGNvbGxlY3Rpb25Db25maWcsXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHJlcS5jb250ZXh0LFxuICAgICAgICAgICAgICBkb2M6IHJlc3VsdCxcbiAgICAgICAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgICAgICAgcHJldmlvdXNEb2M6IG9yaWdpbmFsRG9jLFxuICAgICAgICAgICAgICByZXEsXG4gICAgICAgICAgICB9KSkgfHwgcmVzdWx0XG4gICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKVxuXG4gICAgICAgIGF3YWl0IHVubGlua1RlbXBGaWxlcyh7XG4gICAgICAgICAgY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgcmVxLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgLy8gUmV0dXJuIHJlc3VsdHNcbiAgICAgICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9KVxuXG4gICAgY29uc3QgYXdhaXRlZERvY3MgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcylcblxuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICBkb2NzOiBhd2FpdGVkRG9jcy5maWx0ZXIoQm9vbGVhbiksXG4gICAgICBlcnJvcnMsXG4gICAgfVxuXG4gICAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAgIC8vIGFmdGVyT3BlcmF0aW9uIC0gQ29sbGVjdGlvblxuICAgIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICAgIHJlc3VsdCA9IGF3YWl0IGJ1aWxkQWZ0ZXJPcGVyYXRpb248R2VuZXJhdGVkVHlwZXNbJ2NvbGxlY3Rpb25zJ11bVFNsdWddPih7XG4gICAgICBhcmdzLFxuICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbkNvbmZpZyxcbiAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICByZXN1bHQsXG4gICAgfSlcblxuICAgIGlmIChzaG91bGRDb21taXQpIGF3YWl0IGNvbW1pdFRyYW5zYWN0aW9uKHJlcSlcblxuICAgIHJldHVybiByZXN1bHRcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBhd2FpdCBraWxsVHJhbnNhY3Rpb24oYXJncy5yZXEpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB1cGRhdGVcbiJdLCJuYW1lcyI6WyJ1cGRhdGUiLCJpbmNvbWluZ0FyZ3MiLCJhcmdzIiwic2hvdWxkQ29tbWl0IiwiaW5pdFRyYW5zYWN0aW9uIiwicmVxIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImhvb2tzIiwiYmVmb3JlT3BlcmF0aW9uIiwicmVkdWNlIiwicHJpb3JIb29rIiwiaG9vayIsImNvbnRleHQiLCJvcGVyYXRpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsImNvbGxlY3Rpb25Db25maWciLCJkZXB0aCIsImRyYWZ0IiwiZHJhZnRBcmciLCJvdmVycmlkZUFjY2VzcyIsIm92ZXJ3cml0ZUV4aXN0aW5nRmlsZXMiLCJmYWxsYmFja0xvY2FsZSIsImxvY2FsZSIsInBheWxvYWQiLCJ0Iiwic2hvd0hpZGRlbkZpZWxkcyIsIndoZXJlIiwiQVBJRXJyb3IiLCJodHRwU3RhdHVzIiwiQkFEX1JFUVVFU1QiLCJkYXRhIiwiYnVsa1VwZGF0ZURhdGEiLCJzaG91bGRTYXZlRHJhZnQiLCJCb29sZWFuIiwidmVyc2lvbnMiLCJkcmFmdHMiLCJhY2Nlc3NSZXN1bHQiLCJleGVjdXRlQWNjZXNzIiwiYWNjZXNzIiwidmFsaWRhdGVRdWVyeVBhdGhzIiwiZnVsbFdoZXJlIiwiY29tYmluZVF1ZXJpZXMiLCJkb2NzIiwidmVyc2lvbnNXaGVyZSIsImFwcGVuZFZlcnNpb25Ub1F1ZXJ5S2V5IiwidmVyc2lvbkZpZWxkcyIsImJ1aWxkVmVyc2lvbkNvbGxlY3Rpb25GaWVsZHMiLCJxdWVyeSIsImRiIiwicXVlcnlEcmFmdHMiLCJzbHVnIiwiZmluZCIsImxpbWl0IiwicGFnaW5hdGlvbiIsIm5ld0ZpbGVEYXRhIiwiZmlsZXMiLCJmaWxlc1RvVXBsb2FkIiwiZ2VuZXJhdGVGaWxlRGF0YSIsInRocm93T25NaXNzaW5nRmlsZSIsImVycm9ycyIsInByb21pc2VzIiwibWFwIiwiZG9jIiwiaWQiLCJvcmlnaW5hbERvYyIsImFmdGVyUmVhZCIsImdsb2JhbCIsImRlbGV0ZUFzc29jaWF0ZWRGaWxlcyIsIm92ZXJyaWRlRGVsZXRlIiwiYmVmb3JlVmFsaWRhdGUiLCJ1cGxvYWQiLCJkaXNhYmxlTG9jYWxTdG9yYWdlIiwidXBsb2FkRmlsZXMiLCJiZWZvcmVDaGFuZ2UiLCJyZXN1bHQiLCJkb2NXaXRoTG9jYWxlcyIsInNraXBWYWxpZGF0aW9uIiwiX3N0YXR1cyIsInVwZGF0ZU9uZSIsInNhdmVWZXJzaW9uIiwiY3JlYXRlZEF0IiwiYWZ0ZXJDaGFuZ2UiLCJwcmV2aW91c0RvYyIsInVubGlua1RlbXBGaWxlcyIsImVycm9yIiwicHVzaCIsIm1lc3NhZ2UiLCJhd2FpdGVkRG9jcyIsImFsbCIsImZpbHRlciIsImJ1aWxkQWZ0ZXJPcGVyYXRpb24iLCJjb21taXRUcmFuc2FjdGlvbiIsImtpbGxUcmFuc2FjdGlv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