UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

311 lines (310 loc) • 35.1 kB
"use strict"; 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 _types = require("../../../../fields/config/types"); const _getTranslation = require("../../../../utilities/getTranslation"); const _usePayloadAPI = /*#__PURE__*/ _interop_require_default(require("../../../hooks/usePayloadAPI")); const _formatDate = require("../../../utilities/formatDate"); const _Gutter = require("../../elements/Gutter"); const _StepNav = require("../../elements/StepNav"); const _ActionsProvider = require("../../utilities/ActionsProvider"); const _Auth = require("../../utilities/Auth"); const _Config = require("../../utilities/Config"); const _DocumentInfo = require("../../utilities/DocumentInfo"); const _Locale = require("../../utilities/Locale"); const _Meta = /*#__PURE__*/ _interop_require_default(require("../../utilities/Meta")); const _NotFound = /*#__PURE__*/ _interop_require_default(require("../NotFound")); const _Compare = /*#__PURE__*/ _interop_require_default(require("./Compare")); const _RenderFieldsToDiff = /*#__PURE__*/ _interop_require_default(require("./RenderFieldsToDiff")); const _fields = /*#__PURE__*/ _interop_require_default(require("./RenderFieldsToDiff/fields")); const _Restore = /*#__PURE__*/ _interop_require_default(require("./Restore")); const _SelectLocales = /*#__PURE__*/ _interop_require_default(require("./SelectLocales")); require("./index.scss"); const _shared = require("./shared"); 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 = 'view-version'; const VersionView = ({ collection, global })=>{ const { admin: { dateFormat }, localization, routes: { admin, api }, serverURL } = (0, _Config.useConfig)(); const { setStepNav } = (0, _StepNav.useStepNav)(); const { setViewActions } = (0, _ActionsProvider.useActions)(); const { params: { id, versionID } } = (0, _reactrouterdom.useRouteMatch)(); const [compareValue, setCompareValue] = (0, _react.useState)(_shared.mostRecentVersionOption); const [localeOptions] = (0, _react.useState)(()=>{ if (localization && localization?.locales) { return localization.locales.map(({ code, label })=>({ label: label, value: code })); } return []; }); const [locales, setLocales] = (0, _react.useState)(localeOptions); const { permissions } = (0, _Auth.useAuth)(); const { code: locale } = (0, _Locale.useLocale)(); const { i18n, t } = (0, _reacti18next.useTranslation)('version'); const { docPermissions } = (0, _DocumentInfo.useDocumentInfo)(); let originalDocFetchURL; let versionFetchURL; let entityLabel; let fields; let fieldPermissions; let compareBaseURL; let slug; let parentID; if (collection) { ({ slug } = collection); originalDocFetchURL = `${serverURL}${api}/${slug}/${id}`; versionFetchURL = `${serverURL}${api}/${slug}/versions/${versionID}`; compareBaseURL = `${serverURL}${api}/${slug}/versions`; entityLabel = (0, _getTranslation.getTranslation)(collection.labels.singular, i18n); parentID = id; fields = collection.fields; fieldPermissions = permissions.collections[collection.slug].fields; } if (global) { ({ slug } = global); originalDocFetchURL = `${serverURL}${api}/globals/${slug}`; versionFetchURL = `${serverURL}${api}/globals/${slug}/versions/${versionID}`; compareBaseURL = `${serverURL}${api}/globals/${slug}/versions`; entityLabel = (0, _getTranslation.getTranslation)(global.label, i18n); fields = global.fields; fieldPermissions = permissions.globals[global.slug].fields; } const compareFetchURL = compareValue?.value === 'mostRecent' || compareValue?.value === 'published' ? originalDocFetchURL : `${compareBaseURL}/${compareValue.value}`; const [{ data: doc, isError }] = (0, _usePayloadAPI.default)(versionFetchURL, { initialParams: { depth: 1, locale: '*' } }); const [{ data: publishedDoc }] = (0, _usePayloadAPI.default)(originalDocFetchURL, { initialParams: { depth: 1, locale: '*' } }); const [{ data: mostRecentDoc }] = (0, _usePayloadAPI.default)(originalDocFetchURL, { initialParams: { depth: 1, draft: true, locale: '*' } }); const [{ data: compareDoc }] = (0, _usePayloadAPI.default)(compareFetchURL, { initialParams: { depth: 1, draft: 'true', locale: '*' } }); (0, _react.useEffect)(()=>{ let nav = []; if (collection) { let docLabel = ''; if (mostRecentDoc) { const { useAsTitle } = collection.admin; if (useAsTitle !== 'id') { const titleField = collection.fields.find((field)=>(0, _types.fieldAffectsData)(field) && field.name === useAsTitle); if (titleField && mostRecentDoc[useAsTitle]) { if (titleField.localized) { docLabel = mostRecentDoc[useAsTitle]?.[locale]; } else { docLabel = mostRecentDoc[useAsTitle]; } } else { docLabel = `[${t('general:untitled')}]`; } } else { docLabel = mostRecentDoc.id; } } nav = [ { label: (0, _getTranslation.getTranslation)(collection.labels.plural, i18n), url: `${admin}/collections/${collection.slug}` }, { label: docLabel, url: `${admin}/collections/${collection.slug}/${id}` }, { label: 'Versions', url: `${admin}/collections/${collection.slug}/${id}/versions` }, { label: doc?.createdAt ? (0, _formatDate.formatDate)(doc.createdAt, dateFormat, i18n?.language) : '' } ]; } if (global) { nav = [ { label: global.label, url: `${admin}/globals/${global.slug}` }, { label: 'Versions', url: `${admin}/globals/${global.slug}/versions` }, { label: doc?.createdAt ? (0, _formatDate.formatDate)(doc.createdAt, dateFormat, i18n?.language) : '' } ]; } setStepNav(nav); }, [ setStepNav, collection, global, dateFormat, doc, mostRecentDoc, admin, id, locale, t, i18n ]); (0, _react.useEffect)(()=>{ const editConfig = (collection || global)?.admin?.components?.views?.Edit; const versionActions = editConfig && 'Version' in editConfig && 'actions' in editConfig.Version ? editConfig.Version.actions : []; setViewActions(versionActions); return ()=>{ setViewActions([]); }; }, [ collection, global, setViewActions ]); let metaTitle; let metaDesc; const formattedCreatedAt = doc?.createdAt ? (0, _formatDate.formatDate)(doc.createdAt, dateFormat, i18n?.language) : ''; if (collection) { const useAsTitle = collection?.admin?.useAsTitle || 'id'; metaTitle = `${t('version')} - ${formattedCreatedAt} - ${doc[useAsTitle]} - ${entityLabel}`; metaDesc = t('viewingVersion', { documentTitle: doc[useAsTitle], entityLabel }); } if (global) { metaTitle = `${t('version')} - ${formattedCreatedAt} - ${entityLabel}`; metaDesc = t('viewingVersionGlobal', { entityLabel }); } let comparison = compareDoc?.version; if (compareValue?.value === 'mostRecent') { comparison = mostRecentDoc; } if (compareValue?.value === 'published') { comparison = publishedDoc; } const canUpdate = docPermissions?.update?.permission; if (isError) { return /*#__PURE__*/ _react.default.createElement(_NotFound.default, { marginTop: "large" }); } return /*#__PURE__*/ _react.default.createElement("main", { className: baseClass }, /*#__PURE__*/ _react.default.createElement(_Meta.default, { description: metaDesc, title: metaTitle }), /*#__PURE__*/ _react.default.createElement(_Gutter.Gutter, { className: `${baseClass}__wrap` }, /*#__PURE__*/ _react.default.createElement("div", { className: `${baseClass}__header-wrap` }, /*#__PURE__*/ _react.default.createElement("p", { className: `${baseClass}__created-at` }, t('versionCreatedOn', { version: t(doc?.autosave ? 'autosavedVersion' : 'version') })), /*#__PURE__*/ _react.default.createElement("header", { className: `${baseClass}__header` }, /*#__PURE__*/ _react.default.createElement("h2", null, formattedCreatedAt), canUpdate && /*#__PURE__*/ _react.default.createElement(_Restore.default, { className: `${baseClass}__restore`, collection: collection, global: global, originalDocID: id, versionDate: formattedCreatedAt, versionID: versionID }))), /*#__PURE__*/ _react.default.createElement("div", { className: `${baseClass}__controls` }, /*#__PURE__*/ _react.default.createElement(_Compare.default, { baseURL: compareBaseURL, onChange: setCompareValue, parentID: parentID, publishedDoc: publishedDoc, value: compareValue, versionID: versionID }), localization && /*#__PURE__*/ _react.default.createElement(_SelectLocales.default, { onChange: setLocales, options: localeOptions, value: locales })), doc?.version && /*#__PURE__*/ _react.default.createElement(_RenderFieldsToDiff.default, { comparison: comparison, fieldComponents: _fields.default, fieldPermissions: fieldPermissions, fields: fields, locales: locales ? locales.map(({ label })=>typeof label === 'string' ? label : undefined) : [], version: doc?.version }))); }; const _default = VersionView; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL3ZpZXdzL1ZlcnNpb24vVmVyc2lvbi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVJvdXRlTWF0Y2ggfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJ1xuXG5pbXBvcnQgdHlwZSB7IEZpZWxkUGVybWlzc2lvbnMgfSBmcm9tICcuLi8uLi8uLi8uLi9hdXRoJ1xuaW1wb3J0IHR5cGUgeyBGaWVsZCwgRmllbGRBZmZlY3RpbmdEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvUmVhY3RTZWxlY3QvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFN0ZXBOYXZJdGVtIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvU3RlcE5hdi90eXBlcydcbmltcG9ydCB0eXBlIHsgQ29tcGFyZU9wdGlvbiwgUHJvcHMgfSBmcm9tICcuL3R5cGVzJ1xuXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCB7IGdldFRyYW5zbGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbGl0aWVzL2dldFRyYW5zbGF0aW9uJ1xuaW1wb3J0IHVzZVBheWxvYWRBUEkgZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUGF5bG9hZEFQSSdcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuLi8uLi8uLi91dGlsaXRpZXMvZm9ybWF0RGF0ZSdcbmltcG9ydCB7IEd1dHRlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL0d1dHRlcidcbmltcG9ydCB7IHVzZVN0ZXBOYXYgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9TdGVwTmF2J1xuaW1wb3J0IHsgdXNlQWN0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9BY3Rpb25zUHJvdmlkZXInXG5pbXBvcnQgeyB1c2VBdXRoIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0F1dGgnXG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvQ29uZmlnJ1xuaW1wb3J0IHsgdXNlRG9jdW1lbnRJbmZvIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0RvY3VtZW50SW5mbydcbmltcG9ydCB7IHVzZUxvY2FsZSB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9Mb2NhbGUnXG5pbXBvcnQgTWV0YSBmcm9tICcuLi8uLi91dGlsaXRpZXMvTWV0YSdcbmltcG9ydCBOb3RGb3VuZCBmcm9tICcuLi9Ob3RGb3VuZCdcbmltcG9ydCBDb21wYXJlVmVyc2lvbiBmcm9tICcuL0NvbXBhcmUnXG5pbXBvcnQgUmVuZGVyRmllbGRzVG9EaWZmIGZyb20gJy4vUmVuZGVyRmllbGRzVG9EaWZmJ1xuaW1wb3J0IGZpZWxkQ29tcG9uZW50cyBmcm9tICcuL1JlbmRlckZpZWxkc1RvRGlmZi9maWVsZHMnXG5pbXBvcnQgUmVzdG9yZSBmcm9tICcuL1Jlc3RvcmUnXG5pbXBvcnQgU2VsZWN0TG9jYWxlcyBmcm9tICcuL1NlbGVjdExvY2FsZXMnXG5pbXBvcnQgJy4vaW5kZXguc2NzcydcbmltcG9ydCB7IG1vc3RSZWNlbnRWZXJzaW9uT3B0aW9uIH0gZnJvbSAnLi9zaGFyZWQnXG5cbmNvbnN0IGJhc2VDbGFzcyA9ICd2aWV3LXZlcnNpb24nXG5cbmNvbnN0IFZlcnNpb25WaWV3OiBSZWFjdC5GQzxQcm9wcz4gPSAoeyBjb2xsZWN0aW9uLCBnbG9iYWwgfSkgPT4ge1xuICBjb25zdCB7XG4gICAgYWRtaW46IHsgZGF0ZUZvcm1hdCB9LFxuICAgIGxvY2FsaXphdGlvbixcbiAgICByb3V0ZXM6IHsgYWRtaW4sIGFwaSB9LFxuICAgIHNlcnZlclVSTCxcbiAgfSA9IHVzZUNvbmZpZygpXG4gIGNvbnN0IHsgc2V0U3RlcE5hdiB9ID0gdXNlU3RlcE5hdigpXG5cbiAgY29uc3QgeyBzZXRWaWV3QWN0aW9ucyB9ID0gdXNlQWN0aW9ucygpXG5cbiAgY29uc3Qge1xuICAgIHBhcmFtczogeyBpZCwgdmVyc2lvbklEIH0sXG4gIH0gPSB1c2VSb3V0ZU1hdGNoPHsgaWQ/OiBzdHJpbmc7IHZlcnNpb25JRDogc3RyaW5nIH0+KClcblxuICBjb25zdCBbY29tcGFyZVZhbHVlLCBzZXRDb21wYXJlVmFsdWVdID0gdXNlU3RhdGU8Q29tcGFyZU9wdGlvbj4obW9zdFJlY2VudFZlcnNpb25PcHRpb24pXG4gIGNvbnN0IFtsb2NhbGVPcHRpb25zXSA9IHVzZVN0YXRlPE9wdGlvbltdPigoKSA9PiB7XG4gICAgaWYgKGxvY2FsaXphdGlvbiAmJiBsb2NhbGl6YXRpb24/LmxvY2FsZXMpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6YXRpb24ubG9jYWxlcy5tYXAoKHsgY29kZSwgbGFiZWwgfSkgPT4gKHtcbiAgICAgICAgbGFiZWw6IGxhYmVsLFxuICAgICAgICB2YWx1ZTogY29kZSxcbiAgICAgIH0pKVxuICAgIH1cbiAgICByZXR1cm4gW11cbiAgfSlcbiAgY29uc3QgW2xvY2FsZXMsIHNldExvY2FsZXNdID0gdXNlU3RhdGU8T3B0aW9uW10+KGxvY2FsZU9wdGlvbnMpXG4gIGNvbnN0IHsgcGVybWlzc2lvbnMgfSA9IHVzZUF1dGgoKVxuICBjb25zdCB7IGNvZGU6IGxvY2FsZSB9ID0gdXNlTG9jYWxlKClcbiAgY29uc3QgeyBpMThuLCB0IH0gPSB1c2VUcmFuc2xhdGlvbigndmVyc2lvbicpXG4gIGNvbnN0IHsgZG9jUGVybWlzc2lvbnMgfSA9IHVzZURvY3VtZW50SW5mbygpXG5cbiAgbGV0IG9yaWdpbmFsRG9jRmV0Y2hVUkw6IHN0cmluZ1xuICBsZXQgdmVyc2lvbkZldGNoVVJMOiBzdHJpbmdcbiAgbGV0IGVudGl0eUxhYmVsOiBzdHJpbmdcbiAgbGV0IGZpZWxkczogRmllbGRbXVxuICBsZXQgZmllbGRQZXJtaXNzaW9uczogUmVjb3JkPHN0cmluZywgRmllbGRQZXJtaXNzaW9ucz5cbiAgbGV0IGNvbXBhcmVCYXNlVVJMOiBzdHJpbmdcbiAgbGV0IHNsdWc6IHN0cmluZ1xuICBsZXQgcGFyZW50SUQ6IHN0cmluZ1xuXG4gIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgOyh7IHNsdWcgfSA9IGNvbGxlY3Rpb24pXG4gICAgb3JpZ2luYWxEb2NGZXRjaFVSTCA9IGAke3NlcnZlclVSTH0ke2FwaX0vJHtzbHVnfS8ke2lkfWBcbiAgICB2ZXJzaW9uRmV0Y2hVUkwgPSBgJHtzZXJ2ZXJVUkx9JHthcGl9LyR7c2x1Z30vdmVyc2lvbnMvJHt2ZXJzaW9uSUR9YFxuICAgIGNvbXBhcmVCYXNlVVJMID0gYCR7c2VydmVyVVJMfSR7YXBpfS8ke3NsdWd9L3ZlcnNpb25zYFxuICAgIGVudGl0eUxhYmVsID0gZ2V0VHJhbnNsYXRpb24oY29sbGVjdGlvbi5sYWJlbHMuc2luZ3VsYXIsIGkxOG4pXG4gICAgcGFyZW50SUQgPSBpZFxuICAgIGZpZWxkcyA9IGNvbGxlY3Rpb24uZmllbGRzXG4gICAgZmllbGRQZXJtaXNzaW9ucyA9IHBlcm1pc3Npb25zLmNvbGxlY3Rpb25zW2NvbGxlY3Rpb24uc2x1Z10uZmllbGRzXG4gIH1cblxuICBpZiAoZ2xvYmFsKSB7XG4gICAgOyh7IHNsdWcgfSA9IGdsb2JhbClcbiAgICBvcmlnaW5hbERvY0ZldGNoVVJMID0gYCR7c2VydmVyVVJMfSR7YXBpfS9nbG9iYWxzLyR7c2x1Z31gXG4gICAgdmVyc2lvbkZldGNoVVJMID0gYCR7c2VydmVyVVJMfSR7YXBpfS9nbG9iYWxzLyR7c2x1Z30vdmVyc2lvbnMvJHt2ZXJzaW9uSUR9YFxuICAgIGNvbXBhcmVCYXNlVVJMID0gYCR7c2VydmVyVVJMfSR7YXBpfS9nbG9iYWxzLyR7c2x1Z30vdmVyc2lvbnNgXG4gICAgZW50aXR5TGFiZWwgPSBnZXRUcmFuc2xhdGlvbihnbG9iYWwubGFiZWwsIGkxOG4pXG4gICAgZmllbGRzID0gZ2xvYmFsLmZpZWxkc1xuICAgIGZpZWxkUGVybWlzc2lvbnMgPSBwZXJtaXNzaW9ucy5nbG9iYWxzW2dsb2JhbC5zbHVnXS5maWVsZHNcbiAgfVxuXG4gIGNvbnN0IGNvbXBhcmVGZXRjaFVSTCA9XG4gICAgY29tcGFyZVZhbHVlPy52YWx1ZSA9PT0gJ21vc3RSZWNlbnQnIHx8IGNvbXBhcmVWYWx1ZT8udmFsdWUgPT09ICdwdWJsaXNoZWQnXG4gICAgICA/IG9yaWdpbmFsRG9jRmV0Y2hVUkxcbiAgICAgIDogYCR7Y29tcGFyZUJhc2VVUkx9LyR7Y29tcGFyZVZhbHVlLnZhbHVlfWBcblxuICBjb25zdCBbeyBkYXRhOiBkb2MsIGlzRXJyb3IgfV0gPSB1c2VQYXlsb2FkQVBJKHZlcnNpb25GZXRjaFVSTCwge1xuICAgIGluaXRpYWxQYXJhbXM6IHsgZGVwdGg6IDEsIGxvY2FsZTogJyonIH0sXG4gIH0pXG4gIGNvbnN0IFt7IGRhdGE6IHB1Ymxpc2hlZERvYyB9XSA9IHVzZVBheWxvYWRBUEkob3JpZ2luYWxEb2NGZXRjaFVSTCwge1xuICAgIGluaXRpYWxQYXJhbXM6IHsgZGVwdGg6IDEsIGxvY2FsZTogJyonIH0sXG4gIH0pXG4gIGNvbnN0IFt7IGRhdGE6IG1vc3RSZWNlbnREb2MgfV0gPSB1c2VQYXlsb2FkQVBJKG9yaWdpbmFsRG9jRmV0Y2hVUkwsIHtcbiAgICBpbml0aWFsUGFyYW1zOiB7IGRlcHRoOiAxLCBkcmFmdDogdHJ1ZSwgbG9jYWxlOiAnKicgfSxcbiAgfSlcbiAgY29uc3QgW3sgZGF0YTogY29tcGFyZURvYyB9XSA9IHVzZVBheWxvYWRBUEkoY29tcGFyZUZldGNoVVJMLCB7XG4gICAgaW5pdGlhbFBhcmFtczogeyBkZXB0aDogMSwgZHJhZnQ6ICd0cnVlJywgbG9jYWxlOiAnKicgfSxcbiAgfSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxldCBuYXY6IFN0ZXBOYXZJdGVtW10gPSBbXVxuXG4gICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgIGxldCBkb2NMYWJlbCA9ICcnXG5cbiAgICAgIGlmIChtb3N0UmVjZW50RG9jKSB7XG4gICAgICAgIGNvbnN0IHsgdXNlQXNUaXRsZSB9ID0gY29sbGVjdGlvbi5hZG1pblxuXG4gICAgICAgIGlmICh1c2VBc1RpdGxlICE9PSAnaWQnKSB7XG4gICAgICAgICAgY29uc3QgdGl0bGVGaWVsZCA9IGNvbGxlY3Rpb24uZmllbGRzLmZpbmQoXG4gICAgICAgICAgICAoZmllbGQpID0+IGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09IHVzZUFzVGl0bGUsXG4gICAgICAgICAgKSBhcyBGaWVsZEFmZmVjdGluZ0RhdGFcblxuICAgICAgICAgIGlmICh0aXRsZUZpZWxkICYmIG1vc3RSZWNlbnREb2NbdXNlQXNUaXRsZV0pIHtcbiAgICAgICAgICAgIGlmICh0aXRsZUZpZWxkLmxvY2FsaXplZCkge1xuICAgICAgICAgICAgICBkb2NMYWJlbCA9IG1vc3RSZWNlbnREb2NbdXNlQXNUaXRsZV0/Lltsb2NhbGVdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkb2NMYWJlbCA9IG1vc3RSZWNlbnREb2NbdXNlQXNUaXRsZV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZG9jTGFiZWwgPSBgWyR7dCgnZ2VuZXJhbDp1bnRpdGxlZCcpfV1gXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvY0xhYmVsID0gbW9zdFJlY2VudERvYy5pZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hdiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiBnZXRUcmFuc2xhdGlvbihjb2xsZWN0aW9uLmxhYmVscy5wbHVyYWwsIGkxOG4pLFxuICAgICAgICAgIHVybDogYCR7YWRtaW59L2NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbi5zbHVnfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogZG9jTGFiZWwsXG4gICAgICAgICAgdXJsOiBgJHthZG1pbn0vY29sbGVjdGlvbnMvJHtjb2xsZWN0aW9uLnNsdWd9LyR7aWR9YCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiAnVmVyc2lvbnMnLFxuICAgICAgICAgIHVybDogYCR7YWRtaW59L2NvbGxlY3Rpb25zLyR7Y29sbGVjdGlvbi5zbHVnfS8ke2lkfS92ZXJzaW9uc2AsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogZG9jPy5jcmVhdGVkQXQgPyBmb3JtYXREYXRlKGRvYy5jcmVhdGVkQXQsIGRhdGVGb3JtYXQsIGkxOG4/Lmxhbmd1YWdlKSA6ICcnLFxuICAgICAgICB9LFxuICAgICAgXVxuICAgIH1cblxuICAgIGlmIChnbG9iYWwpIHtcbiAgICAgIG5hdiA9IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiBnbG9iYWwubGFiZWwsXG4gICAgICAgICAgdXJsOiBgJHthZG1pbn0vZ2xvYmFscy8ke2dsb2JhbC5zbHVnfWAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogJ1ZlcnNpb25zJyxcbiAgICAgICAgICB1cmw6IGAke2FkbWlufS9nbG9iYWxzLyR7Z2xvYmFsLnNsdWd9L3ZlcnNpb25zYCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiBkb2M/LmNyZWF0ZWRBdCA/IGZvcm1hdERhdGUoZG9jLmNyZWF0ZWRBdCwgZGF0ZUZvcm1hdCwgaTE4bj8ubGFuZ3VhZ2UpIDogJycsXG4gICAgICAgIH0sXG4gICAgICBdXG4gICAgfVxuXG4gICAgc2V0U3RlcE5hdihuYXYpXG4gIH0sIFtzZXRTdGVwTmF2LCBjb2xsZWN0aW9uLCBnbG9iYWwsIGRhdGVGb3JtYXQsIGRvYywgbW9zdFJlY2VudERvYywgYWRtaW4sIGlkLCBsb2NhbGUsIHQsIGkxOG5dKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWRpdENvbmZpZyA9IChjb2xsZWN0aW9uIHx8IGdsb2JhbCk/LmFkbWluPy5jb21wb25lbnRzPy52aWV3cz8uRWRpdFxuICAgIGNvbnN0IHZlcnNpb25BY3Rpb25zID1cbiAgICAgIGVkaXRDb25maWcgJiYgJ1ZlcnNpb24nIGluIGVkaXRDb25maWcgJiYgJ2FjdGlvbnMnIGluIGVkaXRDb25maWcuVmVyc2lvblxuICAgICAgICA/IGVkaXRDb25maWcuVmVyc2lvbi5hY3Rpb25zXG4gICAgICAgIDogW11cblxuICAgIHNldFZpZXdBY3Rpb25zKHZlcnNpb25BY3Rpb25zKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNldFZpZXdBY3Rpb25zKFtdKVxuICAgIH1cbiAgfSwgW2NvbGxlY3Rpb24sIGdsb2JhbCwgc2V0Vmlld0FjdGlvbnNdKVxuXG4gIGxldCBtZXRhVGl0bGU6IHN0cmluZ1xuICBsZXQgbWV0YURlc2M6IHN0cmluZ1xuICBjb25zdCBmb3JtYXR0ZWRDcmVhdGVkQXQgPSBkb2M/LmNyZWF0ZWRBdFxuICAgID8gZm9ybWF0RGF0ZShkb2MuY3JlYXRlZEF0LCBkYXRlRm9ybWF0LCBpMThuPy5sYW5ndWFnZSlcbiAgICA6ICcnXG5cbiAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICBjb25zdCB1c2VBc1RpdGxlID0gY29sbGVjdGlvbj8uYWRtaW4/LnVzZUFzVGl0bGUgfHwgJ2lkJ1xuICAgIG1ldGFUaXRsZSA9IGAke3QoJ3ZlcnNpb24nKX0gLSAke2Zvcm1hdHRlZENyZWF0ZWRBdH0gLSAke2RvY1t1c2VBc1RpdGxlXX0gLSAke2VudGl0eUxhYmVsfWBcbiAgICBtZXRhRGVzYyA9IHQoJ3ZpZXdpbmdWZXJzaW9uJywgeyBkb2N1bWVudFRpdGxlOiBkb2NbdXNlQXNUaXRsZV0sIGVudGl0eUxhYmVsIH0pXG4gIH1cblxuICBpZiAoZ2xvYmFsKSB7XG4gICAgbWV0YVRpdGxlID0gYCR7dCgndmVyc2lvbicpfSAtICR7Zm9ybWF0dGVkQ3JlYXRlZEF0fSAtICR7ZW50aXR5TGFiZWx9YFxuICAgIG1ldGFEZXNjID0gdCgndmlld2luZ1ZlcnNpb25HbG9iYWwnLCB7IGVudGl0eUxhYmVsIH0pXG4gIH1cblxuICBsZXQgY29tcGFyaXNvbiA9IGNvbXBhcmVEb2M/LnZlcnNpb25cblxuICBpZiAoY29tcGFyZVZhbHVlPy52YWx1ZSA9PT0gJ21vc3RSZWNlbnQnKSB7XG4gICAgY29tcGFyaXNvbiA9IG1vc3RSZWNlbnREb2NcbiAgfVxuXG4gIGlmIChjb21wYXJlVmFsdWU/LnZhbHVlID09PSAncHVibGlzaGVkJykge1xuICAgIGNvbXBhcmlzb24gPSBwdWJsaXNoZWREb2NcbiAgfVxuXG4gIGNvbnN0IGNhblVwZGF0ZSA9IGRvY1Blcm1pc3Npb25zPy51cGRhdGU/LnBlcm1pc3Npb25cblxuICBpZiAoaXNFcnJvcikge1xuICAgIHJldHVybiA8Tm90Rm91bmQgbWFyZ2luVG9wPVwibGFyZ2VcIiAvPlxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9e2Jhc2VDbGFzc30+XG4gICAgICA8TWV0YSBkZXNjcmlwdGlvbj17bWV0YURlc2N9IHRpdGxlPXttZXRhVGl0bGV9IC8+XG4gICAgICA8R3V0dGVyIGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fd3JhcGB9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9faGVhZGVyLXdyYXBgfT5cbiAgICAgICAgICA8cCBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2NyZWF0ZWQtYXRgfT5cbiAgICAgICAgICAgIHt0KCd2ZXJzaW9uQ3JlYXRlZE9uJywge1xuICAgICAgICAgICAgICB2ZXJzaW9uOiB0KGRvYz8uYXV0b3NhdmUgPyAnYXV0b3NhdmVkVmVyc2lvbicgOiAndmVyc2lvbicpLFxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPXtgJHtiYXNlQ2xhc3N9X19oZWFkZXJgfT5cbiAgICAgICAgICAgIDxoMj57Zm9ybWF0dGVkQ3JlYXRlZEF0fTwvaDI+XG4gICAgICAgICAgICB7Y2FuVXBkYXRlICYmIChcbiAgICAgICAgICAgICAgPFJlc3RvcmVcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX3Jlc3RvcmVgfVxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb249e2NvbGxlY3Rpb259XG4gICAgICAgICAgICAgICAgZ2xvYmFsPXtnbG9iYWx9XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxEb2NJRD17aWR9XG4gICAgICAgICAgICAgICAgdmVyc2lvbkRhdGU9e2Zvcm1hdHRlZENyZWF0ZWRBdH1cbiAgICAgICAgICAgICAgICB2ZXJzaW9uSUQ9e3ZlcnNpb25JRH1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9oZWFkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fY29udHJvbHNgfT5cbiAgICAgICAgICA8Q29tcGFyZVZlcnNpb25cbiAgICAgICAgICAgIGJhc2VVUkw9e2NvbXBhcmVCYXNlVVJMfVxuICAgICAgICAgICAgb25DaGFuZ2U9e3NldENvbXBhcmVWYWx1ZX1cbiAgICAgICAgICAgIHBhcmVudElEPXtwYXJlbnRJRH1cbiAgICAgICAgICAgIHB1Ymxpc2hlZERvYz17cHVibGlzaGVkRG9jfVxuICAgICAgICAgICAgdmFsdWU9e2NvbXBhcmVWYWx1ZX1cbiAgICAgICAgICAgIHZlcnNpb25JRD17dmVyc2lvbklEfVxuICAgICAgICAgIC8+XG4gICAgICAgICAge2xvY2FsaXphdGlvbiAmJiAoXG4gICAgICAgICAgICA8U2VsZWN0TG9jYWxlcyBvbkNoYW5nZT17c2V0TG9jYWxlc30gb3B0aW9ucz17bG9jYWxlT3B0aW9uc30gdmFsdWU9e2xvY2FsZXN9IC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAge2RvYz8udmVyc2lvbiAmJiAoXG4gICAgICAgICAgPFJlbmRlckZpZWxkc1RvRGlmZlxuICAgICAgICAgICAgY29tcGFyaXNvbj17Y29tcGFyaXNvbn1cbiAgICAgICAgICAgIGZpZWxkQ29tcG9uZW50cz17ZmllbGRDb21wb25lbnRzfVxuICAgICAgICAgICAgZmllbGRQZXJtaXNzaW9ucz17ZmllbGRQZXJtaXNzaW9uc31cbiAgICAgICAgICAgIGZpZWxkcz17ZmllbGRzfVxuICAgICAgICAgICAgbG9jYWxlcz17XG4gICAgICAgICAgICAgIGxvY2FsZXNcbiAgICAgICAgICAgICAgICA/IGxvY2FsZXMubWFwKCh7IGxhYmVsIH0pID0+ICh0eXBlb2YgbGFiZWwgPT09ICdzdHJpbmcnID8gbGFiZWwgOiB1bmRlZmluZWQpKVxuICAgICAgICAgICAgICAgIDogW11cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZlcnNpb249e2RvYz8udmVyc2lvbn1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC9HdXR0ZXI+XG4gICAgPC9tYWluPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFZlcnNpb25WaWV3XG4iXSwibmFtZXMiOlsiYmFzZUNsYXNzIiwiVmVyc2lvblZpZXciLCJjb2xsZWN0aW9uIiwiZ2xvYmFsIiwiYWRtaW4iLCJkYXRlRm9ybWF0IiwibG9jYWxpemF0aW9uIiwicm91dGVzIiwiYXBpIiwic2VydmVyVVJMIiwidXNlQ29uZmlnIiwic2V0U3RlcE5hdiIsInVzZVN0ZXBOYXYiLCJzZXRWaWV3QWN0aW9ucyIsInVzZUFjdGlvbnMiLCJwYXJhbXMiLCJpZCIsInZlcnNpb25JRCIsInVzZVJvdXRlTWF0Y2giLCJjb21wYXJlVmFsdWUiLCJzZXRDb21wYXJlVmFsdWUiLCJ1c2VTdGF0ZSIsIm1vc3RSZWNlbnRWZXJzaW9uT3B0aW9uIiwibG9jYWxlT3B0aW9ucyIsImxvY2FsZXMiLCJtYXAiLCJjb2RlIiwibGFiZWwiLCJ2YWx1ZSIsInNldExvY2FsZXMiLCJwZXJtaXNzaW9ucyIsInVzZUF1dGgiLCJsb2NhbGUiLCJ1c2VMb2NhbGUiLCJpMThuIiwidCIsInVzZVRyYW5zbGF0aW9uIiwiZG9jUGVybWlzc2lvbnMiLCJ1c2VEb2N1bWVudEluZm8iLCJvcmlnaW5hbERvY0ZldGNoVVJMIiwidmVyc2lvbkZldGNoVVJMIiwiZW50aXR5TGFiZWwiLCJmaWVsZHMiLCJmaWVsZFBlcm1pc3Npb25zIiwiY29tcGFyZUJhc2VVUkwiLCJzbHVnIiwicGFyZW50SUQiLCJnZXRUcmFuc2xhdGlvbiIsImxhYmVscyIsInNpbmd1bGFyIiwiY29sbGVjdGlvbnMiLCJnbG9iYWxzIiwiY29tcGFyZUZldGNoVVJMIiwiZGF0YSIsImRvYyIsImlzRXJyb3IiLCJ1c2VQYXlsb2FkQVBJIiwiaW5pdGlhbFBhcmFtcyIsImRlcHRoIiwicHVibGlzaGVkRG9jIiwibW9zdFJlY2VudERvYyIsImRyYWZ0IiwiY29tcGFyZURvYyIsInVzZUVmZmVjdCIsIm5hdiIsImRvY0xhYmVsIiwidXNlQXNUaXRsZSIsInRpdGxlRmllbGQiLCJmaW5kIiwiZmllbGQiLCJmaWVsZEFmZmVjdHNEYXRhIiwibmFtZSIsImxvY2FsaXplZCIsInBsdXJhbCIsInVybCIsImNyZWF0ZWRBdCIsImZvcm1hdERhdGUiLCJsYW5ndWFnZSIsImVkaXRDb25maWciLCJjb21wb25lbnRzIiwidmlld3MiLCJFZGl0IiwidmVyc2lvbkFjdGlvbnMiLCJWZXJzaW9uIiwiYWN0aW9ucyIsIm1ldGFUaXRsZSIsIm1ldGFEZXNjIiwiZm9ybWF0dGVkQ3JlYXRlZEF0IiwiZG9jdW1lbnRUaXRsZSIsImNvbXBhcmlzb24iLCJ2ZXJzaW9uIiwiY2FuVXBkYXRlIiwidXBkYXRlIiwicGVybWlzc2lvbiIsIk5vdEZvdW5kIiwibWFyZ2luVG9wIiwibWFpbiIsImNsYXNzTmFtZSIsIk1ldGEiLCJkZXNjcmlwdGlvbiIsInRpdGxlIiwiR3V0dGVyIiwiZGl2IiwicCIsImF1dG9zYXZlIiwiaGVhZGVyIiwiaDIiLCJSZXN0b3JlIiwib3JpZ2luYWxEb2NJRCIsInZlcnNpb25EYXRlIiwiQ29tcGFyZVZlcnNpb24iLCJiYXNlVVJMIiwib25DaGFuZ2UiLCJTZWxlY3RMb2NhbGVzIiwib3B0aW9ucyIsIlJlbmRlckZpZWxkc1RvRGlmZiIsImZpZWxkQ29tcG9uZW50cyIsInVuZGVmaW5lZCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEwUkE7OztlQUFBOzs7K0RBMVIyQzs4QkFDWjtnQ0FDRDt1QkFRRztnQ0FDRjtzRUFDTDs0QkFDQzt3QkFDSjt5QkFDSTtpQ0FDQTtzQkFDSDt3QkFDRTs4QkFDTTt3QkFDTjs2REFDVDtpRUFDSTtnRUFDTTsyRUFDSTsrREFDSDtnRUFDUjtzRUFDTTtRQUNuQjt3QkFDaUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRXhDLE1BQU1BLFlBQVk7QUFFbEIsTUFBTUMsY0FBK0IsQ0FBQyxFQUFFQyxVQUFVLEVBQUVDLE1BQU0sRUFBRTtJQUMxRCxNQUFNLEVBQ0pDLE9BQU8sRUFBRUMsVUFBVSxFQUFFLEVBQ3JCQyxZQUFZLEVBQ1pDLFFBQVEsRUFBRUgsS0FBSyxFQUFFSSxHQUFHLEVBQUUsRUFDdEJDLFNBQVMsRUFDVixHQUFHQyxJQUFBQSxpQkFBUztJQUNiLE1BQU0sRUFBRUMsVUFBVSxFQUFFLEdBQUdDLElBQUFBLG1CQUFVO0lBRWpDLE1BQU0sRUFBRUMsY0FBYyxFQUFFLEdBQUdDLElBQUFBLDJCQUFVO0lBRXJDLE1BQU0sRUFDSkMsUUFBUSxFQUFFQyxFQUFFLEVBQUVDLFNBQVMsRUFBRSxFQUMxQixHQUFHQyxJQUFBQSw2QkFBYTtJQUVqQixNQUFNLENBQUNDLGNBQWNDLGdCQUFnQixHQUFHQyxJQUFBQSxlQUFRLEVBQWdCQywrQkFBdUI7SUFDdkYsTUFBTSxDQUFDQyxjQUFjLEdBQUdGLElBQUFBLGVBQVEsRUFBVztRQUN6QyxJQUFJZixnQkFBZ0JBLGNBQWNrQixTQUFTO1lBQ3pDLE9BQU9sQixhQUFha0IsT0FBTyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRSxH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