payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
337 lines (336 loc) • 35.4 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 _useDebounce = /*#__PURE__*/ _interop_require_default(require("../../../../../hooks/useDebounce"));
const _Config = require("../../../../utilities/Config");
const _ReactSelect = /*#__PURE__*/ _interop_require_default(require("../../../ReactSelect"));
require("./index.scss");
const _optionsReducer = /*#__PURE__*/ _interop_require_default(require("./optionsReducer"));
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 = 'condition-value-relationship';
const maxResultsPerRequest = 10;
const RelationshipField = (props)=>{
const { admin: { isSortable } = {}, disabled, hasMany, onChange, relationTo, value } = props;
const { collections, routes: { api }, serverURL } = (0, _Config.useConfig)();
const hasMultipleRelations = Array.isArray(relationTo);
const [options, dispatchOptions] = (0, _react.useReducer)(_optionsReducer.default, []);
const [lastFullyLoadedRelation, setLastFullyLoadedRelation] = (0, _react.useState)(-1);
const [lastLoadedPage, setLastLoadedPage] = (0, _react.useState)(1);
const [search, setSearch] = (0, _react.useState)('');
const [errorLoading, setErrorLoading] = (0, _react.useState)('');
const [hasLoadedFirstOptions, setHasLoadedFirstOptions] = (0, _react.useState)(false);
const debouncedSearch = (0, _useDebounce.default)(search, 300);
const { i18n, t } = (0, _reacti18next.useTranslation)('general');
const addOptions = (0, _react.useCallback)((data, relation)=>{
const collection = collections.find((coll)=>coll.slug === relation);
dispatchOptions({
collection,
data,
hasMultipleRelations,
i18n,
relation,
type: 'ADD'
});
}, [
collections,
hasMultipleRelations,
i18n
]);
const getResults = (0, _react.useCallback)(async ({ lastFullyLoadedRelation: lastFullyLoadedRelationArg, lastLoadedPage: lastLoadedPageArg, search: searchArg })=>{
let lastLoadedPageToUse = typeof lastLoadedPageArg !== 'undefined' ? lastLoadedPageArg : 1;
const lastFullyLoadedRelationToUse = typeof lastFullyLoadedRelationArg !== 'undefined' ? lastFullyLoadedRelationArg : -1;
const relations = Array.isArray(relationTo) ? relationTo : [
relationTo
];
const relationsToFetch = lastFullyLoadedRelationToUse === -1 ? relations : relations.slice(lastFullyLoadedRelationToUse + 1);
let resultsFetched = 0;
if (!errorLoading) {
relationsToFetch.reduce(async (priorRelation, relation)=>{
await priorRelation;
if (resultsFetched < 10) {
const collection = collections.find((coll)=>coll.slug === relation);
const fieldToSearch = collection?.admin?.useAsTitle || 'id';
const searchParam = searchArg ? `&where[${fieldToSearch}][like]=${searchArg}` : '';
const response = await fetch(`${serverURL}${api}/${relation}?limit=${maxResultsPerRequest}&page=${lastLoadedPageToUse}&depth=0${searchParam}`, {
credentials: 'include',
headers: {
'Accept-Language': i18n.language
}
});
if (response.ok) {
const data = await response.json();
if (data.docs.length > 0) {
resultsFetched += data.docs.length;
addOptions(data, relation);
setLastLoadedPage(data.page);
if (!data.nextPage) {
setLastFullyLoadedRelation(relations.indexOf(relation));
// If there are more relations to search, need to reset lastLoadedPage to 1
// both locally within function and state
if (relations.indexOf(relation) + 1 < relations.length) {
lastLoadedPageToUse = 1;
}
}
}
} else {
setErrorLoading(t('error:unspecific'));
}
}
}, Promise.resolve());
}
}, [
i18n,
relationTo,
errorLoading,
collections,
serverURL,
api,
addOptions,
t
]);
const findOptionsByValue = (0, _react.useCallback)(()=>{
if (value) {
if (hasMany) {
if (Array.isArray(value)) {
return value.map((val)=>{
if (hasMultipleRelations) {
let matchedOption;
options.forEach((opt)=>{
if (opt.options) {
opt.options.some((subOpt)=>{
if (subOpt?.value === val.value) {
matchedOption = subOpt;
return true;
}
return false;
});
}
});
return matchedOption;
}
return options.find((opt)=>opt.value === val);
});
}
return undefined;
}
if (hasMultipleRelations) {
let matchedOption;
const valueWithRelation = value;
options.forEach((opt)=>{
if (opt?.options) {
opt.options.some((subOpt)=>{
if (subOpt?.value === valueWithRelation.value) {
matchedOption = subOpt;
return true;
}
return false;
});
}
});
return matchedOption;
}
return options.find((opt)=>opt.value === value);
}
return undefined;
}, [
hasMany,
hasMultipleRelations,
value,
options
]);
const handleInputChange = (0, _react.useCallback)((newSearch)=>{
if (search !== newSearch) {
setSearch(newSearch);
}
}, [
search
]);
const addOptionByID = (0, _react.useCallback)(async (id, relation)=>{
if (!errorLoading && id !== 'null') {
const response = await fetch(`${serverURL}${api}/${relation}/${id}?depth=0`, {
credentials: 'include',
headers: {
'Accept-Language': i18n.language
}
});
if (response.ok) {
const data = await response.json();
addOptions({
docs: [
data
]
}, relation);
} else {
console.error(t('error:loadingDocument', {
id
}));
}
}
}, [
i18n,
addOptions,
api,
errorLoading,
serverURL,
t
]);
// ///////////////////////////
// Get results when search input changes
// ///////////////////////////
(0, _react.useEffect)(()=>{
dispatchOptions({
i18n,
required: true,
type: 'CLEAR'
});
setHasLoadedFirstOptions(true);
setLastLoadedPage(1);
setLastFullyLoadedRelation(-1);
getResults({
search: debouncedSearch
});
}, [
getResults,
debouncedSearch,
relationTo,
i18n
]);
// ///////////////////////////
// Format options once first options have been retrieved
// ///////////////////////////
(0, _react.useEffect)(()=>{
if (value && hasLoadedFirstOptions) {
if (hasMany) {
const matchedOptions = findOptionsByValue();
(matchedOptions || []).forEach((option, i)=>{
if (!option) {
if (hasMultipleRelations) {
addOptionByID(value[i].value, value[i].relationTo);
} else {
addOptionByID(value[i], relationTo);
}
}
});
} else {
const matchedOption = findOptionsByValue();
if (!matchedOption) {
if (hasMultipleRelations) {
const valueWithRelation = value;
addOptionByID(valueWithRelation.value, valueWithRelation.relationTo);
} else {
addOptionByID(value, relationTo);
}
}
}
}
}, [
addOptionByID,
findOptionsByValue,
hasMany,
hasMultipleRelations,
relationTo,
value,
hasLoadedFirstOptions
]);
const classes = [
'field-type',
baseClass,
errorLoading && 'error-loading'
].filter(Boolean).join(' ');
const valueToRender = findOptionsByValue() || value;
return /*#__PURE__*/ _react.default.createElement("div", {
className: classes
}, !errorLoading && /*#__PURE__*/ _react.default.createElement(_ReactSelect.default, {
disabled: disabled,
isMulti: hasMany,
isSortable: isSortable,
onChange: (selected)=>{
if (hasMany) {
onChange(selected ? selected.map((option)=>{
if (hasMultipleRelations) {
return {
relationTo: option.relationTo,
value: option.value
};
}
return option.value;
}) : null);
} else if (hasMultipleRelations) {
onChange({
relationTo: selected.relationTo,
value: selected.value
});
} else {
onChange(selected.value);
}
},
onInputChange: handleInputChange,
onMenuScrollToBottom: ()=>{
getResults({
lastFullyLoadedRelation,
lastLoadedPage: lastLoadedPage + 1
});
},
options: options,
placeholder: t('selectValue'),
value: valueToRender
}), errorLoading && /*#__PURE__*/ _react.default.createElement("div", {
className: `${baseClass}__error-loading`
}, errorLoading));
};
const _default = RelationshipField;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL2VsZW1lbnRzL1doZXJlQnVpbGRlci9Db25kaXRpb24vUmVsYXRpb25zaGlwL2luZGV4LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlUmVkdWNlciwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcblxuaW1wb3J0IHR5cGUgeyBQYWdpbmF0ZWREb2NzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vZGF0YWJhc2UvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gJy4uLy4uLy4uL1JlYWN0U2VsZWN0L3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBHZXRSZXN1bHRzLCBQcm9wcywgVmFsdWVXaXRoUmVsYXRpb24gfSBmcm9tICcuL3R5cGVzJ1xuXG5pbXBvcnQgdXNlRGVib3VuY2UgZnJvbSAnLi4vLi4vLi4vLi4vLi4vaG9va3MvdXNlRGVib3VuY2UnXG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsaXRpZXMvQ29uZmlnJ1xuaW1wb3J0IFJlYWN0U2VsZWN0IGZyb20gJy4uLy4uLy4uL1JlYWN0U2VsZWN0J1xuaW1wb3J0ICcuL2luZGV4LnNjc3MnXG5pbXBvcnQgb3B0aW9uc1JlZHVjZXIgZnJvbSAnLi9vcHRpb25zUmVkdWNlcidcblxuY29uc3QgYmFzZUNsYXNzID0gJ2NvbmRpdGlvbi12YWx1ZS1yZWxhdGlvbnNoaXAnXG5cbmNvbnN0IG1heFJlc3VsdHNQZXJSZXF1ZXN0ID0gMTBcblxuY29uc3QgUmVsYXRpb25zaGlwRmllbGQ6IFJlYWN0LkZDPFByb3BzPiA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IGFkbWluOiB7IGlzU29ydGFibGUgfSA9IHt9LCBkaXNhYmxlZCwgaGFzTWFueSwgb25DaGFuZ2UsIHJlbGF0aW9uVG8sIHZhbHVlIH0gPSBwcm9wc1xuXG4gIGNvbnN0IHtcbiAgICBjb2xsZWN0aW9ucyxcbiAgICByb3V0ZXM6IHsgYXBpIH0sXG4gICAgc2VydmVyVVJMLFxuICB9ID0gdXNlQ29uZmlnKClcblxuICBjb25zdCBoYXNNdWx0aXBsZVJlbGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocmVsYXRpb25UbylcbiAgY29uc3QgW29wdGlvbnMsIGRpc3BhdGNoT3B0aW9uc10gPSB1c2VSZWR1Y2VyKG9wdGlvbnNSZWR1Y2VyLCBbXSlcbiAgY29uc3QgW2xhc3RGdWxseUxvYWRlZFJlbGF0aW9uLCBzZXRMYXN0RnVsbHlMb2FkZWRSZWxhdGlvbl0gPSB1c2VTdGF0ZSgtMSlcbiAgY29uc3QgW2xhc3RMb2FkZWRQYWdlLCBzZXRMYXN0TG9hZGVkUGFnZV0gPSB1c2VTdGF0ZSgxKVxuICBjb25zdCBbc2VhcmNoLCBzZXRTZWFyY2hdID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtlcnJvckxvYWRpbmcsIHNldEVycm9yTG9hZGluZ10gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3QgW2hhc0xvYWRlZEZpcnN0T3B0aW9ucywgc2V0SGFzTG9hZGVkRmlyc3RPcHRpb25zXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBkZWJvdW5jZWRTZWFyY2ggPSB1c2VEZWJvdW5jZShzZWFyY2gsIDMwMClcbiAgY29uc3QgeyBpMThuLCB0IH0gPSB1c2VUcmFuc2xhdGlvbignZ2VuZXJhbCcpXG5cbiAgY29uc3QgYWRkT3B0aW9ucyA9IHVzZUNhbGxiYWNrKFxuICAgIChkYXRhLCByZWxhdGlvbikgPT4ge1xuICAgICAgY29uc3QgY29sbGVjdGlvbiA9IGNvbGxlY3Rpb25zLmZpbmQoKGNvbGwpID0+IGNvbGwuc2x1ZyA9PT0gcmVsYXRpb24pXG4gICAgICBkaXNwYXRjaE9wdGlvbnMoeyBjb2xsZWN0aW9uLCBkYXRhLCBoYXNNdWx0aXBsZVJlbGF0aW9ucywgaTE4biwgcmVsYXRpb24sIHR5cGU6ICdBREQnIH0pXG4gICAgfSxcbiAgICBbY29sbGVjdGlvbnMsIGhhc011bHRpcGxlUmVsYXRpb25zLCBpMThuXSxcbiAgKVxuXG4gIGNvbnN0IGdldFJlc3VsdHMgPSB1c2VDYWxsYmFjazxHZXRSZXN1bHRzPihcbiAgICBhc3luYyAoe1xuICAgICAgbGFzdEZ1bGx5TG9hZGVkUmVsYXRpb246IGxhc3RGdWxseUxvYWRlZFJlbGF0aW9uQXJnLFxuICAgICAgbGFzdExvYWRlZFBhZ2U6IGxhc3RMb2FkZWRQYWdlQXJnLFxuICAgICAgc2VhcmNoOiBzZWFyY2hBcmcsXG4gICAgfSkgPT4ge1xuICAgICAgbGV0IGxhc3RMb2FkZWRQYWdlVG9Vc2UgPSB0eXBlb2YgbGFzdExvYWRlZFBhZ2VBcmcgIT09ICd1bmRlZmluZWQnID8gbGFzdExvYWRlZFBhZ2VBcmcgOiAxXG4gICAgICBjb25zdCBsYXN0RnVsbHlMb2FkZWRSZWxhdGlvblRvVXNlID1cbiAgICAgICAgdHlwZW9mIGxhc3RGdWxseUxvYWRlZFJlbGF0aW9uQXJnICE9PSAndW5kZWZpbmVkJyA/IGxhc3RGdWxseUxvYWRlZFJlbGF0aW9uQXJnIDogLTFcblxuICAgICAgY29uc3QgcmVsYXRpb25zID0gQXJyYXkuaXNBcnJheShyZWxhdGlvblRvKSA/IHJlbGF0aW9uVG8gOiBbcmVsYXRpb25Ub11cbiAgICAgIGNvbnN0IHJlbGF0aW9uc1RvRmV0Y2ggPVxuICAgICAgICBsYXN0RnVsbHlMb2FkZWRSZWxhdGlvblRvVXNlID09PSAtMVxuICAgICAgICAgID8gcmVsYXRpb25zXG4gICAgICAgICAgOiByZWxhdGlvbnMuc2xpY2UobGFzdEZ1bGx5TG9hZGVkUmVsYXRpb25Ub1VzZSArIDEpXG5cbiAgICAgIGxldCByZXN1bHRzRmV0Y2hlZCA9IDBcblxuICAgICAgaWYgKCFlcnJvckxvYWRpbmcpIHtcbiAgICAgICAgcmVsYXRpb25zVG9GZXRjaC5yZWR1Y2UoYXN5bmMgKHByaW9yUmVsYXRpb24sIHJlbGF0aW9uKSA9PiB7XG4gICAgICAgICAgYXdhaXQgcHJpb3JSZWxhdGlvblxuXG4gICAgICAgICAgaWYgKHJlc3VsdHNGZXRjaGVkIDwgMTApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSBjb2xsZWN0aW9ucy5maW5kKChjb2xsKSA9PiBjb2xsLnNsdWcgPT09IHJlbGF0aW9uKVxuICAgICAgICAgICAgY29uc3QgZmllbGRUb1NlYXJjaCA9IGNvbGxlY3Rpb24/LmFkbWluPy51c2VBc1RpdGxlIHx8ICdpZCdcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtID0gc2VhcmNoQXJnID8gYCZ3aGVyZVske2ZpZWxkVG9TZWFyY2h9XVtsaWtlXT0ke3NlYXJjaEFyZ31gIDogJydcblxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgYCR7c2VydmVyVVJMfSR7YXBpfS8ke3JlbGF0aW9ufT9saW1pdD0ke21heFJlc3VsdHNQZXJSZXF1ZXN0fSZwYWdlPSR7bGFzdExvYWRlZFBhZ2VUb1VzZX0mZGVwdGg9MCR7c2VhcmNoUGFyYW19YCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6IGkxOG4ubGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGE6IFBhZ2luYXRlZERvY3MgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgaWYgKGRhdGEuZG9jcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c0ZldGNoZWQgKz0gZGF0YS5kb2NzLmxlbmd0aFxuICAgICAgICAgICAgICAgIGFkZE9wdGlvbnMoZGF0YSwgcmVsYXRpb24pXG4gICAgICAgICAgICAgICAgc2V0TGFzdExvYWRlZFBhZ2UoZGF0YS5wYWdlKVxuXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhLm5leHRQYWdlKSB7XG4gICAgICAgICAgICAgICAgICBzZXRMYXN0RnVsbHlMb2FkZWRSZWxhdGlvbihyZWxhdGlvbnMuaW5kZXhPZihyZWxhdGlvbikpXG5cbiAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIHJlbGF0aW9ucyB0byBzZWFyY2gsIG5lZWQgdG8gcmVzZXQgbGFzdExvYWRlZFBhZ2UgdG8gMVxuICAgICAgICAgICAgICAgICAgLy8gYm90aCBsb2NhbGx5IHdpdGhpbiBmdW5jdGlvbiBhbmQgc3RhdGVcbiAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbnMuaW5kZXhPZihyZWxhdGlvbikgKyAxIDwgcmVsYXRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0TG9hZGVkUGFnZVRvVXNlID0gMVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0RXJyb3JMb2FkaW5nKHQoJ2Vycm9yOnVuc3BlY2lmaWMnKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIFByb21pc2UucmVzb2x2ZSgpKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2kxOG4sIHJlbGF0aW9uVG8sIGVycm9yTG9hZGluZywgY29sbGVjdGlvbnMsIHNlcnZlclVSTCwgYXBpLCBhZGRPcHRpb25zLCB0XSxcbiAgKVxuXG4gIGNvbnN0IGZpbmRPcHRpb25zQnlWYWx1ZSA9IHVzZUNhbGxiYWNrKCgpOiBPcHRpb24gfCBPcHRpb25bXSA9PiB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpZiAoaGFzTWFueSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWUubWFwKCh2YWwpID0+IHtcbiAgICAgICAgICAgIGlmIChoYXNNdWx0aXBsZVJlbGF0aW9ucykge1xuICAgICAgICAgICAgICBsZXQgbWF0Y2hlZE9wdGlvbjogT3B0aW9uXG5cbiAgICAgICAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAob3B0Lm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgIG9wdC5vcHRpb25zLnNvbWUoKHN1Yk9wdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3ViT3B0Py52YWx1ZSA9PT0gdmFsLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZE9wdGlvbiA9IHN1Yk9wdFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkT3B0aW9uXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZpbmQoKG9wdCkgPT4gb3B0LnZhbHVlID09PSB2YWwpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc011bHRpcGxlUmVsYXRpb25zKSB7XG4gICAgICAgIGxldCBtYXRjaGVkT3B0aW9uOiBPcHRpb25cblxuICAgICAgICBjb25zdCB2YWx1ZVdpdGhSZWxhdGlvbiA9IHZhbHVlIGFzIFZhbHVlV2l0aFJlbGF0aW9uXG5cbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHQpID0+IHtcbiAgICAgICAgICBpZiAob3B0Py5vcHRpb25zKSB7XG4gICAgICAgICAgICBvcHQub3B0aW9ucy5zb21lKChzdWJPcHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHN1Yk9wdD8udmFsdWUgPT09IHZhbHVlV2l0aFJlbGF0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZE9wdGlvbiA9IHN1Yk9wdFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gbWF0Y2hlZE9wdGlvblxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3B0aW9ucy5maW5kKChvcHQpID0+IG9wdC52YWx1ZSA9PT0gdmFsdWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9LCBbaGFzTWFueSwgaGFzTXVsdGlwbGVSZWxhdGlvbnMsIHZhbHVlLCBvcHRpb25zXSlcblxuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXdTZWFyY2gpID0+IHtcbiAgICAgIGlmIChzZWFyY2ggIT09IG5ld1NlYXJjaCkge1xuICAgICAgICBzZXRTZWFyY2gobmV3U2VhcmNoKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlYXJjaF0sXG4gIClcblxuICBjb25zdCBhZGRPcHRpb25CeUlEID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGlkLCByZWxhdGlvbikgPT4ge1xuICAgICAgaWYgKCFlcnJvckxvYWRpbmcgJiYgaWQgIT09ICdudWxsJykge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3NlcnZlclVSTH0ke2FwaX0vJHtyZWxhdGlvbn0vJHtpZH0/ZGVwdGg9MGAsIHtcbiAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgIGFkZE9wdGlvbnMoeyBkb2NzOiBbZGF0YV0gfSwgcmVsYXRpb24pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcih0KCdlcnJvcjpsb2FkaW5nRG9jdW1lbnQnLCB7IGlkIH0pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbaTE4biwgYWRkT3B0aW9ucywgYXBpLCBlcnJvckxvYWRpbmcsIHNlcnZlclVSTCwgdF0sXG4gIClcblxuICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gR2V0IHJlc3VsdHMgd2hlbiBzZWFyY2ggaW5wdXQgY2hhbmdlc1xuICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGRpc3BhdGNoT3B0aW9ucyh7XG4gICAgICBpMThuLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB0eXBlOiAnQ0xFQVInLFxuICAgIH0pXG5cbiAgICBzZXRIYXNMb2FkZWRGaXJzdE9wdGlvbnModHJ1ZSlcbiAgICBzZXRMYXN0TG9hZGVkUGFnZSgxKVxuICAgIHNldExhc3RGdWxseUxvYWRlZFJlbGF0aW9uKC0xKVxuICAgIGdldFJlc3VsdHMoeyBzZWFyY2g6IGRlYm91bmNlZFNlYXJjaCB9KVxuICB9LCBbZ2V0UmVzdWx0cywgZGVib3VuY2VkU2VhcmNoLCByZWxhdGlvblRvLCBpMThuXSlcblxuICAvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgLy8gRm9ybWF0IG9wdGlvbnMgb25jZSBmaXJzdCBvcHRpb25zIGhhdmUgYmVlbiByZXRyaWV2ZWRcbiAgLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodmFsdWUgJiYgaGFzTG9hZGVkRmlyc3RPcHRpb25zKSB7XG4gICAgICBpZiAoaGFzTWFueSkge1xuICAgICAgICBjb25zdCBtYXRjaGVkT3B0aW9ucyA9IGZpbmRPcHRpb25zQnlWYWx1ZSgpXG5cbiAgICAgICAgOygobWF0Y2hlZE9wdGlvbnMgYXMgT3B0aW9uW10pIHx8IFtdKS5mb3JFYWNoKChvcHRpb24sIGkpID0+IHtcbiAgICAgICAgICBpZiAoIW9wdGlvbikge1xuICAgICAgICAgICAgaWYgKGhhc011bHRpcGxlUmVsYXRpb25zKSB7XG4gICAgICAgICAgICAgIGFkZE9wdGlvbkJ5SUQodmFsdWVbaV0udmFsdWUsIHZhbHVlW2ldLnJlbGF0aW9uVG8pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZGRPcHRpb25CeUlEKHZhbHVlW2ldLCByZWxhdGlvblRvKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRPcHRpb24gPSBmaW5kT3B0aW9uc0J5VmFsdWUoKVxuXG4gICAgICAgIGlmICghbWF0Y2hlZE9wdGlvbikge1xuICAgICAgICAgIGlmIChoYXNNdWx0aXBsZVJlbGF0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVXaXRoUmVsYXRpb24gPSB2YWx1ZSBhcyBWYWx1ZVdpdGhSZWxhdGlvblxuICAgICAgICAgICAgYWRkT3B0aW9uQnlJRCh2YWx1ZVdpdGhSZWxhdGlvbi52YWx1ZSwgdmFsdWVXaXRoUmVsYXRpb24ucmVsYXRpb25UbylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWRkT3B0aW9uQnlJRCh2YWx1ZSwgcmVsYXRpb25UbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFtcbiAgICBhZGRPcHRpb25CeUlELFxuICAgIGZpbmRPcHRpb25zQnlWYWx1ZSxcbiAgICBoYXNNYW55LFxuICAgIGhhc011bHRpcGxlUmVsYXRpb25zLFxuICAgIHJlbGF0aW9uVG8sXG4gICAgdmFsdWUsXG4gICAgaGFzTG9hZGVkRmlyc3RPcHRpb25zLFxuICBdKVxuXG4gIGNvbnN0IGNsYXNzZXMgPSBbJ2ZpZWxkLXR5cGUnLCBiYXNlQ2xhc3MsIGVycm9yTG9hZGluZyAmJiAnZXJyb3ItbG9hZGluZyddXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKCcgJylcblxuICBjb25zdCB2YWx1ZVRvUmVuZGVyID0gKGZpbmRPcHRpb25zQnlWYWx1ZSgpIHx8IHZhbHVlKSBhcyBPcHRpb25cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc2VzfT5cbiAgICAgIHshZXJyb3JMb2FkaW5nICYmIChcbiAgICAgICAgPFJlYWN0U2VsZWN0XG4gICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgIGlzTXVsdGk9e2hhc01hbnl9XG4gICAgICAgICAgaXNTb3J0YWJsZT17aXNTb3J0YWJsZX1cbiAgICAgICAgICBvbkNoYW5nZT17KHNlbGVjdGVkKSA9PiB7XG4gICAgICAgICAgICBpZiAoaGFzTWFueSkge1xuICAgICAgICAgICAgICBvbkNoYW5nZShcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgPyBzZWxlY3RlZC5tYXAoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNNdWx0aXBsZVJlbGF0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25Ubzogb3B0aW9uLnJlbGF0aW9uVG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb24udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc011bHRpcGxlUmVsYXRpb25zKSB7XG4gICAgICAgICAgICAgIG9uQ2hhbmdlKHtcbiAgICAgICAgICAgICAgICByZWxhdGlvblRvOiBzZWxlY3RlZC5yZWxhdGlvblRvLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZC52YWx1ZSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9uQ2hhbmdlKHNlbGVjdGVkLnZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH19XG4gICAgICAgICAgb25JbnB1dENoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgb25NZW51U2Nyb2xsVG9Cb3R0b209eygpID0+IHtcbiAgICAgICAgICAgIGdldFJlc3VsdHMoeyBsYXN0RnVsbHlMb2FkZWRSZWxhdGlvbiwgbGFzdExvYWRlZFBhZ2U6IGxhc3RMb2FkZWRQYWdlICsgMSB9KVxuICAgICAgICAgIH19XG4gICAgICAgICAgb3B0aW9ucz17b3B0aW9uc31cbiAgICAgICAgICBwbGFjZWhvbGRlcj17dCgnc2VsZWN0VmFsdWUnKX1cbiAgICAgICAgICB2YWx1ZT17dmFsdWVUb1JlbmRlcn1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICB7ZXJyb3JMb2FkaW5nICYmIDxkaXYgY2xhc3NOYW1lPXtgJHtiYXNlQ2xhc3N9X19lcnJvci1sb2FkaW5nYH0+e2Vycm9yTG9hZGluZ308L2Rpdj59XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVsYXRpb25zaGlwRmllbGRcbiJdLCJuYW1lcyI6WyJiYXNlQ2xhc3MiLCJtYXhSZXN1bHRzUGVyUmVxdWVzdCIsIlJlbGF0aW9uc2hpcEZpZWxkIiwicHJvcHMiLCJhZG1pbiIsImlzU29ydGFibGUiLCJkaXNhYmxlZCIsImhhc01hbnkiLCJvbkNoYW5nZSIsInJlbGF0aW9uVG8iLCJ2YWx1ZSIsImNvbGxlY3Rpb25zIiwicm91dGVzIiwiYXBpIiwic2VydmVyVVJMIiwidXNlQ29uZmlnIiwiaGFzTXVsdGlwbGVSZWxhdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJvcHRpb25zIiwiZGlzcGF0Y2hPcHRpb25zIiwidXNlUmVkdWNlciIsIm9wdGlvbnNSZWR1Y2VyIiwibGFzdEZ1bGx5TG9hZGVkUmVsYXRpb24iLCJzZXRMYXN0RnVsbHlMb2FkZWRSZWxhdGlvbiIsInVzZVN0YXRlIiwibGFzdExvYWRlZFBhZ2UiLCJzZXRMYXN0TG9hZGVkUGFnZSIsInNlYXJjaCIsInNldFNlYXJjaCIsImVycm9yTG9hZGluZyIsInNldEVycm9yTG9hZGluZyIsImhhc0xvYWRlZEZpcnN0T3B0aW9ucyIsInNldEhhc0xvYWRlZEZpcnN0T3B0aW9ucyIsImRlYm91bmNlZFNlYXJjaCIsInVzZURlYm91bmNlIiwiaTE4biIsInQiLCJ1c2VUcmFuc2xhdGlvbiIsImFkZE9wdGlvbnMiLCJ1c2VDYWxsYmFjayIsImRhdGEiLCJyZWxhdGlvbiIsImNvbGxlY3Rpb24iLCJmaW5kIiwiY29sbCIsInNsdWciLCJ0eXBlIiwiZ2V0UmVzdWx0cyIsImxhc3RGdWxseUxvYWRlZFJlbGF0aW9uQXJnIiwibGFzdExvYWRlZFBhZ2VBcmciLCJzZWFyY2hBcmciLCJsYXN0TG9hZGVkUGFnZVRvVXNlIiwibGFzdEZ1bGx5TG9hZGVkUmVsYXRpb25Ub1VzZSIsInJlbGF0aW9ucyIsInJlbGF0aW9uc1RvRmV0Y2giLCJzbGljZSIsInJlc3VsdHNGZXRjaGVkIiwicmVkdWNlIiwicHJpb3JSZWxhdGlvbiIsImZpZWxkVG9TZWFyY2giLCJ1c2VBc1RpdGxlIiwic2VhcmNoUGFyYW0iLCJyZXNwb25zZSIsImZldGNoIiwiY3JlZGVudGlhbHMiLCJoZWFkZXJzIiwibGFuZ3VhZ2UiLCJvayIsImpzb24iLCJkb2NzIiwibGVuZ3RoIiwicGFnZSIsIm5leHRQYWdlIiwiaW5kZXhPZiIsIlByb21pc2UiLCJyZXNvbHZlIiwiZmluZE9wdGlvbnNCeVZhbHVlIiwibWFwIiwidmFsIiwibWF0Y2hlZE9wdGlvbiIsImZvckVhY2giLCJvcHQiLCJzb21lIiwic3ViT3B0IiwidW5kZWZpbmVkIiwidmFsdWVXaXRoUmVsYXRpb24iLCJoYW5kbGVJbnB1dENoYW5nZSIsIm5ld1NlYXJjaCIsImFkZE9wdGlvbkJ5SUQiLCJpZCIsImNvbnNvbGUiLCJlcnJvciIsInVzZUVmZmVjdCIsInJlcXVpcmVkIiwibWF0Y2hlZE9wdGlvbnMiLCJvcHRpb24iLCJpIiwiY2xhc3NlcyIsImZpbHRlciIsIkJvb2xlYW4iLCJqb2luIiwidmFsdWVUb1JlbmRlciIsImRpdiIsImNsYXNzTmFtZSIsIlJlYWN0U2VsZWN0IiwiaXNNdWx0aSIsInNlbGVjdGVkIiwib25JbnB1dENoYW5nZSIsIm9uTWVudVNjcm9sbFRvQm90dG9tIiwicGxhY2Vob2xkZXIiXSwibWFwcGluZ3MiOiI7Ozs7K0JBaVRBOzs7ZUFBQTs7OytEQWpUb0U7OEJBQ3JDO29FQU1QO3dCQUNFO29FQUNGO1FBQ2pCO3VFQUNvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFM0IsTUFBTUEsWUFBWTtBQUVsQixNQUFNQyx1QkFBdUI7QUFFN0IsTUFBTUMsb0JBQXFDLENBQUNDO0lBQzFDLE1BQU0sRUFBRUMsT0FBTyxFQUFFQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRUMsUUFBUSxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsVUFBVSxFQUFFQyxLQUFLLEVBQUUsR0FBR1A7SUFFdkYsTUFBTSxFQUNKUSxXQUFXLEVBQ1hDLFFBQVEsRUFBRUMsR0FBRyxFQUFFLEVBQ2ZDLFNBQVMsRUFDVixHQUFHQyxJQUFBQSxpQkFBUztJQUViLE1BQU1DLHVCQUF1QkMsTUFBTUMsT0FBTyxDQUFDVDtJ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