payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
344 lines (343 loc) • 48.7 kB
JavaScript
/* eslint-disable no-param-reassign */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "addFieldStatePromise", {
enumerable: true,
get: function() {
return addFieldStatePromise;
}
});
const _bsonobjectid = /*#__PURE__*/ _interop_require_default(require("bson-objectid"));
const _types = require("../../../../../fields/config/types");
const _getDefaultValue = /*#__PURE__*/ _interop_require_default(require("../../../../../fields/getDefaultValue"));
const _iterateFields = require("./iterateFields");
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
const addFieldStatePromise = async (args)=>{
const { id, anyParentLocalized = false, config, data, field, filter, forceFullValue = false, fullData, includeSchema = false, locale, omitParents = false, operation, passesCondition, path, preferences, skipConditionChecks = false, skipValidation = false, state, t, user } = args;
if ((0, _types.fieldAffectsData)(field)) {
const fieldState = {
condition: field.admin?.condition,
fieldSchema: includeSchema ? field : undefined,
initialValue: undefined,
passesCondition,
valid: true,
validate: field.validate,
value: undefined
};
const valueWithDefault = await (0, _getDefaultValue.default)({
defaultValue: field.defaultValue,
locale,
user,
value: data?.[field.name]
});
if (data?.[field.name]) {
data[field.name] = valueWithDefault;
}
let validationResult = true;
if (typeof fieldState.validate === 'function' && !skipValidation) {
validationResult = await fieldState.validate(data?.[field.name], {
...field,
id,
config,
data: fullData,
operation,
siblingData: data,
t,
user
});
}
if (typeof validationResult === 'string') {
fieldState.errorMessage = validationResult;
fieldState.valid = false;
} else {
fieldState.valid = true;
}
switch(field.type){
case 'array':
{
const arrayValue = Array.isArray(valueWithDefault) ? valueWithDefault : [];
const { promises, rowMetadata } = arrayValue.reduce((acc, row, i)=>{
const rowPath = `${path}${field.name}.${i}.`;
row.id = row?.id || new _bsonobjectid.default().toHexString();
if (!omitParents && (!filter || filter(args))) {
state[`${rowPath}id`] = {
fieldSchema: includeSchema ? field.fields.find((field)=>'name' in field && field.name === 'id') : undefined,
initialValue: row.id,
valid: true,
value: row.id
};
}
acc.promises.push((0, _iterateFields.iterateFields)({
id,
anyParentLocalized: field.localized || anyParentLocalized,
config,
data: row,
fields: field.fields,
filter,
forceFullValue,
fullData,
includeSchema,
locale,
omitParents,
operation,
parentPassesCondition: passesCondition,
path: rowPath,
preferences,
skipConditionChecks,
skipValidation,
state,
t,
user
}));
const collapsedRowIDs = preferences?.fields?.[`${path}${field.name}`]?.collapsed;
acc.rowMetadata.push({
id: row.id,
childErrorPaths: new Set(),
collapsed: collapsedRowIDs === undefined ? field.admin.initCollapsed : collapsedRowIDs.includes(row.id)
});
return acc;
}, {
promises: [],
rowMetadata: []
});
await Promise.all(promises);
// Add values to field state
if (valueWithDefault === null) {
fieldState.value = null;
fieldState.initialValue = null;
} else {
fieldState.value = forceFullValue ? arrayValue : arrayValue.length;
fieldState.initialValue = forceFullValue ? arrayValue : arrayValue.length;
if (arrayValue.length > 0) {
fieldState.disableFormData = true;
}
}
fieldState.rows = rowMetadata;
// Add field to state
if (!omitParents && (!filter || filter(args))) {
state[`${path}${field.name}`] = fieldState;
}
break;
}
case 'blocks':
{
const blocksValue = Array.isArray(valueWithDefault) ? valueWithDefault : [];
const { promises, rowMetadata } = blocksValue.reduce((acc, row, i)=>{
const block = field.blocks.find((blockType)=>blockType.slug === row.blockType);
const rowPath = `${path}${field.name}.${i}.`;
if (block) {
row.id = row?.id || new _bsonobjectid.default().toHexString();
if (!omitParents && (!filter || filter(args))) {
state[`${rowPath}id`] = {
fieldSchema: includeSchema ? block.fields.find((blockField)=>'name' in blockField && blockField.name === 'id') : undefined,
initialValue: row.id,
valid: true,
value: row.id
};
state[`${rowPath}blockType`] = {
fieldSchema: includeSchema ? block.fields.find((blockField)=>'name' in blockField && blockField.name === 'blockType') : undefined,
initialValue: row.blockType,
valid: true,
value: row.blockType
};
state[`${rowPath}blockName`] = {
fieldSchema: includeSchema ? block.fields.find((blockField)=>'name' in blockField && blockField.name === 'blockName') : undefined,
initialValue: row.blockName,
valid: true,
value: row.blockName
};
}
acc.promises.push((0, _iterateFields.iterateFields)({
id,
anyParentLocalized: field.localized || anyParentLocalized,
config,
data: row,
fields: block.fields,
filter,
forceFullValue,
fullData,
includeSchema,
locale,
omitParents,
operation,
parentPassesCondition: passesCondition,
path: rowPath,
preferences,
skipConditionChecks,
skipValidation,
state,
t,
user
}));
const collapsedRowIDs = preferences?.fields?.[`${path}${field.name}`]?.collapsed;
acc.rowMetadata.push({
id: row.id,
blockType: row.blockType,
childErrorPaths: new Set(),
collapsed: collapsedRowIDs === undefined ? field.admin.initCollapsed : collapsedRowIDs.includes(row.id)
});
}
return acc;
}, {
promises: [],
rowMetadata: []
});
await Promise.all(promises);
// Add values to field state
if (valueWithDefault === null) {
fieldState.value = null;
fieldState.initialValue = null;
} else {
fieldState.value = forceFullValue ? blocksValue : blocksValue.length;
fieldState.initialValue = forceFullValue ? blocksValue : blocksValue.length;
if (blocksValue.length > 0) {
fieldState.disableFormData = true;
}
}
fieldState.rows = rowMetadata;
// Add field to state
if (!omitParents && (!filter || filter(args))) {
state[`${path}${field.name}`] = fieldState;
}
break;
}
case 'group':
{
await (0, _iterateFields.iterateFields)({
id,
anyParentLocalized: field.localized || anyParentLocalized,
config,
data: data?.[field.name] || {},
fields: field.fields,
filter,
forceFullValue,
fullData,
includeSchema,
locale,
omitParents,
operation,
parentPassesCondition: passesCondition,
path: `${path}${field.name}.`,
preferences,
skipConditionChecks,
skipValidation,
state,
t,
user
});
break;
}
case 'relationship':
{
if (field.hasMany) {
const relationshipValue = Array.isArray(valueWithDefault) ? valueWithDefault.map((relationship)=>{
if (Array.isArray(field.relationTo)) {
return {
relationTo: relationship.relationTo,
value: relationship.value && typeof relationship.value === 'object' ? relationship.value?.id : relationship.value
};
}
if (typeof relationship === 'object' && relationship !== null) {
return relationship.id;
}
return relationship;
}) : undefined;
fieldState.value = relationshipValue;
fieldState.initialValue = relationshipValue;
} else if (Array.isArray(field.relationTo)) {
if (valueWithDefault && typeof valueWithDefault === 'object' && 'relationTo' in valueWithDefault && 'value' in valueWithDefault) {
const value = typeof valueWithDefault?.value === 'object' && valueWithDefault?.value && 'id' in valueWithDefault.value ? valueWithDefault.value.id : valueWithDefault.value;
const relationshipValue = {
relationTo: valueWithDefault?.relationTo,
value
};
fieldState.value = relationshipValue;
fieldState.initialValue = relationshipValue;
}
} else {
const relationshipValue = valueWithDefault && typeof valueWithDefault === 'object' && 'id' in valueWithDefault ? valueWithDefault.id : valueWithDefault;
fieldState.value = relationshipValue;
fieldState.initialValue = relationshipValue;
}
if (!filter || filter(args)) {
state[`${path}${field.name}`] = fieldState;
}
break;
}
case 'upload':
{
const relationshipValue = valueWithDefault && typeof valueWithDefault === 'object' && 'id' in valueWithDefault ? valueWithDefault.id : valueWithDefault;
fieldState.value = relationshipValue;
fieldState.initialValue = relationshipValue;
if (!filter || filter(args)) {
state[`${path}${field.name}`] = fieldState;
}
break;
}
default:
{
fieldState.value = valueWithDefault;
fieldState.initialValue = valueWithDefault;
// Add field to state
if (!filter || filter(args)) {
state[`${path}${field.name}`] = fieldState;
}
break;
}
}
} else if ((0, _types.fieldHasSubFields)(field)) {
// Handle field types that do not use names (row, etc)
await (0, _iterateFields.iterateFields)({
id,
anyParentLocalized: field.localized || anyParentLocalized,
config,
data,
fields: field.fields,
filter,
forceFullValue,
fullData,
includeSchema,
locale,
omitParents,
operation,
parentPassesCondition: passesCondition,
path,
preferences,
skipConditionChecks,
skipValidation,
state,
t,
user
});
} else if (field.type === 'tabs') {
const promises = field.tabs.map((tab)=>(0, _iterateFields.iterateFields)({
id,
anyParentLocalized: tab.localized || anyParentLocalized,
config,
data: (0, _types.tabHasName)(tab) ? data?.[tab.name] : data,
fields: tab.fields,
filter,
forceFullValue,
fullData,
includeSchema,
locale,
omitParents,
operation,
parentPassesCondition: passesCondition,
path: (0, _types.tabHasName)(tab) ? `${path}${tab.name}.` : path,
preferences,
skipConditionChecks,
skipValidation,
state,
t,
user
}));
await Promise.all(promises);
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL2Zvcm1zL0Zvcm0vYnVpbGRTdGF0ZUZyb21TY2hlbWEvYWRkRmllbGRTdGF0ZVByb21pc2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB0eXBlIHsgVEZ1bmN0aW9uIH0gZnJvbSAnaTE4bmV4dCdcblxuaW1wb3J0IE9iamVjdElEIGZyb20gJ2Jzb24tb2JqZWN0aWQnXG5cbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2F1dGgnXG5pbXBvcnQgdHlwZSB7IFNhbml0aXplZENvbmZpZyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvbmZpZy90eXBlcydcbmltcG9ydCB0eXBlIHsgTm9uUHJlc2VudGF0aW9uYWxGaWVsZCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2ZpZWxkcy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IERhdGEsIEZpZWxkcywgRm9ybUZpZWxkIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmltcG9ydCB7IGZpZWxkQWZmZWN0c0RhdGEsIGZpZWxkSGFzU3ViRmllbGRzLCB0YWJIYXNOYW1lIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCBnZXRWYWx1ZVdpdGhEZWZhdWx0IGZyb20gJy4uLy4uLy4uLy4uLy4uL2ZpZWxkcy9nZXREZWZhdWx0VmFsdWUnXG5pbXBvcnQgeyBpdGVyYXRlRmllbGRzIH0gZnJvbSAnLi9pdGVyYXRlRmllbGRzJ1xuXG5leHBvcnQgdHlwZSBBZGRGaWVsZFN0YXRlUHJvbWlzZUFyZ3MgPSB7XG4gIC8qKlxuICAgKiBpZiBhbGwgcGFyZW50cyBhcmUgbG9jYWxpemVkLCB0aGVuIHRoZSBmaWVsZCBpcyBsb2NhbGl6ZWRcbiAgICovXG4gIGFueVBhcmVudExvY2FsaXplZD86IGJvb2xlYW5cbiAgY29uZmlnOiBTYW5pdGl6ZWRDb25maWdcbiAgZGF0YTogRGF0YVxuICBmaWVsZDogTm9uUHJlc2VudGF0aW9uYWxGaWVsZFxuICAvKipcbiAgICogWW91IGNhbiB1c2UgdGhpcyB0byBmaWx0ZXIgZG93biB0byBvbmx5IGBsb2NhbGl6ZWRgIGZpZWxkcyB0aGF0IHJlcXVpcmUgdHJhbnNhbGF0aW9uICh0eXBlOiB0ZXh0LCB0ZXh0YXJlYSwgZXRjLikuIEFub3RoZXIgcGx1Z2luIG1pZ2h0IHdhbnQgdG8gbG9vayBmb3Igb25seSBgcG9pbnRgIHR5cGUgZmllbGRzIHRvIGRvIHNvbWUgR0lTIGZ1bmN0aW9uLiBXaXRoIHRoZSBmaWx0ZXIgZnVuY3Rpb24geW91IGNhbiBnbyBpbiBsaWtlIGEgc3VyZ2Vvbi5cbiAgICovXG4gIGZpbHRlcj86IChhcmdzOiBBZGRGaWVsZFN0YXRlUHJvbWlzZUFyZ3MpID0+IGJvb2xlYW5cbiAgLyoqXG4gICAqIEZvcmNlIHRoZSB2YWx1ZSBvZiBmaWVsZHMgbGlrZSBhcnJheXMgb3IgYmxvY2tzIHRvIGJlIHRoZSBmdWxsIHZhbHVlIGluc3RlYWQgb2YgdGhlIGxlbmd0aCBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZm9yY2VGdWxsVmFsdWU/OiBib29sZWFuXG4gIGZ1bGxEYXRhOiBEYXRhXG4gIGlkOiBudW1iZXIgfCBzdHJpbmdcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkIHNjaGVtYSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHN0YXRlXG4gICAqL1xuICBpbmNsdWRlU2NoZW1hPzogYm9vbGVhblxuICBsb2NhbGU6IHN0cmluZ1xuICAvKipcbiAgICogV2hldGhlciB0byBvbWl0IHBhcmVudCBmaWVsZHMgaW4gdGhlIHN0YXRlLiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgb21pdFBhcmVudHM/OiBib29sZWFuXG4gIG9wZXJhdGlvbjogJ2NyZWF0ZScgfCAndXBkYXRlJ1xuICBwYXNzZXNDb25kaXRpb246IGJvb2xlYW5cbiAgcGF0aDogc3RyaW5nXG4gIHByZWZlcmVuY2VzOiB7XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNraXAgY2hlY2tpbmcgdGhlIGZpZWxkJ3MgY29uZGl0aW9uLiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc2tpcENvbmRpdGlvbkNoZWNrcz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2tpcCB2YWxpZGF0aW5nIHRoZSBmaWVsZC4gQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHNraXBWYWxpZGF0aW9uPzogYm9vbGVhblxuICBzdGF0ZTogRmllbGRzXG4gIHQ6IFRGdW5jdGlvblxuICB1c2VyOiBVc2VyXG59XG5cbi8qKlxuICogRmxhdHRlbnMgdGhlIGZpZWxkcyBzY2hlbWEgYW5kIGZpZWxkcyBkYXRhLlxuICogVGhlIG91dHB1dCBpcyB0aGUgZmllbGQgcGF0aCAoZS5nLiBhcnJheS4wLm5hbWUpIG1hcHBlZCB0byBhIEZvcm1GaWVsZCBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRGaWVsZFN0YXRlUHJvbWlzZSA9IGFzeW5jIChhcmdzOiBBZGRGaWVsZFN0YXRlUHJvbWlzZUFyZ3MpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qge1xuICAgIGlkLFxuICAgIGFueVBhcmVudExvY2FsaXplZCA9IGZhbHNlLFxuICAgIGNvbmZpZyxcbiAgICBkYXRhLFxuICAgIGZpZWxkLFxuICAgIGZpbHRlcixcbiAgICBmb3JjZUZ1bGxWYWx1ZSA9IGZhbHNlLFxuICAgIGZ1bGxEYXRhLFxuICAgIGluY2x1ZGVTY2hlbWEgPSBmYWxzZSxcbiAgICBsb2NhbGUsXG4gICAgb21pdFBhcmVudHMgPSBmYWxzZSxcbiAgICBvcGVyYXRpb24sXG4gICAgcGFzc2VzQ29uZGl0aW9uLFxuICAgIHBhdGgsXG4gICAgcHJlZmVyZW5jZXMsXG4gICAgc2tpcENvbmRpdGlvbkNoZWNrcyA9IGZhbHNlLFxuICAgIHNraXBWYWxpZGF0aW9uID0gZmFsc2UsXG4gICAgc3RhdGUsXG4gICAgdCxcbiAgICB1c2VyLFxuICB9ID0gYXJnc1xuICBpZiAoZmllbGRBZmZlY3RzRGF0YShmaWVsZCkpIHtcbiAgICBjb25zdCBmaWVsZFN0YXRlOiBGb3JtRmllbGQgPSB7XG4gICAgICBjb25kaXRpb246IGZpZWxkLmFkbWluPy5jb25kaXRpb24sXG4gICAgICBmaWVsZFNjaGVtYTogaW5jbHVkZVNjaGVtYSA/IGZpZWxkIDogdW5kZWZpbmVkLFxuICAgICAgaW5pdGlhbFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBwYXNzZXNDb25kaXRpb24sXG4gICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgIHZhbGlkYXRlOiBmaWVsZC52YWxpZGF0ZSxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVXaXRoRGVmYXVsdCA9IGF3YWl0IGdldFZhbHVlV2l0aERlZmF1bHQoe1xuICAgICAgZGVmYXVsdFZhbHVlOiBmaWVsZC5kZWZhdWx0VmFsdWUsXG4gICAgICBsb2NhbGUsXG4gICAgICB1c2VyLFxuICAgICAgdmFsdWU6IGRhdGE/LltmaWVsZC5uYW1lXSxcbiAgICB9KVxuXG4gICAgaWYgKGRhdGE/LltmaWVsZC5uYW1lXSkge1xuICAgICAgZGF0YVtmaWVsZC5uYW1lXSA9IHZhbHVlV2l0aERlZmF1bHRcbiAgICB9XG5cbiAgICBsZXQgdmFsaWRhdGlvblJlc3VsdDogc3RyaW5nIHwgdHJ1ZSA9IHRydWVcblxuICAgIGlmICh0eXBlb2YgZmllbGRTdGF0ZS52YWxpZGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhc2tpcFZhbGlkYXRpb24pIHtcbiAgICAgIHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBmaWVsZFN0YXRlLnZhbGlkYXRlKGRhdGE/LltmaWVsZC5uYW1lXSwge1xuICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgaWQsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgZGF0YTogZnVsbERhdGEsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgc2libGluZ0RhdGE6IGRhdGEsXG4gICAgICAgIHQsXG4gICAgICAgIHVzZXIsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsaWRhdGlvblJlc3VsdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZpZWxkU3RhdGUuZXJyb3JNZXNzYWdlID0gdmFsaWRhdGlvblJlc3VsdFxuICAgICAgZmllbGRTdGF0ZS52YWxpZCA9IGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIGZpZWxkU3RhdGUudmFsaWQgPSB0cnVlXG4gICAgfVxuXG4gICAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6IHtcbiAgICAgICAgY29uc3QgYXJyYXlWYWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWVXaXRoRGVmYXVsdCkgPyB2YWx1ZVdpdGhEZWZhdWx0IDogW11cbiAgICAgICAgY29uc3QgeyBwcm9taXNlcywgcm93TWV0YWRhdGEgfSA9IGFycmF5VmFsdWUucmVkdWNlKFxuICAgICAgICAgIChhY2MsIHJvdywgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm93UGF0aCA9IGAke3BhdGh9JHtmaWVsZC5uYW1lfS4ke2l9LmBcbiAgICAgICAgICAgIHJvdy5pZCA9IHJvdz8uaWQgfHwgbmV3IE9iamVjdElEKCkudG9IZXhTdHJpbmcoKVxuXG4gICAgICAgICAgICBpZiAoIW9taXRQYXJlbnRzICYmICghZmlsdGVyIHx8IGZpbHRlcihhcmdzKSkpIHtcbiAgICAgICAgICAgICAgc3RhdGVbYCR7cm93UGF0aH1pZGBdID0ge1xuICAgICAgICAgICAgICAgIGZpZWxkU2NoZW1hOiBpbmNsdWRlU2NoZW1hXG4gICAgICAgICAgICAgICAgICA/IGZpZWxkLmZpZWxkcy5maW5kKChmaWVsZCkgPT4gJ25hbWUnIGluIGZpZWxkICYmIGZpZWxkLm5hbWUgPT09ICdpZCcpXG4gICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWU6IHJvdy5pZCxcbiAgICAgICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcm93LmlkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFjYy5wcm9taXNlcy5wdXNoKFxuICAgICAgICAgICAgICBpdGVyYXRlRmllbGRzKHtcbiAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICBhbnlQYXJlbnRMb2NhbGl6ZWQ6IGZpZWxkLmxvY2FsaXplZCB8fCBhbnlQYXJlbnRMb2NhbGl6ZWQsXG4gICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgIGRhdGE6IHJvdyxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IGZpZWxkLmZpZWxkcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgZm9yY2VGdWxsVmFsdWUsXG4gICAgICAgICAgICAgICAgZnVsbERhdGEsXG4gICAgICAgICAgICAgICAgaW5jbHVkZVNjaGVtYSxcbiAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgb21pdFBhcmVudHMsXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgICAgICAgIHBhcmVudFBhc3Nlc0NvbmRpdGlvbjogcGFzc2VzQ29uZGl0aW9uLFxuICAgICAgICAgICAgICAgIHBhdGg6IHJvd1BhdGgsXG4gICAgICAgICAgICAgICAgcHJlZmVyZW5jZXMsXG4gICAgICAgICAgICAgICAgc2tpcENvbmRpdGlvbkNoZWNrcyxcbiAgICAgICAgICAgICAgICBza2lwVmFsaWRhdGlvbixcbiAgICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgICB0LFxuICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjb25zdCBjb2xsYXBzZWRSb3dJRHMgPSBwcmVmZXJlbmNlcz8uZmllbGRzPy5bYCR7cGF0aH0ke2ZpZWxkLm5hbWV9YF0/LmNvbGxhcHNlZFxuXG4gICAgICAgICAgICBhY2Mucm93TWV0YWRhdGEucHVzaCh7XG4gICAgICAgICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgICAgICAgIGNoaWxkRXJyb3JQYXRoczogbmV3IFNldCgpLFxuICAgICAgICAgICAgICBjb2xsYXBzZWQ6XG4gICAgICAgICAgICAgICAgY29sbGFwc2VkUm93SURzID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8gZmllbGQuYWRtaW4uaW5pdENvbGxhcHNlZFxuICAgICAgICAgICAgICAgICAgOiBjb2xsYXBzZWRSb3dJRHMuaW5jbHVkZXMocm93LmlkKSxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb21pc2VzOiBbXSxcbiAgICAgICAgICAgIHJvd01ldGFkYXRhOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG5cbiAgICAgICAgLy8gQWRkIHZhbHVlcyB0byBmaWVsZCBzdGF0ZVxuICAgICAgICBpZiAodmFsdWVXaXRoRGVmYXVsdCA9PT0gbnVsbCkge1xuICAgICAgICAgIGZpZWxkU3RhdGUudmFsdWUgPSBudWxsXG4gICAgICAgICAgZmllbGRTdGF0ZS5pbml0aWFsVmFsdWUgPSBudWxsXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRTdGF0ZS52YWx1ZSA9IGZvcmNlRnVsbFZhbHVlID8gYXJyYXlWYWx1ZSA6IGFycmF5VmFsdWUubGVuZ3RoXG4gICAgICAgICAgZmllbGRTdGF0ZS5pbml0aWFsVmFsdWUgPSBmb3JjZUZ1bGxWYWx1ZSA/IGFycmF5VmFsdWUgOiBhcnJheVZhbHVlLmxlbmd0aFxuXG4gICAgICAgICAgaWYgKGFycmF5VmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGRTdGF0ZS5kaXNhYmxlRm9ybURhdGEgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRTdGF0ZS5yb3dzID0gcm93TWV0YWRhdGFcblxuICAgICAgICAvLyBBZGQgZmllbGQgdG8gc3RhdGVcbiAgICAgICAgaWYgKCFvbWl0UGFyZW50cyAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoYXJncykpKSB7XG4gICAgICAgICAgc3RhdGVbYCR7cGF0aH0ke2ZpZWxkLm5hbWV9YF0gPSBmaWVsZFN0YXRlXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlICdibG9ja3MnOiB7XG4gICAgICAgIGNvbnN0IGJsb2Nrc1ZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZVdpdGhEZWZhdWx0KSA/IHZhbHVlV2l0aERlZmF1bHQgOiBbXVxuXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZXMsIHJvd01ldGFkYXRhIH0gPSBibG9ja3NWYWx1ZS5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgcm93LCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9jayA9IGZpZWxkLmJsb2Nrcy5maW5kKChibG9ja1R5cGUpID0+IGJsb2NrVHlwZS5zbHVnID09PSByb3cuYmxvY2tUeXBlKVxuICAgICAgICAgICAgY29uc3Qgcm93UGF0aCA9IGAke3BhdGh9JHtmaWVsZC5uYW1lfS4ke2l9LmBcblxuICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgIHJvdy5pZCA9IHJvdz8uaWQgfHwgbmV3IE9iamVjdElEKCkudG9IZXhTdHJpbmcoKVxuXG4gICAgICAgICAgICAgIGlmICghb21pdFBhcmVudHMgJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKGFyZ3MpKSkge1xuICAgICAgICAgICAgICAgIHN0YXRlW2Ake3Jvd1BhdGh9aWRgXSA9IHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkU2NoZW1hOiBpbmNsdWRlU2NoZW1hXG4gICAgICAgICAgICAgICAgICAgID8gYmxvY2suZmllbGRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tGaWVsZCkgPT4gJ25hbWUnIGluIGJsb2NrRmllbGQgJiYgYmxvY2tGaWVsZC5uYW1lID09PSAnaWQnLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWU6IHJvdy5pZCxcbiAgICAgICAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHJvdy5pZCxcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzdGF0ZVtgJHtyb3dQYXRofWJsb2NrVHlwZWBdID0ge1xuICAgICAgICAgICAgICAgICAgZmllbGRTY2hlbWE6IGluY2x1ZGVTY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgPyBibG9jay5maWVsZHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChibG9ja0ZpZWxkKSA9PiAnbmFtZScgaW4gYmxvY2tGaWVsZCAmJiBibG9ja0ZpZWxkLm5hbWUgPT09ICdibG9ja1R5cGUnLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWU6IHJvdy5ibG9ja1R5cGUsXG4gICAgICAgICAgICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiByb3cuYmxvY2tUeXBlLFxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN0YXRlW2Ake3Jvd1BhdGh9YmxvY2tOYW1lYF0gPSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZFNjaGVtYTogaW5jbHVkZVNjaGVtYVxuICAgICAgICAgICAgICAgICAgICA/IGJsb2NrLmZpZWxkcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrRmllbGQpID0+ICduYW1lJyBpbiBibG9ja0ZpZWxkICYmIGJsb2NrRmllbGQubmFtZSA9PT0gJ2Jsb2NrTmFtZScsXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZTogcm93LmJsb2NrTmFtZSxcbiAgICAgICAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHJvdy5ibG9ja05hbWUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYWNjLnByb21pc2VzLnB1c2goXG4gICAgICAgICAgICAgICAgaXRlcmF0ZUZpZWxkcyh7XG4gICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgIGFueVBhcmVudExvY2FsaXplZDogZmllbGQubG9jYWxpemVkIHx8IGFueVBhcmVudExvY2FsaXplZCxcbiAgICAgICAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHJvdyxcbiAgICAgICAgICAgICAgICAgIGZpZWxkczogYmxvY2suZmllbGRzLFxuICAgICAgICAgICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgICAgICAgICAgZm9yY2VGdWxsVmFsdWUsXG4gICAgICAgICAgICAgICAgICBmdWxsRGF0YSxcbiAgICAgICAgICAgICAgICAgIGluY2x1ZGVTY2hlbWEsXG4gICAgICAgICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAgICAgICBvbWl0UGFyZW50cyxcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICAgICAgICAgIHBhcmVudFBhc3Nlc0NvbmRpdGlvbjogcGFzc2VzQ29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgcGF0aDogcm93UGF0aCxcbiAgICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzLFxuICAgICAgICAgICAgICAgICAgc2tpcENvbmRpdGlvbkNoZWNrcyxcbiAgICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uLFxuICAgICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgICB0LFxuICAgICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZFJvd0lEcyA9IHByZWZlcmVuY2VzPy5maWVsZHM/LltgJHtwYXRofSR7ZmllbGQubmFtZX1gXT8uY29sbGFwc2VkXG5cbiAgICAgICAgICAgICAgYWNjLnJvd01ldGFkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgICAgICAgICAgYmxvY2tUeXBlOiByb3cuYmxvY2tUeXBlLFxuICAgICAgICAgICAgICAgIGNoaWxkRXJyb3JQYXRoczogbmV3IFNldCgpLFxuICAgICAgICAgICAgICAgIGNvbGxhcHNlZDpcbiAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZFJvd0lEcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgID8gZmllbGQuYWRtaW4uaW5pdENvbGxhcHNlZFxuICAgICAgICAgICAgICAgICAgICA6IGNvbGxhcHNlZFJvd0lEcy5pbmNsdWRlcyhyb3cuaWQpLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYWNjXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm9taXNlczogW10sXG4gICAgICAgICAgICByb3dNZXRhZGF0YTogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuXG4gICAgICAgIC8vIEFkZCB2YWx1ZXMgdG8gZmllbGQgc3RhdGVcbiAgICAgICAgaWYgKHZhbHVlV2l0aERlZmF1bHQgPT09IG51bGwpIHtcbiAgICAgICAgICBmaWVsZFN0YXRlLnZhbHVlID0gbnVsbFxuICAgICAgICAgIGZpZWxkU3RhdGUuaW5pdGlhbFZhbHVlID0gbnVsbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpZWxkU3RhdGUudmFsdWUgPSBmb3JjZUZ1bGxWYWx1ZSA/IGJsb2Nrc1ZhbHVlIDogYmxvY2tzVmFsdWUubGVuZ3RoXG4gICAgICAgICAgZmllbGRTdGF0ZS5pbml0aWFsVmFsdWUgPSBmb3JjZUZ1bGxWYWx1ZSA/IGJsb2Nrc1ZhbHVlIDogYmxvY2tzVmFsdWUubGVuZ3RoXG5cbiAgICAgICAgICBpZiAoYmxvY2tzVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmllbGRTdGF0ZS5kaXNhYmxlRm9ybURhdGEgPSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmllbGRTdGF0ZS5yb3dzID0gcm93TWV0YWRhdGFcblxuICAgICAgICAvLyBBZGQgZmllbGQgdG8gc3RhdGVcbiAgICAgICAgaWYgKCFvbWl0UGFyZW50cyAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoYXJncykpKSB7XG4gICAgICAgICAgc3RhdGVbYCR7cGF0aH0ke2ZpZWxkLm5hbWV9YF0gPSBmaWVsZFN0YXRlXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlICdncm91cCc6IHtcbiAgICAgICAgYXdhaXQgaXRlcmF0ZUZpZWxkcyh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgYW55UGFyZW50TG9jYWxpemVkOiBmaWVsZC5sb2NhbGl6ZWQgfHwgYW55UGFyZW50TG9jYWxpemVkLFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBkYXRhOiBkYXRhPy5bZmllbGQubmFtZV0gfHwge30sXG4gICAgICAgICAgZmllbGRzOiBmaWVsZC5maWVsZHMsXG4gICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgIGZvcmNlRnVsbFZhbHVlLFxuICAgICAgICAgIGZ1bGxEYXRhLFxuICAgICAgICAgIGluY2x1ZGVTY2hlbWEsXG4gICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgIG9taXRQYXJlbnRzLFxuICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICBwYXJlbnRQYXNzZXNDb25kaXRpb246IHBhc3Nlc0NvbmRpdGlvbixcbiAgICAgICAgICBwYXRoOiBgJHtwYXRofSR7ZmllbGQubmFtZX0uYCxcbiAgICAgICAgICBwcmVmZXJlbmNlcyxcbiAgICAgICAgICBza2lwQ29uZGl0aW9uQ2hlY2tzLFxuICAgICAgICAgIHNraXBWYWxpZGF0aW9uLFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIHQsXG4gICAgICAgICAgdXNlcixcbiAgICAgICAgfSlcblxuICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjYXNlICdyZWxhdGlvbnNoaXAnOiB7XG4gICAgICAgIGlmIChmaWVsZC5oYXNNYW55KSB7XG4gICAgICAgICAgY29uc3QgcmVsYXRpb25zaGlwVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlV2l0aERlZmF1bHQpXG4gICAgICAgICAgICA/IHZhbHVlV2l0aERlZmF1bHQubWFwKChyZWxhdGlvbnNoaXApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5yZWxhdGlvblRvKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25UbzogcmVsYXRpb25zaGlwLnJlbGF0aW9uVG8sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcC52YWx1ZSAmJiB0eXBlb2YgcmVsYXRpb25zaGlwLnZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgICAgICAgICAgICAgICAgICAgPyByZWxhdGlvbnNoaXAudmFsdWU/LmlkXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlbGF0aW9uc2hpcC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZWxhdGlvbnNoaXAgPT09ICdvYmplY3QnICYmIHJlbGF0aW9uc2hpcCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbGF0aW9uc2hpcC5pZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpb25zaGlwXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAgICAgZmllbGRTdGF0ZS52YWx1ZSA9IHJlbGF0aW9uc2hpcFZhbHVlXG4gICAgICAgICAgZmllbGRTdGF0ZS5pbml0aWFsVmFsdWUgPSByZWxhdGlvbnNoaXBWYWx1ZVxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQucmVsYXRpb25UbykpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB2YWx1ZVdpdGhEZWZhdWx0ICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWVXaXRoRGVmYXVsdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICdyZWxhdGlvblRvJyBpbiB2YWx1ZVdpdGhEZWZhdWx0ICYmXG4gICAgICAgICAgICAndmFsdWUnIGluIHZhbHVlV2l0aERlZmF1bHRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlV2l0aERlZmF1bHQ/LnZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICB2YWx1ZVdpdGhEZWZhdWx0Py52YWx1ZSAmJlxuICAgICAgICAgICAgICAnaWQnIGluIHZhbHVlV2l0aERlZmF1bHQudmFsdWVcbiAgICAgICAgICAgICAgICA/IHZhbHVlV2l0aERlZmF1bHQudmFsdWUuaWRcbiAgICAgICAgICAgICAgICA6IHZhbHVlV2l0aERlZmF1bHQudmFsdWVcbiAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uc2hpcFZhbHVlID0ge1xuICAgICAgICAgICAgICByZWxhdGlvblRvOiB2YWx1ZVdpdGhEZWZhdWx0Py5yZWxhdGlvblRvLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkU3RhdGUudmFsdWUgPSByZWxhdGlvbnNoaXBWYWx1ZVxuICAgICAgICAgICAgZmllbGRTdGF0ZS5pbml0aWFsVmFsdWUgPSByZWxhdGlvbnNoaXBWYWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByZWxhdGlvbnNoaXBWYWx1ZSA9XG4gICAgICAgICAgICB2YWx1ZVdpdGhEZWZhdWx0ICYmIHR5cGVvZiB2YWx1ZVdpdGhEZWZhdWx0ID09PSAnb2JqZWN0JyAmJiAnaWQnIGluIHZhbHVlV2l0aERlZmF1bHRcbiAgICAgICAgICAgICAgPyB2YWx1ZVdpdGhEZWZhdWx0LmlkXG4gICAgICAgICAgICAgIDogdmFsdWVXaXRoRGVmYXVsdFxuICAgICAgICAgIGZpZWxkU3RhdGUudmFsdWUgPSByZWxhdGlvbnNoaXBWYWx1ZVxuICAgICAgICAgIGZpZWxkU3RhdGUuaW5pdGlhbFZhbHVlID0gcmVsYXRpb25zaGlwVmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihhcmdzKSkge1xuICAgICAgICAgIHN0YXRlW2Ake3BhdGh9JHtmaWVsZC5uYW1lfWBdID0gZmllbGRTdGF0ZVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndXBsb2FkJzoge1xuICAgICAgICBjb25zdCByZWxhdGlvbnNoaXBWYWx1ZSA9XG4gICAgICAgICAgdmFsdWVXaXRoRGVmYXVsdCAmJiB0eXBlb2YgdmFsdWVXaXRoRGVmYXVsdCA9PT0gJ29iamVjdCcgJiYgJ2lkJyBpbiB2YWx1ZVdpdGhEZWZhdWx0XG4gICAgICAgICAgICA/IHZhbHVlV2l0aERlZmF1bHQuaWRcbiAgICAgICAgICAgIDogdmFsdWVXaXRoRGVmYXVsdFxuICAgICAgICBmaWVsZFN0YXRlLnZhbHVlID0gcmVsYXRpb25zaGlwVmFsdWVcbiAgICAgICAgZmllbGRTdGF0ZS5pbml0aWFsVmFsdWUgPSByZWxhdGlvbnNoaXBWYWx1ZVxuXG4gICAgICAgIGlmICghZmlsdGVyIHx8IGZpbHRlcihhcmdzKSkge1xuICAgICAgICAgIHN0YXRlW2Ake3BhdGh9JHtmaWVsZC5uYW1lfWBdID0gZmllbGRTdGF0ZVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBmaWVsZFN0YXRlLnZhbHVlID0gdmFsdWVXaXRoRGVmYXVsdFxuICAgICAgICBmaWVsZFN0YXRlLmluaXRpYWxWYWx1ZSA9IHZhbHVlV2l0aERlZmF1bHRcblxuICAgICAgICAvLyBBZGQgZmllbGQgdG8gc3RhdGVcbiAgICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyKGFyZ3MpKSB7XG4gICAgICAgICAgc3RhdGVbYCR7cGF0aH0ke2ZpZWxkLm5hbWV9YF0gPSBmaWVsZFN0YXRlXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChmaWVsZEhhc1N1YkZpZWxkcyhmaWVsZCkpIHtcbiAgICAvLyBIYW5kbGUgZmllbGQgdHlwZXMgdGhhdCBkbyBub3QgdXNlIG5hbWVzIChyb3csIGV0YylcbiAgICBhd2FpdCBpdGVyYXRlRmllbGRzKHtcbiAgICAgIGlkLFxuICAgICAgYW55UGFyZW50TG9jYWxpemVkOiBmaWVsZC5sb2NhbGl6ZWQgfHwgYW55UGFyZW50TG9jYWxpemVkLFxuICAgICAgY29uZmlnLFxuICAgICAgZGF0YSxcbiAgICAgIGZpZWxkczogZmllbGQuZmllbGRzLFxuICAgICAgZmlsdGVyLFxuICAgICAgZm9yY2VGdWxsVmFsdWUsXG4gICAgICBmdWxsRGF0YSxcbiAgICAgIGluY2x1ZGVTY2hlbWEsXG4gICAgICBsb2NhbGUsXG4gICAgICBvbWl0UGFyZW50cyxcbiAgICAgIG9wZXJhdGlvbixcbiAgICAgIHBhcmVudFBhc3Nlc0NvbmRpdGlvbjogcGFzc2VzQ29uZGl0aW9uLFxuICAgICAgcGF0aCxcbiAgICAgIHByZWZlcmVuY2VzLFxuICAgICAgc2tpcENvbmRpdGlvbkNoZWNrcyxcbiAgICAgIHNraXBWYWxpZGF0aW9uLFxuICAgICAgc3RhdGUsXG4gICAgICB0LFxuICAgICAgdXNlcixcbiAgICB9KVxuICB9IGVsc2UgaWYgKGZpZWxkLnR5cGUgPT09ICd0YWJzJykge1xuICAgIGNvbnN0IHByb21pc2VzID0gZmllbGQudGFicy5tYXAoKHRhYikgPT5cbiAgICAgIGl0ZXJhdGVGaWVsZHMoe1xuICAgICAgICBpZCxcbiAgICAgICAgYW55UGFyZW50TG9jYWxpemVkOiB0YWIubG9jYWxpemVkIHx8IGFueVBhcmVudExvY2FsaXplZCxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBkYXRhOiB0YWJIYXNOYW1lKHRhYikgPyBkYXRhPy5bdGFiLm5hbWVdIDogZGF0YSxcbiAgICAgICAgZmllbGRzOiB0YWIuZmllbGRzLFxuICAgICAgICBmaWx0ZXIsXG4gICAgICAgIGZvcmNlRnVsbFZhbHVlLFxuICAgICAgICBmdWxsRGF0YSxcbiAgICAgICAgaW5jbHVkZVNjaGVtYSxcbiAgICAgICAgbG9jYWxlLFxuICAgICAgICBvbWl0UGFyZW50cyxcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBwYXJlbnRQYXNzZXNDb25kaXRpb246IHBhc3Nlc0NvbmRpdGlvbixcbiAgICAgICAgcGF0aDogdGFiSGFzTmFtZSh0YWIpID8gYCR7cGF0aH0ke3RhYi5uYW1lfS5gIDogcGF0aCxcbiAgICAgICAgcHJlZmVyZW5jZXMsXG4gICAgICAgIHNraXBDb25kaXRpb25DaGVja3MsXG4gICAgICAgIHNraXBWYWxpZGF0aW9uLFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgdCxcbiAgICAgICAgdXNlcixcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICB9XG59XG4iXSwibmFtZXMiOlsiYWRkRmllbGRTdGF0ZVByb21pc2UiLCJhcmdzIiwiaWQiLCJhbnlQYXJlbnRMb2NhbGl6ZWQiLCJjb25maWciLCJkYXRhIiwiZmllbGQiLCJmaWx0ZXIiLCJmb3JjZUZ1bGxWYWx1ZSIsImZ1bGxEYXRhIiwiaW5jbHVkZVNjaGVtYSIsImxvY2FsZSIsIm9taXRQYXJlbnRzIiwib3BlcmF0aW9uIiwicGFzc2VzQ29uZGl0aW9uIiwicGF0aCIsInByZWZlcmVuY2VzIiwic2tpcENvbmRpdGlvbkNoZWNrcyIsInNraXBWYWxpZGF0aW9uIiwic3RhdGUiLCJ0IiwidXNlciIsImZpZWxkQWZmZWN0c0RhdGEiLCJmaWVsZFN0YXRlIiwiY29uZGl0aW9uIiwiYWRtaW4iLCJmaWVsZFNjaGVtYSIsInVuZGVmaW5lZCIsImluaXRpYWxWYWx1ZSIsInZhbGlkIiwidmFsaWRhdGUiLCJ2YWx1ZSIsInZhbHVlV2l0aERlZmF1bHQiLCJnZXRWYWx1ZVdpdGhEZWZhdWx0IiwiZGVmYXVsdFZhbHVlIiwibmFtZSIsInZhbGlkYXRpb25SZXN1bHQiLCJzaWJsaW5nRGF0YSIsImVycm9yTWVzc2FnZSIsInR5cGUiLCJhcnJheVZhbHVlIiwiQXJyYXkiLCJpc0FycmF5IiwicHJvbWlzZXMiLCJyb3dNZXRhZGF0YSIsInJlZHVjZSIsImFjYyIsInJvdyIsImkiLCJyb3dQYXRoIiwiT2JqZWN0SUQiLCJ0b0hleFN0cmluZyIsImZpZWxkcyIsImZpbmQiLCJwdXNoIiwiaXRlcmF0ZUZpZWxkcyIsImxvY2FsaXplZCIsInBhcmVudFBhc3Nlc0NvbmRpdGlvbiIsImNvbGxhcHNlZFJvd0lEcyIsImNvbGxhcHNlZCIsImNoaWxkRXJyb3JQYXRocyIsIlNldCIsImluaXRDb2xsYXBzZWQiLCJpbmNsdWRlcyIsIlByb21pc2UiLCJhbGwiLCJsZW5ndGgiLCJkaXNhYmxlRm9ybURhdGEiLCJyb3dzIiwiYmxvY2tzVmFsdWUiLCJibG9jayIsImJsb2NrcyIsImJsb2NrVHlwZSIsInNsdWciLCJibG9ja0ZpZWxkIiwiYmxvY2tOYW1lIiwiaGFzTWFueSIsInJlbGF0aW9uc2hpcFZhbHVlIiwibWFwIiwicmVsYXRpb25zaGlwIiwicmVsYXRpb25UbyIsImZpZWxkSGFzU3ViRmllbGRzIiwidGFicyIsInRhYiIsInRhYkhhc05hbWUiXSwibWFwcGluZ3MiOiJBQUFBLG9DQUFvQzs7OzsrQkFnRXZCQTs7O2VBQUFBOzs7cUVBN0RRO3VCQU8yQzt3RUFDaEM7K0JBQ0Y7Ozs7OztBQW9EdkIsTUFBTUEsdUJBQXVCLE9BQU9DO0lBQ3pDLE1BQU0sRUFDSkMsRUFBRSxFQUNGQyxxQkFBcUIsS0FBSyxFQUMxQkMsTUFBTSxFQUNOQyxJQUFJLEVBQ0pDLEtBQUssRUFDTEMsTUFBTSxFQUNOQyxpQkFBaUIsS0FBSyxFQUN0QkMsUUFBUSxFQUNSQyxnQkFBZ0IsS0FBSyxFQUNyQkMsTUFBTSxFQUNOQyxjQUFjLEtBQUssRUFDbkJDLFNBQVMsRUFDVEMsZUFBZSxFQUNmQyxJQUFJLEVBQ0pDLFdBQVcsRUFDWEMsc0JBQXNCLEtBQUssRUFDM0JDLGlCQUFpQixLQUFLLEVBQ3RCQyxLQUFLLEVBQ0xDLENBQUMsRUFDREMsSUFBSSxFQUNMLEdBQUdwQjtJQUNKLElBQUlxQixJQUFBQSx1QkFBZ0IsRUFBQ2hCLFFBQVE7UUFDM0IsTUFBTWlCLGFBQXdCO1lBQzVCQyxXQUFXbEIsTUFBTW1CLEtBQUssRUFBRUQ7WUFDeEJFLGFBQWFoQixnQkFBZ0JKLFFBQVFxQjtZQUNyQ0MsY0FBY0Q7WUFDZGI7WUFDQWUsT0FBTztZQUNQQyxVQUFVeEIsTUFBTXdCLFFBQVE7WUFDeEJDLE9BQU9KO1FBQ1Q7UUFFQSxNQUFNSyxtQkFBbUIsTUFBTUMsSUFBQUEsd0JBQW1CLEVBQUM7WUFDakRDLGNBQWM1QixNQUFNNEIsWUFBWTtZQUNoQ3ZCO1lBQ0FVO1lBQ0FVLE9BQU8xQixNQUFN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