payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
209 lines (208 loc) • 20.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
const _reacti18next = require("react-i18next");
const _reactrouterdom = require("react-router-dom");
const _reacttoastify = require("react-toastify");
const _useDebounce = /*#__PURE__*/ _interop_require_default(require("../../../hooks/useDebounce"));
const _formatDate = require("../../../utilities/formatDate");
const _context = require("../../forms/Form/context");
const _reduceFieldsToValues = /*#__PURE__*/ _interop_require_default(require("../../forms/Form/reduceFieldsToValues"));
const _Config = require("../../utilities/Config");
const _DocumentInfo = require("../../utilities/DocumentInfo");
const _Locale = require("../../utilities/Locale");
require("./index.scss");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
function _getRequireWildcardCache(nodeInterop) {
if (typeof WeakMap !== "function") return null;
var cacheBabelInterop = new WeakMap();
var cacheNodeInterop = new WeakMap();
return (_getRequireWildcardCache = function(nodeInterop) {
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
})(nodeInterop);
}
function _interop_require_wildcard(obj, nodeInterop) {
if (!nodeInterop && obj && obj.__esModule) {
return obj;
}
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
return {
default: obj
};
}
var cache = _getRequireWildcardCache(nodeInterop);
if (cache && cache.has(obj)) {
return cache.get(obj);
}
var newObj = {
__proto__: null
};
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
for(var key in obj){
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
if (desc && (desc.get || desc.set)) {
Object.defineProperty(newObj, key, desc);
} else {
newObj[key] = obj[key];
}
}
}
newObj.default = obj;
if (cache) {
cache.set(obj, newObj);
}
return newObj;
}
const baseClass = 'autosave';
const Autosave = ({ id, collection, global, publishedDocUpdatedAt })=>{
const { routes: { admin, api }, serverURL } = (0, _Config.useConfig)();
const { getVersions, versions } = (0, _DocumentInfo.useDocumentInfo)();
const [fields] = (0, _context.useAllFormFields)();
const modified = (0, _context.useFormModified)();
const { code: locale } = (0, _Locale.useLocale)();
const { replace } = (0, _reactrouterdom.useHistory)();
const { i18n, t } = (0, _reacti18next.useTranslation)('version');
let interval = 800;
if (collection?.versions.drafts && collection.versions?.drafts?.autosave) interval = collection.versions.drafts.autosave.interval;
if (global?.versions.drafts && global.versions?.drafts?.autosave) interval = global.versions.drafts.autosave.interval;
const [saving, setSaving] = (0, _react.useState)(false);
const [lastSaved, setLastSaved] = (0, _react.useState)();
const debouncedFields = (0, _useDebounce.default)(fields, interval);
const fieldRef = (0, _react.useRef)(fields);
const modifiedRef = (0, _react.useRef)(modified);
const localeRef = (0, _react.useRef)(locale);
// Store fields in ref so the autosave func
// can always retrieve the most to date copies
// after the timeout has executed
fieldRef.current = fields;
// Store modified in ref so the autosave func
// can bail out if modified becomes false while
// timing out during autosave
modifiedRef.current = modified;
const createCollectionDoc = (0, _react.useCallback)(async ()=>{
const res = await fetch(`${serverURL}${api}/${collection.slug}?locale=${locale}&fallback-locale=null&depth=0&draft=true&autosave=true`, {
body: JSON.stringify({}),
credentials: 'include',
headers: {
'Accept-Language': i18n.language,
'Content-Type': 'application/json'
},
method: 'POST'
});
if (res.status === 201) {
const json = await res.json();
replace(`${admin}/collections/${collection.slug}/${json.doc.id}`, {
state: {
data: json.doc
}
});
} else {
_reacttoastify.toast.error(t('error:autosaving'));
}
}, [
i18n,
serverURL,
api,
collection,
locale,
replace,
admin,
t
]);
(0, _react.useEffect)(()=>{
// If no ID, but this is used for a collection doc,
// Immediately save it and set lastSaved
if (!id && collection) {
createCollectionDoc();
}
}, [
id,
collection,
createCollectionDoc
]);
// When debounced fields change, autosave
(0, _react.useEffect)(()=>{
const autosave = async ()=>{
if (modified) {
setSaving(true);
let url;
let method;
if (collection && id) {
url = `${serverURL}${api}/${collection.slug}/${id}?draft=true&autosave=true&locale=${localeRef.current}`;
method = 'PATCH';
}
if (global) {
url = `${serverURL}${api}/globals/${global.slug}?draft=true&autosave=true&locale=${localeRef.current}`;
method = 'POST';
}
if (url) {
setTimeout(async ()=>{
if (modifiedRef.current) {
const body = {
...(0, _reduceFieldsToValues.default)(fieldRef.current, true),
_status: 'draft'
};
const res = await fetch(url, {
body: JSON.stringify(body),
credentials: 'include',
headers: {
'Accept-Language': i18n.language,
'Content-Type': 'application/json'
},
method
});
if (res.status === 200) {
setLastSaved(new Date().getTime());
getVersions();
}
}
setSaving(false);
}, 1000);
}
}
};
autosave();
}, [
i18n,
debouncedFields,
modified,
serverURL,
api,
collection,
global,
id,
getVersions,
localeRef,
modifiedRef
]);
(0, _react.useEffect)(()=>{
if (versions?.docs?.[0]) {
setLastSaved(new Date(versions.docs[0].updatedAt).getTime());
} else if (publishedDocUpdatedAt) {
setLastSaved(new Date(publishedDocUpdatedAt).getTime());
}
}, [
publishedDocUpdatedAt,
versions
]);
return /*#__PURE__*/ _react.default.createElement("div", {
className: baseClass
}, saving && t('saving'), !saving && lastSaved && /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, t('lastSavedAgo', {
distance: (0, _formatDate.formatTimeToNow)(lastSaved, i18n.language)
})));
};
const _default = Autosave;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL2VsZW1lbnRzL0F1dG9zYXZlL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlSGlzdG9yeSB9IGZyb20gJ3JlYWN0LXJvdXRlci1kb20nXG5pbXBvcnQgeyB0b2FzdCB9IGZyb20gJ3JlYWN0LXRvYXN0aWZ5J1xuXG5pbXBvcnQgdHlwZSB7IFByb3BzIH0gZnJvbSAnLi90eXBlcydcblxuaW1wb3J0IHVzZURlYm91bmNlIGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZURlYm91bmNlJ1xuaW1wb3J0IHsgZm9ybWF0VGltZVRvTm93IH0gZnJvbSAnLi4vLi4vLi4vdXRpbGl0aWVzL2Zvcm1hdERhdGUnXG5pbXBvcnQgeyB1c2VBbGxGb3JtRmllbGRzLCB1c2VGb3JtTW9kaWZpZWQgfSBmcm9tICcuLi8uLi9mb3Jtcy9Gb3JtL2NvbnRleHQnXG5pbXBvcnQgcmVkdWNlRmllbGRzVG9WYWx1ZXMgZnJvbSAnLi4vLi4vZm9ybXMvRm9ybS9yZWR1Y2VGaWVsZHNUb1ZhbHVlcydcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9Db25maWcnXG5pbXBvcnQgeyB1c2VEb2N1bWVudEluZm8gfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvRG9jdW1lbnRJbmZvJ1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0xvY2FsZSdcbmltcG9ydCAnLi9pbmRleC5zY3NzJ1xuY29uc3QgYmFzZUNsYXNzID0gJ2F1dG9zYXZlJ1xuXG5jb25zdCBBdXRvc2F2ZTogUmVhY3QuRkM8UHJvcHM+ID0gKHsgaWQsIGNvbGxlY3Rpb24sIGdsb2JhbCwgcHVibGlzaGVkRG9jVXBkYXRlZEF0IH0pID0+IHtcbiAgY29uc3Qge1xuICAgIHJvdXRlczogeyBhZG1pbiwgYXBpIH0sXG4gICAgc2VydmVyVVJMLFxuICB9ID0gdXNlQ29uZmlnKClcbiAgY29uc3QgeyBnZXRWZXJzaW9ucywgdmVyc2lvbnMgfSA9IHVzZURvY3VtZW50SW5mbygpXG4gIGNvbnN0IFtmaWVsZHNdID0gdXNlQWxsRm9ybUZpZWxkcygpXG4gIGNvbnN0IG1vZGlmaWVkID0gdXNlRm9ybU1vZGlmaWVkKClcbiAgY29uc3QgeyBjb2RlOiBsb2NhbGUgfSA9IHVzZUxvY2FsZSgpXG4gIGNvbnN0IHsgcmVwbGFjZSB9ID0gdXNlSGlzdG9yeSgpXG4gIGNvbnN0IHsgaTE4biwgdCB9ID0gdXNlVHJhbnNsYXRpb24oJ3ZlcnNpb24nKVxuXG4gIGxldCBpbnRlcnZhbCA9IDgwMFxuICBpZiAoY29sbGVjdGlvbj8udmVyc2lvbnMuZHJhZnRzICYmIGNvbGxlY3Rpb24udmVyc2lvbnM/LmRyYWZ0cz8uYXV0b3NhdmUpXG4gICAgaW50ZXJ2YWwgPSBjb2xsZWN0aW9uLnZlcnNpb25zLmRyYWZ0cy5hdXRvc2F2ZS5pbnRlcnZhbFxuICBpZiAoZ2xvYmFsPy52ZXJzaW9ucy5kcmFmdHMgJiYgZ2xvYmFsLnZlcnNpb25zPy5kcmFmdHM/LmF1dG9zYXZlKVxuICAgIGludGVydmFsID0gZ2xvYmFsLnZlcnNpb25zLmRyYWZ0cy5hdXRvc2F2ZS5pbnRlcnZhbFxuXG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xhc3RTYXZlZCwgc2V0TGFzdFNhdmVkXSA9IHVzZVN0YXRlPG51bWJlcj4oKVxuICBjb25zdCBkZWJvdW5jZWRGaWVsZHMgPSB1c2VEZWJvdW5jZShmaWVsZHMsIGludGVydmFsKVxuICBjb25zdCBmaWVsZFJlZiA9IHVzZVJlZihmaWVsZHMpXG4gIGNvbnN0IG1vZGlmaWVkUmVmID0gdXNlUmVmKG1vZGlmaWVkKVxuICBjb25zdCBsb2NhbGVSZWYgPSB1c2VSZWYobG9jYWxlKVxuXG4gIC8vIFN0b3JlIGZpZWxkcyBpbiByZWYgc28gdGhlIGF1dG9zYXZlIGZ1bmNcbiAgLy8gY2FuIGFsd2F5cyByZXRyaWV2ZSB0aGUgbW9zdCB0byBkYXRlIGNvcGllc1xuICAvLyBhZnRlciB0aGUgdGltZW91dCBoYXMgZXhlY3V0ZWRcbiAgZmllbGRSZWYuY3VycmVudCA9IGZpZWxkc1xuXG4gIC8vIFN0b3JlIG1vZGlmaWVkIGluIHJlZiBzbyB0aGUgYXV0b3NhdmUgZnVuY1xuICAvLyBjYW4gYmFpbCBvdXQgaWYgbW9kaWZpZWQgYmVjb21lcyBmYWxzZSB3aGlsZVxuICAvLyB0aW1pbmcgb3V0IGR1cmluZyBhdXRvc2F2ZVxuICBtb2RpZmllZFJlZi5jdXJyZW50ID0gbW9kaWZpZWRcblxuICBjb25zdCBjcmVhdGVDb2xsZWN0aW9uRG9jID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgYCR7c2VydmVyVVJMfSR7YXBpfS8ke2NvbGxlY3Rpb24uc2x1Z30/bG9jYWxlPSR7bG9jYWxlfSZmYWxsYmFjay1sb2NhbGU9bnVsbCZkZXB0aD0wJmRyYWZ0PXRydWUmYXV0b3NhdmU9dHJ1ZWAsXG4gICAgICB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHt9KSxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAxKSB7XG4gICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKVxuICAgICAgcmVwbGFjZShgJHthZG1pbn0vY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uLnNsdWd9LyR7anNvbi5kb2MuaWR9YCwge1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIGRhdGE6IGpzb24uZG9jLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdG9hc3QuZXJyb3IodCgnZXJyb3I6YXV0b3NhdmluZycpKVxuICAgIH1cbiAgfSwgW2kxOG4sIHNlcnZlclVSTCwgYXBpLCBjb2xsZWN0aW9uLCBsb2NhbGUsIHJlcGxhY2UsIGFkbWluLCB0XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIElmIG5vIElELCBidXQgdGhpcyBpcyB1c2VkIGZvciBhIGNvbGxlY3Rpb24gZG9jLFxuICAgIC8vIEltbWVkaWF0ZWx5IHNhdmUgaXQgYW5kIHNldCBsYXN0U2F2ZWRcbiAgICBpZiAoIWlkICYmIGNvbGxlY3Rpb24pIHtcbiAgICAgIGNyZWF0ZUNvbGxlY3Rpb25Eb2MoKVxuICAgIH1cbiAgfSwgW2lkLCBjb2xsZWN0aW9uLCBjcmVhdGVDb2xsZWN0aW9uRG9jXSlcblxuICAvLyBXaGVuIGRlYm91bmNlZCBmaWVsZHMgY2hhbmdlLCBhdXRvc2F2ZVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgYXV0b3NhdmUgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgc2V0U2F2aW5nKHRydWUpXG5cbiAgICAgICAgbGV0IHVybDogc3RyaW5nXG4gICAgICAgIGxldCBtZXRob2Q6IHN0cmluZ1xuXG4gICAgICAgIGlmIChjb2xsZWN0aW9uICYmIGlkKSB7XG4gICAgICAgICAgdXJsID0gYCR7c2VydmVyVVJMfSR7YXBpfS8ke2NvbGxlY3Rpb24uc2x1Z30vJHtpZH0/ZHJhZnQ9dHJ1ZSZhdXRvc2F2ZT10cnVlJmxvY2FsZT0ke2xvY2FsZVJlZi5jdXJyZW50fWBcbiAgICAgICAgICBtZXRob2QgPSAnUEFUQ0gnXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgICAgdXJsID0gYCR7c2VydmVyVVJMfSR7YXBpfS9nbG9iYWxzLyR7Z2xvYmFsLnNsdWd9P2RyYWZ0PXRydWUmYXV0b3NhdmU9dHJ1ZSZsb2NhbGU9JHtsb2NhbGVSZWYuY3VycmVudH1gXG4gICAgICAgICAgbWV0aG9kID0gJ1BPU1QnXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAobW9kaWZpZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICBjb25zdCBib2R5ID0ge1xuICAgICAgICAgICAgICAgIC4uLnJlZHVjZUZpZWxkc1RvVmFsdWVzKGZpZWxkUmVmLmN1cnJlbnQsIHRydWUpLFxuICAgICAgICAgICAgICAgIF9zdGF0dXM6ICdkcmFmdCcsXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgc2V0TGFzdFNhdmVkKG5ldyBEYXRlKCkuZ2V0VGltZSgpKVxuICAgICAgICAgICAgICAgIGdldFZlcnNpb25zKClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzZXRTYXZpbmcoZmFsc2UpXG4gICAgICAgICAgfSwgMTAwMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGF1dG9zYXZlKClcbiAgfSwgW1xuICAgIGkxOG4sXG4gICAgZGVib3VuY2VkRmllbGRzLFxuICAgIG1vZGlmaWVkLFxuICAgIHNlcnZlclVSTCxcbiAgICBhcGksXG4gICAgY29sbGVjdGlvbixcbiAgICBnbG9iYWwsXG4gICAgaWQsXG4gICAgZ2V0VmVyc2lvbnMsXG4gICAgbG9jYWxlUmVmLFxuICAgIG1vZGlmaWVkUmVmLFxuICBdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHZlcnNpb25zPy5kb2NzPy5bMF0pIHtcbiAgICAgIHNldExhc3RTYXZlZChuZXcgRGF0ZSh2ZXJzaW9ucy5kb2NzWzBdLnVwZGF0ZWRBdCkuZ2V0VGltZSgpKVxuICAgIH0gZWxzZSBpZiAocHVibGlzaGVkRG9jVXBkYXRlZEF0KSB7XG4gICAgICBzZXRMYXN0U2F2ZWQobmV3IERhdGUocHVibGlzaGVkRG9jVXBkYXRlZEF0KS5nZXRUaW1lKCkpXG4gICAgfVxuICB9LCBbcHVibGlzaGVkRG9jVXBkYXRlZEF0LCB2ZXJzaW9uc10pXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YmFzZUNsYXNzfT5cbiAgICAgIHtzYXZpbmcgJiYgdCgnc2F2aW5nJyl9XG4gICAgICB7IXNhdmluZyAmJiBsYXN0U2F2ZWQgJiYgKFxuICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAge3QoJ2xhc3RTYXZlZEFnbycsIHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBmb3JtYXRUaW1lVG9Ob3cobGFzdFNhdmVkLCBpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXV0b3NhdmVcbiJdLCJuYW1lcyI6WyJiYXNlQ2xhc3MiLCJBdXRvc2F2ZSIsImlkIiwiY29sbGVjdGlvbiIsImdsb2JhbCIsInB1Ymxpc2hlZERvY1VwZGF0ZWRBdCIsInJvdXRlcyIsImFkbWluIiwiYXBpIiwic2VydmVyVVJMIiwidXNlQ29uZmlnIiwiZ2V0VmVyc2lvbnMiLCJ2ZXJzaW9ucyIsInVzZURvY3VtZW50SW5mbyIsImZpZWxkcyIsInVzZUFsbEZvcm1GaWVsZHMiLCJtb2RpZmllZCIsInVzZUZvcm1Nb2RpZmllZCIsImNvZGUiLCJsb2NhbGUiLCJ1c2VMb2NhbGUiLCJyZXBsYWNlIiwidXNlSGlzdG9yeSIsImkxOG4iLCJ0IiwidXNlVHJhbnNsYXRpb24iLCJpbnRlcnZhbCIsImRyYWZ0cyIsImF1dG9zYXZlIiwic2F2aW5nIiwic2V0U2F2aW5nIiwidXNlU3RhdGUiLCJsYXN0U2F2ZWQiLCJzZXRMYXN0U2F2ZWQiLCJkZWJvdW5jZWRGaWVsZHMiLCJ1c2VEZWJvdW5jZSIsImZpZWxkUmVmIiwidXNlUmVmIiwibW9kaWZpZWRSZWYiLCJsb2NhbGVSZWYiLCJjdXJyZW50IiwiY3JlYXRlQ29sbGVjdGlvbkRvYyIsInVzZUNhbGxiYWNrIiwicmVzIiwiZmV0Y2giLCJzbHVnIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjcmVkZW50aWFscyIsImhlYWRlcnMiLCJsYW5ndWFnZSIsIm1ldGhvZCIsInN0YXR1cyIsImpzb24iLCJkb2MiLCJzdGF0ZSIsImRhdGEiLCJ0b2FzdCIsImVycm9yIiwidXNlRWZmZWN0IiwidXJsIiwic2V0VGltZW91dCIsInJlZHVjZUZpZWxkc1RvVmFsdWVzIiwiX3N0YXR1cyIsIkRhdGUiLCJnZXRUaW1lIiwiZG9jcyIsInVwZGF0ZWRBdCIsImRpdiIsImNsYXNzTmFtZSIsIlJlYWN0IiwiRnJhZ21lbnQiLCJkaXN0YW5jZSIsImZvcm1hdFRpbWVUb05vdyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkE2S0E7OztlQUFBOzs7K0RBN0tnRTs4QkFDakM7Z0NBQ0o7K0JBQ0w7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