mzinga
Version:
Node, React and MongoDB Headless CMS and Application Framework
557 lines (556 loc) • 61.8 kB
JavaScript
/* eslint-disable no-param-reassign */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
const _graphql = require("graphql");
const _forgotPassword = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/forgotPassword"));
const _init = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/init"));
const _login = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/login"));
const _logout = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/logout"));
const _me = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/me"));
const _refresh = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/refresh"));
const _resetPassword = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/resetPassword"));
const _unlock = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/unlock"));
const _verifyEmail = /*#__PURE__*/ _interop_require_default(require("../../auth/graphql/resolvers/verifyEmail"));
const _types = require("../../fields/config/types");
const _buildMutationInputType = /*#__PURE__*/ _interop_require_wildcard(require("../../graphql/schema/buildMutationInputType"));
const _buildObjectType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildObjectType"));
const _buildPaginatedListType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildPaginatedListType"));
const _buildPoliciesType = require("../../graphql/schema/buildPoliciesType");
const _buildWhereInputType = /*#__PURE__*/ _interop_require_default(require("../../graphql/schema/buildWhereInputType"));
const _formatName = /*#__PURE__*/ _interop_require_default(require("../../graphql/utilities/formatName"));
const _flattenTopLevelFields = /*#__PURE__*/ _interop_require_default(require("../../utilities/flattenTopLevelFields"));
const _formatLabels = require("../../utilities/formatLabels");
const _buildCollectionFields = require("../../versions/buildCollectionFields");
const _count = /*#__PURE__*/ _interop_require_default(require("./resolvers/count"));
const _create = /*#__PURE__*/ _interop_require_default(require("./resolvers/create"));
const _delete = /*#__PURE__*/ _interop_require_default(require("./resolvers/delete"));
const _docAccess = require("./resolvers/docAccess");
const _find = /*#__PURE__*/ _interop_require_default(require("./resolvers/find"));
const _findByID = /*#__PURE__*/ _interop_require_default(require("./resolvers/findByID"));
const _findVersionByID = /*#__PURE__*/ _interop_require_default(require("./resolvers/findVersionByID"));
const _findVersions = /*#__PURE__*/ _interop_require_default(require("./resolvers/findVersions"));
const _restoreVersion = /*#__PURE__*/ _interop_require_default(require("./resolvers/restoreVersion"));
const _update = /*#__PURE__*/ _interop_require_default(require("./resolvers/update"));
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;
}
function initCollectionsGraphQL(payload) {
Object.keys(payload.collections).forEach((slug)=>{
const collection = payload.collections[slug];
const { config, config: { fields, graphQL = {}, versions } } = collection;
if (!graphQL) return;
const draftsEnabled = collection.config.versions?.drafts;
let singularName;
let pluralName;
const fromSlug = (0, _formatLabels.formatNames)(collection.config.slug);
if (graphQL.singularName) {
singularName = (0, _formatLabels.toWords)(graphQL.singularName, true);
} else {
singularName = fromSlug.singular;
}
if (graphQL.pluralName) {
pluralName = (0, _formatLabels.toWords)(graphQL.pluralName, true);
} else {
pluralName = fromSlug.plural;
}
// For collections named 'Media' or similar,
// there is a possibility that the singular name
// will equal the plural name. Append `all` to the beginning
// of potential conflicts
if (singularName === pluralName) {
pluralName = `all${singularName}`;
}
collection.graphQL = {};
const hasIDField = (0, _flattenTopLevelFields.default)(fields).findIndex((field)=>(0, _types.fieldAffectsData)(field) && field.name === 'id') > -1;
const idType = (0, _buildMutationInputType.getCollectionIDType)(payload, config);
const baseFields = {};
const whereInputFields = [
...fields
];
if (!hasIDField) {
baseFields.id = {
type: idType
};
whereInputFields.push({
name: 'id',
type: payload.db.defaultIDType
});
}
const forceNullableObjectType = Boolean(versions?.drafts);
collection.graphQL.type = (0, _buildObjectType.default)({
name: singularName,
baseFields,
fields,
forceNullable: forceNullableObjectType,
parentName: singularName,
payload
});
collection.graphQL.paginatedType = (0, _buildPaginatedListType.default)(pluralName, collection.graphQL.type);
collection.graphQL.whereInputType = (0, _buildWhereInputType.default)({
name: singularName,
fields: whereInputFields,
parentName: singularName,
payload
});
if (config.auth && !config.auth.disableLocalStrategy) {
fields.push({
name: 'password',
type: 'text',
label: 'Password',
required: true
});
}
const createMutationInputType = (0, _buildMutationInputType.default)(payload, singularName, fields, singularName);
if (createMutationInputType) {
collection.graphQL.mutationInputType = new _graphql.GraphQLNonNull(createMutationInputType);
}
const updateMutationInputType = (0, _buildMutationInputType.default)(payload, `${singularName}Update`, fields.filter((field)=>!((0, _types.fieldAffectsData)(field) && field.name === 'id')), `${singularName}Update`, true);
if (updateMutationInputType) {
collection.graphQL.updateMutationInputType = new _graphql.GraphQLNonNull(updateMutationInputType);
}
payload.Query.fields[singularName] = {
type: collection.graphQL.type,
args: {
id: {
type: new _graphql.GraphQLNonNull(idType)
},
...draftsEnabled ? {
draft: {
type: _graphql.GraphQLBoolean
}
} : {},
...payload.config.localization ? {
fallbackLocale: {
type: payload.types.fallbackLocaleInputType
},
locale: {
type: payload.types.localeInputType
}
} : {}
},
resolve: (0, _findByID.default)(collection)
};
payload.Query.fields[pluralName] = {
type: (0, _buildPaginatedListType.default)(pluralName, collection.graphQL.type),
args: {
...draftsEnabled ? {
draft: {
type: _graphql.GraphQLBoolean
}
} : {},
where: {
type: collection.graphQL.whereInputType
},
...payload.config.localization ? {
fallbackLocale: {
type: payload.types.fallbackLocaleInputType
},
locale: {
type: payload.types.localeInputType
}
} : {},
limit: {
type: _graphql.GraphQLInt
},
page: {
type: _graphql.GraphQLInt
},
sort: {
type: _graphql.GraphQLString
}
},
resolve: (0, _find.default)(collection)
};
payload.Query.fields[`count${pluralName}`] = {
type: new _graphql.GraphQLObjectType({
name: `count${pluralName}`,
fields: {
totalDocs: {
type: _graphql.GraphQLInt
}
}
}),
args: {
...draftsEnabled ? {
draft: {
type: _graphql.GraphQLBoolean
}
} : {},
where: {
type: collection.graphQL.whereInputType
},
...payload.config.localization ? {
locale: {
type: payload.types.localeInputType
}
} : {}
},
resolve: (0, _count.default)(collection)
};
payload.Query.fields[`docAccess${singularName}`] = {
type: (0, _buildPoliciesType.buildPolicyType)({
type: 'collection',
entity: config,
scope: 'docAccess',
typeSuffix: 'DocAccess'
}),
args: {
id: {
type: new _graphql.GraphQLNonNull(idType)
}
},
resolve: (0, _docAccess.docAccessResolver)()
};
payload.Mutation.fields[`create${singularName}`] = {
type: collection.graphQL.type,
args: {
...createMutationInputType ? {
data: {
type: collection.graphQL.mutationInputType
}
} : {},
...draftsEnabled ? {
draft: {
type: _graphql.GraphQLBoolean
}
} : {},
...payload.config.localization ? {
locale: {
type: payload.types.localeInputType
}
} : {}
},
resolve: (0, _create.default)(collection)
};
payload.Mutation.fields[`update${singularName}`] = {
type: collection.graphQL.type,
args: {
id: {
type: new _graphql.GraphQLNonNull(idType)
},
autosave: {
type: _graphql.GraphQLBoolean
},
...updateMutationInputType ? {
data: {
type: collection.graphQL.updateMutationInputType
}
} : {},
...draftsEnabled ? {
draft: {
type: _graphql.GraphQLBoolean
}
} : {},
...payload.config.localization ? {
locale: {
type: payload.types.localeInputType
}
} : {}
},
resolve: (0, _update.default)(collection)
};
payload.Mutation.fields[`delete${singularName}`] = {
type: collection.graphQL.type,
args: {
id: {
type: new _graphql.GraphQLNonNull(idType)
}
},
resolve: (0, _delete.default)(collection)
};
if (config.versions) {
const versionIDType = payload.db.defaultIDType === 'text' ? _graphql.GraphQLString : _graphql.GraphQLInt;
const versionCollectionFields = [
...(0, _buildCollectionFields.buildVersionCollectionFields)(config),
{
name: 'id',
type: payload.db.defaultIDType
},
{
name: 'createdAt',
type: 'date',
label: 'Created At'
},
{
name: 'updatedAt',
type: 'date',
label: 'Updated At'
}
];
collection.graphQL.versionType = (0, _buildObjectType.default)({
name: `${singularName}Version`,
fields: versionCollectionFields,
forceNullable: forceNullableObjectType,
parentName: `${singularName}Version`,
payload
});
payload.Query.fields[`version${(0, _formatName.default)(singularName)}`] = {
type: collection.graphQL.versionType,
args: {
id: {
type: versionIDType
},
...payload.config.localization ? {
fallbackLocale: {
type: payload.types.fallbackLocaleInputType
},
locale: {
type: payload.types.localeInputType
}
} : {}
},
resolve: (0, _findVersionByID.default)(collection)
};
payload.Query.fields[`versions${pluralName}`] = {
type: (0, _buildPaginatedListType.default)(`versions${(0, _formatName.default)(pluralName)}`, collection.graphQL.versionType),
args: {
where: {
type: (0, _buildWhereInputType.default)({
name: `versions${singularName}`,
fields: versionCollectionFields,
parentName: `versions${singularName}`,
payload
})
},
...payload.config.localization ? {
fallbackLocale: {
type: payload.types.fallbackLocaleInputType
},
locale: {
type: payload.types.localeInputType
}
} : {},
limit: {
type: _graphql.GraphQLInt
},
page: {
type: _graphql.GraphQLInt
},
sort: {
type: _graphql.GraphQLString
}
},
resolve: (0, _findVersions.default)(collection)
};
payload.Mutation.fields[`restoreVersion${(0, _formatName.default)(singularName)}`] = {
type: collection.graphQL.type,
args: {
id: {
type: versionIDType
}
},
resolve: (0, _restoreVersion.default)(collection)
};
}
if (config.auth) {
const authFields = config.auth.disableLocalStrategy ? [] : [
{
name: 'email',
type: 'email',
required: true
}
];
collection.graphQL.JWT = (0, _buildObjectType.default)({
name: (0, _formatName.default)(`${slug}JWT`),
fields: [
...config.fields.filter((field)=>(0, _types.fieldAffectsData)(field) && field.saveToJWT),
...authFields,
{
name: 'collection',
type: 'text',
required: true
}
],
parentName: (0, _formatName.default)(`${slug}JWT`),
payload
});
payload.Query.fields[`me${singularName}`] = {
type: new _graphql.GraphQLObjectType({
name: (0, _formatName.default)(`${slug}Me`),
fields: {
collection: {
type: _graphql.GraphQLString
},
exp: {
type: _graphql.GraphQLInt
},
strategy: {
type: _graphql.GraphQLString
},
token: {
type: _graphql.GraphQLString
},
user: {
type: collection.graphQL.type
}
}
}),
resolve: (0, _me.default)(collection)
};
payload.Query.fields[`initialized${singularName}`] = {
type: _graphql.GraphQLBoolean,
resolve: (0, _init.default)(collection.config.slug)
};
payload.Mutation.fields[`refreshToken${singularName}`] = {
type: new _graphql.GraphQLObjectType({
name: (0, _formatName.default)(`${slug}Refreshed${singularName}`),
fields: {
exp: {
type: _graphql.GraphQLInt
},
refreshedToken: {
type: _graphql.GraphQLString
},
strategy: {
type: _graphql.GraphQLString
},
user: {
type: collection.graphQL.JWT
}
}
}),
resolve: (0, _refresh.default)(collection)
};
payload.Mutation.fields[`logout${singularName}`] = {
type: _graphql.GraphQLString,
resolve: (0, _logout.default)(collection)
};
if (!config.auth.disableLocalStrategy) {
if (config.auth.maxLoginAttempts > 0) {
payload.Mutation.fields[`unlock${singularName}`] = {
type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean),
args: {
email: {
type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
}
},
resolve: (0, _unlock.default)(collection)
};
}
payload.Mutation.fields[`login${singularName}`] = {
type: new _graphql.GraphQLObjectType({
name: (0, _formatName.default)(`${slug}LoginResult`),
fields: {
exp: {
type: _graphql.GraphQLInt
},
token: {
type: _graphql.GraphQLString
},
user: {
type: collection.graphQL.type
}
}
}),
args: {
email: {
type: _graphql.GraphQLString
},
password: {
type: _graphql.GraphQLString
}
},
resolve: (0, _login.default)(collection)
};
payload.Mutation.fields[`forgotPassword${singularName}`] = {
type: new _graphql.GraphQLNonNull(_graphql.GraphQLBoolean),
args: {
disableEmail: {
type: _graphql.GraphQLBoolean
},
email: {
type: new _graphql.GraphQLNonNull(_graphql.GraphQLString)
},
expiration: {
type: _graphql.GraphQLInt
}
},
resolve: (0, _forgotPassword.default)(collection)
};
payload.Mutation.fields[`resetPassword${singularName}`] = {
type: new _graphql.GraphQLObjectType({
name: (0, _formatName.default)(`${slug}ResetPassword`),
fields: {
token: {
type: _graphql.GraphQLString
},
user: {
type: collection.graphQL.type
}
}
}),
args: {
password: {
type: _graphql.GraphQLString
},
token: {
type: _graphql.GraphQLString
}
},
resolve: (0, _resetPassword.default)(collection)
};
payload.Mutation.fields[`verifyEmail${singularName}`] = {
type: _graphql.GraphQLBoolean,
args: {
token: {
type: _graphql.GraphQLString
}
},
resolve: (0, _verifyEmail.default)(collection)
};
}
}
});
}
const _default = initCollectionsGraphQL;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9ncmFwaHFsL2luaXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbmltcG9ydCB7XG4gIEdyYXBoUUxCb29sZWFuLFxuICBHcmFwaFFMSW50LFxuICBHcmFwaFFMTm9uTnVsbCxcbiAgR3JhcGhRTE9iamVjdFR5cGUsXG4gIEdyYXBoUUxTdHJpbmcsXG59IGZyb20gJ2dyYXBocWwnXG5cbmltcG9ydCB0eXBlIHsgRmllbGQgfSBmcm9tICcuLi8uLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RUeXBlQ29uZmlnIH0gZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRPYmplY3RUeXBlJ1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkIH0gZnJvbSAnLi4vLi4vbXppbmdhJ1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uLCBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3R5cGVzJ1xuXG5pbXBvcnQgZm9yZ290UGFzc3dvcmQgZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9mb3Jnb3RQYXNzd29yZCdcbmltcG9ydCBpbml0IGZyb20gJy4uLy4uL2F1dGgvZ3JhcGhxbC9yZXNvbHZlcnMvaW5pdCdcbmltcG9ydCBsb2dpbiBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL2xvZ2luJ1xuaW1wb3J0IGxvZ291dCBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL2xvZ291dCdcbmltcG9ydCBtZSBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL21lJ1xuaW1wb3J0IHJlZnJlc2ggZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9yZWZyZXNoJ1xuaW1wb3J0IHJlc2V0UGFzc3dvcmQgZnJvbSAnLi4vLi4vYXV0aC9ncmFwaHFsL3Jlc29sdmVycy9yZXNldFBhc3N3b3JkJ1xuaW1wb3J0IHVubG9jayBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL3VubG9jaydcbmltcG9ydCB2ZXJpZnlFbWFpbCBmcm9tICcuLi8uLi9hdXRoL2dyYXBocWwvcmVzb2x2ZXJzL3ZlcmlmeUVtYWlsJ1xuaW1wb3J0IHsgZmllbGRBZmZlY3RzRGF0YSB9IGZyb20gJy4uLy4uL2ZpZWxkcy9jb25maWcvdHlwZXMnXG5pbXBvcnQgYnVpbGRNdXRhdGlvbklucHV0VHlwZSwge1xuICBnZXRDb2xsZWN0aW9uSURUeXBlLFxufSBmcm9tICcuLi8uLi9ncmFwaHFsL3NjaGVtYS9idWlsZE11dGF0aW9uSW5wdXRUeXBlJ1xuaW1wb3J0IGJ1aWxkT2JqZWN0VHlwZSBmcm9tICcuLi8uLi9ncmFwaHFsL3NjaGVtYS9idWlsZE9iamVjdFR5cGUnXG5pbXBvcnQgYnVpbGRQYWdpbmF0ZWRMaXN0VHlwZSBmcm9tICcuLi8uLi9ncmFwaHFsL3NjaGVtYS9idWlsZFBhZ2luYXRlZExpc3RUeXBlJ1xuaW1wb3J0IHsgYnVpbGRQb2xpY3lUeXBlIH0gZnJvbSAnLi4vLi4vZ3JhcGhxbC9zY2hlbWEvYnVpbGRQb2xpY2llc1R5cGUnXG5pbXBvcnQgYnVpbGRXaGVyZUlucHV0VHlwZSBmcm9tICcuLi8uLi9ncmFwaHFsL3NjaGVtYS9idWlsZFdoZXJlSW5wdXRUeXBlJ1xuaW1wb3J0IGZvcm1hdE5hbWUgZnJvbSAnLi4vLi4vZ3JhcGhxbC91dGlsaXRpZXMvZm9ybWF0TmFtZSdcbmltcG9ydCBmbGF0dGVuRmllbGRzIGZyb20gJy4uLy4uL3V0aWxpdGllcy9mbGF0dGVuVG9wTGV2ZWxGaWVsZHMnXG5pbXBvcnQgeyBmb3JtYXROYW1lcywgdG9Xb3JkcyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9mb3JtYXRMYWJlbHMnXG5pbXBvcnQgeyBidWlsZFZlcnNpb25Db2xsZWN0aW9uRmllbGRzIH0gZnJvbSAnLi4vLi4vdmVyc2lvbnMvYnVpbGRDb2xsZWN0aW9uRmllbGRzJ1xuaW1wb3J0IGNvdW50UmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvY291bnQnXG5pbXBvcnQgY3JlYXRlUmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvY3JlYXRlJ1xuaW1wb3J0IGdldERlbGV0ZVJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL2RlbGV0ZSdcbmltcG9ydCB7IGRvY0FjY2Vzc1Jlc29sdmVyIH0gZnJvbSAnLi9yZXNvbHZlcnMvZG9jQWNjZXNzJ1xuaW1wb3J0IGZpbmRSZXNvbHZlciBmcm9tICcuL3Jlc29sdmVycy9maW5kJ1xuaW1wb3J0IGZpbmRCeUlEUmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvZmluZEJ5SUQnXG5pbXBvcnQgZmluZFZlcnNpb25CeUlEUmVzb2x2ZXIgZnJvbSAnLi9yZXNvbHZlcnMvZmluZFZlcnNpb25CeUlEJ1xuaW1wb3J0IGZpbmRWZXJzaW9uc1Jlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL2ZpbmRWZXJzaW9ucydcbmltcG9ydCByZXN0b3JlVmVyc2lvblJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL3Jlc3RvcmVWZXJzaW9uJ1xuaW1wb3J0IHVwZGF0ZVJlc29sdmVyIGZyb20gJy4vcmVzb2x2ZXJzL3VwZGF0ZSdcblxuZnVuY3Rpb24gaW5pdENvbGxlY3Rpb25zR3JhcGhRTChwYXlsb2FkOiBQYXlsb2FkKTogdm9pZCB7XG4gIE9iamVjdC5rZXlzKHBheWxvYWQuY29sbGVjdGlvbnMpLmZvckVhY2goKHNsdWcpID0+IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uOiBDb2xsZWN0aW9uID0gcGF5bG9hZC5jb2xsZWN0aW9uc1tzbHVnXVxuICAgIGNvbnN0IHtcbiAgICAgIGNvbmZpZyxcbiAgICAgIGNvbmZpZzogeyBmaWVsZHMsIGdyYXBoUUwgPSB7fSBhcyBTYW5pdGl6ZWRDb2xsZWN0aW9uQ29uZmlnWydncmFwaFFMJ10sIHZlcnNpb25zIH0sXG4gICAgfSA9IGNvbGxlY3Rpb25cblxuICAgIGlmICghZ3JhcGhRTCkgcmV0dXJuXG5cbiAgICBjb25zdCBkcmFmdHNFbmFibGVkID0gY29sbGVjdGlvbi5jb25maWcudmVyc2lvbnM/LmRyYWZ0c1xuXG4gICAgbGV0IHNpbmd1bGFyTmFtZVxuICAgIGxldCBwbHVyYWxOYW1lXG4gICAgY29uc3QgZnJvbVNsdWcgPSBmb3JtYXROYW1lcyhjb2xsZWN0aW9uLmNvbmZpZy5zbHVnKVxuICAgIGlmIChncmFwaFFMLnNpbmd1bGFyTmFtZSkge1xuICAgICAgc2luZ3VsYXJOYW1lID0gdG9Xb3JkcyhncmFwaFFMLnNpbmd1bGFyTmFtZSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2luZ3VsYXJOYW1lID0gZnJvbVNsdWcuc2luZ3VsYXJcbiAgICB9XG4gICAgaWYgKGdyYXBoUUwucGx1cmFsTmFtZSkge1xuICAgICAgcGx1cmFsTmFtZSA9IHRvV29yZHMoZ3JhcGhRTC5wbHVyYWxOYW1lLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBwbHVyYWxOYW1lID0gZnJvbVNsdWcucGx1cmFsXG4gICAgfVxuXG4gICAgLy8gRm9yIGNvbGxlY3Rpb25zIG5hbWVkICdNZWRpYScgb3Igc2ltaWxhcixcbiAgICAvLyB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHNpbmd1bGFyIG5hbWVcbiAgICAvLyB3aWxsIGVxdWFsIHRoZSBwbHVyYWwgbmFtZS4gQXBwZW5kIGBhbGxgIHRvIHRoZSBiZWdpbm5pbmdcbiAgICAvLyBvZiBwb3RlbnRpYWwgY29uZmxpY3RzXG4gICAgaWYgKHNpbmd1bGFyTmFtZSA9PT0gcGx1cmFsTmFtZSkge1xuICAgICAgcGx1cmFsTmFtZSA9IGBhbGwke3Npbmd1bGFyTmFtZX1gXG4gICAgfVxuXG4gICAgY29sbGVjdGlvbi5ncmFwaFFMID0ge30gYXMgQ29sbGVjdGlvblsnZ3JhcGhRTCddXG5cbiAgICBjb25zdCBoYXNJREZpZWxkID1cbiAgICAgIGZsYXR0ZW5GaWVsZHMoZmllbGRzKS5maW5kSW5kZXgoKGZpZWxkKSA9PiBmaWVsZEFmZmVjdHNEYXRhKGZpZWxkKSAmJiBmaWVsZC5uYW1lID09PSAnaWQnKSA+XG4gICAgICAtMVxuXG4gICAgY29uc3QgaWRUeXBlID0gZ2V0Q29sbGVjdGlvbklEVHlwZShwYXlsb2FkLCBjb25maWcpXG5cbiAgICBjb25zdCBiYXNlRmllbGRzOiBPYmplY3RUeXBlQ29uZmlnID0ge31cblxuICAgIGNvbnN0IHdoZXJlSW5wdXRGaWVsZHMgPSBbLi4uZmllbGRzXVxuXG4gICAgaWYgKCFoYXNJREZpZWxkKSB7XG4gICAgICBiYXNlRmllbGRzLmlkID0geyB0eXBlOiBpZFR5cGUgfVxuICAgICAgd2hlcmVJbnB1dEZpZWxkcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ2lkJyxcbiAgICAgICAgdHlwZTogcGF5bG9hZC5kYi5kZWZhdWx0SURUeXBlIGFzICd0ZXh0JyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgZm9yY2VOdWxsYWJsZU9iamVjdFR5cGUgPSBCb29sZWFuKHZlcnNpb25zPy5kcmFmdHMpXG5cbiAgICBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSA9IGJ1aWxkT2JqZWN0VHlwZSh7XG4gICAgICBuYW1lOiBzaW5ndWxhck5hbWUsXG4gICAgICBiYXNlRmllbGRzLFxuICAgICAgZmllbGRzLFxuICAgICAgZm9yY2VOdWxsYWJsZTogZm9yY2VOdWxsYWJsZU9iamVjdFR5cGUsXG4gICAgICBwYXJlbnROYW1lOiBzaW5ndWxhck5hbWUsXG4gICAgICBwYXlsb2FkLFxuICAgIH0pXG5cbiAgICBjb2xsZWN0aW9uLmdyYXBoUUwucGFnaW5hdGVkVHlwZSA9IGJ1aWxkUGFnaW5hdGVkTGlzdFR5cGUocGx1cmFsTmFtZSwgY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUpXG5cbiAgICBjb2xsZWN0aW9uLmdyYXBoUUwud2hlcmVJbnB1dFR5cGUgPSBidWlsZFdoZXJlSW5wdXRUeXBlKHtcbiAgICAgIG5hbWU6IHNpbmd1bGFyTmFtZSxcbiAgICAgIGZpZWxkczogd2hlcmVJbnB1dEZpZWxkcyxcbiAgICAgIHBhcmVudE5hbWU6IHNpbmd1bGFyTmFtZSxcbiAgICAgIHBheWxvYWQsXG4gICAgfSlcblxuICAgIGlmIChjb25maWcuYXV0aCAmJiAhY29uZmlnLmF1dGguZGlzYWJsZUxvY2FsU3RyYXRlZ3kpIHtcbiAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICBsYWJlbDogJ1Bhc3N3b3JkJyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlID0gYnVpbGRNdXRhdGlvbklucHV0VHlwZShcbiAgICAgIHBheWxvYWQsXG4gICAgICBzaW5ndWxhck5hbWUsXG4gICAgICBmaWVsZHMsXG4gICAgICBzaW5ndWxhck5hbWUsXG4gICAgKVxuICAgIGlmIChjcmVhdGVNdXRhdGlvbklucHV0VHlwZSkge1xuICAgICAgY29sbGVjdGlvbi5ncmFwaFFMLm11dGF0aW9uSW5wdXRUeXBlID0gbmV3IEdyYXBoUUxOb25OdWxsKGNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlKVxuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZU11dGF0aW9uSW5wdXRUeXBlID0gYnVpbGRNdXRhdGlvbklucHV0VHlwZShcbiAgICAgIHBheWxvYWQsXG4gICAgICBgJHtzaW5ndWxhck5hbWV9VXBkYXRlYCxcbiAgICAgIGZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhKGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09ICdpZCcpKSxcbiAgICAgIGAke3Npbmd1bGFyTmFtZX1VcGRhdGVgLFxuICAgICAgdHJ1ZSxcbiAgICApXG4gICAgaWYgKHVwZGF0ZU11dGF0aW9uSW5wdXRUeXBlKSB7XG4gICAgICBjb2xsZWN0aW9uLmdyYXBoUUwudXBkYXRlTXV0YXRpb25JbnB1dFR5cGUgPSBuZXcgR3JhcGhRTE5vbk51bGwodXBkYXRlTXV0YXRpb25JbnB1dFR5cGUpXG4gICAgfVxuXG4gICAgcGF5bG9hZC5RdWVyeS5maWVsZHNbc2luZ3VsYXJOYW1lXSA9IHtcbiAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlLFxuICAgICAgYXJnczoge1xuICAgICAgICBpZDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoaWRUeXBlKSB9LFxuICAgICAgICAuLi4oZHJhZnRzRW5hYmxlZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkcmFmdDogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGZhbGxiYWNrTG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMuZmFsbGJhY2tMb2NhbGVJbnB1dFR5cGUgfSxcbiAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogZmluZEJ5SURSZXNvbHZlcihjb2xsZWN0aW9uKSxcbiAgICB9XG5cbiAgICBwYXlsb2FkLlF1ZXJ5LmZpZWxkc1twbHVyYWxOYW1lXSA9IHtcbiAgICAgIHR5cGU6IGJ1aWxkUGFnaW5hdGVkTGlzdFR5cGUocGx1cmFsTmFtZSwgY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUpLFxuICAgICAgYXJnczoge1xuICAgICAgICAuLi4oZHJhZnRzRW5hYmxlZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkcmFmdDogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICB3aGVyZTogeyB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwud2hlcmVJbnB1dFR5cGUgfSxcbiAgICAgICAgLi4uKHBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvblxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmZhbGxiYWNrTG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBsaW1pdDogeyB0eXBlOiBHcmFwaFFMSW50IH0sXG4gICAgICAgIHBhZ2U6IHsgdHlwZTogR3JhcGhRTEludCB9LFxuICAgICAgICBzb3J0OiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiBmaW5kUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgfVxuXG4gICAgcGF5bG9hZC5RdWVyeS5maWVsZHNbYGNvdW50JHtwbHVyYWxOYW1lfWBdID0ge1xuICAgICAgdHlwZTogbmV3IEdyYXBoUUxPYmplY3RUeXBlKHtcbiAgICAgICAgbmFtZTogYGNvdW50JHtwbHVyYWxOYW1lfWAsXG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIHRvdGFsRG9jczogeyB0eXBlOiBHcmFwaFFMSW50IH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgLi4uKGRyYWZ0c0VuYWJsZWRcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZHJhZnQ6IHsgdHlwZTogR3JhcGhRTEJvb2xlYW4gfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgd2hlcmU6IHsgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLndoZXJlSW5wdXRUeXBlIH0sXG4gICAgICAgIC4uLihwYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogY291bnRSZXNvbHZlcihjb2xsZWN0aW9uKSxcbiAgICB9XG5cbiAgICBwYXlsb2FkLlF1ZXJ5LmZpZWxkc1tgZG9jQWNjZXNzJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICB0eXBlOiBidWlsZFBvbGljeVR5cGUoe1xuICAgICAgICB0eXBlOiAnY29sbGVjdGlvbicsXG4gICAgICAgIGVudGl0eTogY29uZmlnLFxuICAgICAgICBzY29wZTogJ2RvY0FjY2VzcycsXG4gICAgICAgIHR5cGVTdWZmaXg6ICdEb2NBY2Nlc3MnLFxuICAgICAgfSksXG4gICAgICBhcmdzOiB7XG4gICAgICAgIGlkOiB7IHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChpZFR5cGUpIH0sXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogZG9jQWNjZXNzUmVzb2x2ZXIoKSxcbiAgICB9XG5cbiAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgY3JlYXRlJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSxcbiAgICAgIGFyZ3M6IHtcbiAgICAgICAgLi4uKGNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlXG4gICAgICAgICAgPyB7IGRhdGE6IHsgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLm11dGF0aW9uSW5wdXRUeXBlIH0gfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4oZHJhZnRzRW5hYmxlZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkcmFmdDogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4ocGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSxcbiAgICAgIHJlc29sdmU6IGNyZWF0ZVJlc29sdmVyKGNvbGxlY3Rpb24pLFxuICAgIH1cblxuICAgIHBheWxvYWQuTXV0YXRpb24uZmllbGRzW2B1cGRhdGUke3Npbmd1bGFyTmFtZX1gXSA9IHtcbiAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlLFxuICAgICAgYXJnczoge1xuICAgICAgICBpZDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoaWRUeXBlKSB9LFxuICAgICAgICBhdXRvc2F2ZTogeyB0eXBlOiBHcmFwaFFMQm9vbGVhbiB9LFxuICAgICAgICAuLi4odXBkYXRlTXV0YXRpb25JbnB1dFR5cGVcbiAgICAgICAgICA/IHsgZGF0YTogeyB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudXBkYXRlTXV0YXRpb25JbnB1dFR5cGUgfSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihkcmFmdHNFbmFibGVkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGRyYWZ0OiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIC4uLihwYXlsb2FkLmNvbmZpZy5sb2NhbGl6YXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogdXBkYXRlUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgfVxuXG4gICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYGRlbGV0ZSR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUsXG4gICAgICBhcmdzOiB7XG4gICAgICAgIGlkOiB7IHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChpZFR5cGUpIH0sXG4gICAgICB9LFxuICAgICAgcmVzb2x2ZTogZ2V0RGVsZXRlUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy52ZXJzaW9ucykge1xuICAgICAgY29uc3QgdmVyc2lvbklEVHlwZSA9IHBheWxvYWQuZGIuZGVmYXVsdElEVHlwZSA9PT0gJ3RleHQnID8gR3JhcGhRTFN0cmluZyA6IEdyYXBoUUxJbnRcbiAgICAgIGNvbnN0IHZlcnNpb25Db2xsZWN0aW9uRmllbGRzOiBGaWVsZFtdID0gW1xuICAgICAgICAuLi5idWlsZFZlcnNpb25Db2xsZWN0aW9uRmllbGRzKGNvbmZpZyksXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgIHR5cGU6IHBheWxvYWQuZGIuZGVmYXVsdElEVHlwZSBhcyAndGV4dCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnY3JlYXRlZEF0JyxcbiAgICAgICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICAgICAgbGFiZWw6ICdDcmVhdGVkIEF0JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICd1cGRhdGVkQXQnLFxuICAgICAgICAgIHR5cGU6ICdkYXRlJyxcbiAgICAgICAgICBsYWJlbDogJ1VwZGF0ZWQgQXQnLFxuICAgICAgICB9LFxuICAgICAgXVxuXG4gICAgICBjb2xsZWN0aW9uLmdyYXBoUUwudmVyc2lvblR5cGUgPSBidWlsZE9iamVjdFR5cGUoe1xuICAgICAgICBuYW1lOiBgJHtzaW5ndWxhck5hbWV9VmVyc2lvbmAsXG4gICAgICAgIGZpZWxkczogdmVyc2lvbkNvbGxlY3Rpb25GaWVsZHMsXG4gICAgICAgIGZvcmNlTnVsbGFibGU6IGZvcmNlTnVsbGFibGVPYmplY3RUeXBlLFxuICAgICAgICBwYXJlbnROYW1lOiBgJHtzaW5ndWxhck5hbWV9VmVyc2lvbmAsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICB9KVxuXG4gICAgICBwYXlsb2FkLlF1ZXJ5LmZpZWxkc1tgdmVyc2lvbiR7Zm9ybWF0TmFtZShzaW5ndWxhck5hbWUpfWBdID0ge1xuICAgICAgICB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudmVyc2lvblR5cGUsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBpZDogeyB0eXBlOiB2ZXJzaW9uSURUeXBlIH0sXG4gICAgICAgICAgLi4uKHBheWxvYWQuY29uZmlnLmxvY2FsaXphdGlvblxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgZmFsbGJhY2tMb2NhbGU6IHsgdHlwZTogcGF5bG9hZC50eXBlcy5mYWxsYmFja0xvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICAgIGxvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmxvY2FsZUlucHV0VHlwZSB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZTogZmluZFZlcnNpb25CeUlEUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICB9XG4gICAgICBwYXlsb2FkLlF1ZXJ5LmZpZWxkc1tgdmVyc2lvbnMke3BsdXJhbE5hbWV9YF0gPSB7XG4gICAgICAgIHR5cGU6IGJ1aWxkUGFnaW5hdGVkTGlzdFR5cGUoXG4gICAgICAgICAgYHZlcnNpb25zJHtmb3JtYXROYW1lKHBsdXJhbE5hbWUpfWAsXG4gICAgICAgICAgY29sbGVjdGlvbi5ncmFwaFFMLnZlcnNpb25UeXBlLFxuICAgICAgICApLFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgIHR5cGU6IGJ1aWxkV2hlcmVJbnB1dFR5cGUoe1xuICAgICAgICAgICAgICBuYW1lOiBgdmVyc2lvbnMke3Npbmd1bGFyTmFtZX1gLFxuICAgICAgICAgICAgICBmaWVsZHM6IHZlcnNpb25Db2xsZWN0aW9uRmllbGRzLFxuICAgICAgICAgICAgICBwYXJlbnROYW1lOiBgdmVyc2lvbnMke3Npbmd1bGFyTmFtZX1gLFxuICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi4ocGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmYWxsYmFja0xvY2FsZTogeyB0eXBlOiBwYXlsb2FkLnR5cGVzLmZhbGxiYWNrTG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICAgICAgbG9jYWxlOiB7IHR5cGU6IHBheWxvYWQudHlwZXMubG9jYWxlSW5wdXRUeXBlIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIGxpbWl0OiB7IHR5cGU6IEdyYXBoUUxJbnQgfSxcbiAgICAgICAgICBwYWdlOiB7IHR5cGU6IEdyYXBoUUxJbnQgfSxcbiAgICAgICAgICBzb3J0OiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZTogZmluZFZlcnNpb25zUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICB9XG4gICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgcmVzdG9yZVZlcnNpb24ke2Zvcm1hdE5hbWUoc2luZ3VsYXJOYW1lKX1gXSA9IHtcbiAgICAgICAgdHlwZTogY29sbGVjdGlvbi5ncmFwaFFMLnR5cGUsXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICBpZDogeyB0eXBlOiB2ZXJzaW9uSURUeXBlIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmU6IHJlc3RvcmVWZXJzaW9uUmVzb2x2ZXIoY29sbGVjdGlvbiksXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5hdXRoKSB7XG4gICAgICBjb25zdCBhdXRoRmllbGRzOiBGaWVsZFtdID0gY29uZmlnLmF1dGguZGlzYWJsZUxvY2FsU3RyYXRlZ3lcbiAgICAgICAgPyBbXVxuICAgICAgICA6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbmFtZTogJ2VtYWlsJyxcbiAgICAgICAgICAgICAgdHlwZTogJ2VtYWlsJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgIGNvbGxlY3Rpb24uZ3JhcGhRTC5KV1QgPSBidWlsZE9iamVjdFR5cGUoe1xuICAgICAgICBuYW1lOiBmb3JtYXROYW1lKGAke3NsdWd9SldUYCksXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIC4uLmNvbmZpZy5maWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gZmllbGRBZmZlY3RzRGF0YShmaWVsZCkgJiYgZmllbGQuc2F2ZVRvSldUKSxcbiAgICAgICAgICAuLi5hdXRoRmllbGRzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdjb2xsZWN0aW9uJyxcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIHBhcmVudE5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31KV1RgKSxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgIH0pXG5cbiAgICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW2BtZSR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE9iamVjdFR5cGUoe1xuICAgICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31NZWApLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgY29sbGVjdGlvbjoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMU3RyaW5nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4cDoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMSW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0cmF0ZWd5OiB7XG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdG9rZW46IHtcbiAgICAgICAgICAgICAgdHlwZTogR3JhcGhRTFN0cmluZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgcmVzb2x2ZTogbWUoY29sbGVjdGlvbiksXG4gICAgICB9XG5cbiAgICAgIHBheWxvYWQuUXVlcnkuZmllbGRzW2Bpbml0aWFsaXplZCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICB0eXBlOiBHcmFwaFFMQm9vbGVhbixcbiAgICAgICAgcmVzb2x2ZTogaW5pdChjb2xsZWN0aW9uLmNvbmZpZy5zbHVnKSxcbiAgICAgIH1cblxuICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYHJlZnJlc2hUb2tlbiR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE9iamVjdFR5cGUoe1xuICAgICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31SZWZyZXNoZWQke3Npbmd1bGFyTmFtZX1gKSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIGV4cDoge1xuICAgICAgICAgICAgICB0eXBlOiBHcmFwaFFMSW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlZnJlc2hlZFRva2VuOiB7XG4gICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RyYXRlZ3k6IHtcbiAgICAgICAgICAgICAgdHlwZTogR3JhcGhRTFN0cmluZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC5KV1QsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICByZXNvbHZlOiByZWZyZXNoKGNvbGxlY3Rpb24pLFxuICAgICAgfVxuXG4gICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgbG9nb3V0JHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgIHR5cGU6IEdyYXBoUUxTdHJpbmcsXG4gICAgICAgIHJlc29sdmU6IGxvZ291dChjb2xsZWN0aW9uKSxcbiAgICAgIH1cblxuICAgICAgaWYgKCFjb25maWcuYXV0aC5kaXNhYmxlTG9jYWxTdHJhdGVneSkge1xuICAgICAgICBpZiAoY29uZmlnLmF1dGgubWF4TG9naW5BdHRlbXB0cyA+IDApIHtcbiAgICAgICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgdW5sb2NrJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTEJvb2xlYW4pLFxuICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICBlbWFpbDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZykgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZXNvbHZlOiB1bmxvY2soY29sbGVjdGlvbiksXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYGxvZ2luJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgICAgdHlwZTogbmV3IEdyYXBoUUxPYmplY3RUeXBlKHtcbiAgICAgICAgICAgIG5hbWU6IGZvcm1hdE5hbWUoYCR7c2x1Z31Mb2dpblJlc3VsdGApLFxuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIGV4cDoge1xuICAgICAgICAgICAgICAgIHR5cGU6IEdyYXBoUUxJbnQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRva2VuOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogR3JhcGhRTFN0cmluZyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXNlcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6IGNvbGxlY3Rpb24uZ3JhcGhRTC50eXBlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBlbWFpbDogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgICBwYXNzd29yZDogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiBsb2dpbihjb2xsZWN0aW9uKSxcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQuTXV0YXRpb24uZmllbGRzW2Bmb3Jnb3RQYXNzd29yZCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChHcmFwaFFMQm9vbGVhbiksXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgZGlzYWJsZUVtYWlsOiB7IHR5cGU6IEdyYXBoUUxCb29sZWFuIH0sXG4gICAgICAgICAgICBlbWFpbDogeyB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoR3JhcGhRTFN0cmluZykgfSxcbiAgICAgICAgICAgIGV4cGlyYXRpb246IHsgdHlwZTogR3JhcGhRTEludCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogZm9yZ290UGFzc3dvcmQoY29sbGVjdGlvbiksXG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkLk11dGF0aW9uLmZpZWxkc1tgcmVzZXRQYXNzd29yZCR7c2luZ3VsYXJOYW1lfWBdID0ge1xuICAgICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMT2JqZWN0VHlwZSh7XG4gICAgICAgICAgICBuYW1lOiBmb3JtYXROYW1lKGAke3NsdWd9UmVzZXRQYXNzd29yZGApLFxuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgIHRva2VuOiB7IHR5cGU6IEdyYXBoUUxTdHJpbmcgfSxcbiAgICAgICAgICAgICAgdXNlcjogeyB0eXBlOiBjb2xsZWN0aW9uLmdyYXBoUUwudHlwZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBwYXNzd29yZDogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgICB0b2tlbjogeyB0eXBlOiBHcmFwaFFMU3RyaW5nIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiByZXNldFBhc3N3b3JkKGNvbGxlY3Rpb24pLFxuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZC5NdXRhdGlvbi5maWVsZHNbYHZlcmlmeUVtYWlsJHtzaW5ndWxhck5hbWV9YF0gPSB7XG4gICAgICAgICAgdHlwZTogR3JhcGhRTEJvb2xlYW4sXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgdG9rZW46IHsgdHlwZTogR3JhcGhRTFN0cmluZyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZTogdmVyaWZ5RW1haWwoY29sbGVjdGlvbiksXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluaXRDb2xsZWN0aW9uc0dyYXBoUUxcbiJdLCJuYW1lcyI6WyJpbml0Q29sbGVjdGlvbnNHcmFwaFFMIiwicGF5bG9hZCIsIk9iamVjdCIsImtleXMiLCJjb2xsZWN0aW9ucyIsImZvckVhY2giLCJzbHVnIiwiY29sbGVjdGlvbiIsImNvbmZpZyIsImZpZWxkcyIsImdyYXBoUUwiLCJ2ZXJzaW9ucyIsImRyYWZ0c0VuYWJsZWQiLCJkcmFmdHMiLCJzaW5ndWxhck5hbWUiLCJwbHVyYWxOYW1lIiwiZnJvbVNsdWciLCJmb3JtYXROYW1lcyIsInRvV29yZHMiLCJzaW5ndWxhciIsInBsdXJhbCIsImhhc0lERmllbGQiLCJmbGF0dGVuRmllbGRzIiwiZmluZEluZGV4IiwiZmllbGQiLCJmaWVsZEFmZmVjdHNEYXRhIiwibmFtZSIsImlkVHlwZSIsImdldENvbGxlY3Rpb25JRFR5cGUiLCJiYXNlRmllbGRzIiwid2hlcmVJbnB1dEZpZWxkcyIsImlkIiwidHlwZSIsInB1c2giLCJkYiIsImRlZmF1bHRJRFR5cGUiLCJmb3JjZU51bGxhYmxlT2JqZWN0VHlwZSIsIkJvb2xlYW4iLCJidWlsZE9iamVjdFR5cGUiLCJmb3JjZU51bGxhYmxlIiwicGFyZW50TmFtZSIsInBhZ2luYXRlZFR5cGUiLCJidWlsZFBhZ2luYXRlZExpc3RUeXBlIiwid2hlcmVJbnB1dFR5cGUiLCJidWlsZFdoZXJlSW5wdXRUeXBlIiwiYXV0aCIsImRpc2FibGVMb2NhbFN0cmF0ZWd5IiwibGFiZWwiLCJyZXF1aXJlZCIsImNyZWF0ZU11dGF0aW9uSW5wdXRUeXBlIiwiYnVpbGRNdXRhdGlvbklucHV0VHlwZSIsIm11dGF0aW9uSW5wdXRUeXBlIiwiR3JhcGhRTE5vbk51bGwiLCJ1cGRhdGVNdXRhdGlvbklucHV0VHlwZSIsImZpbHRlciIsIlF1ZXJ5IiwiYXJncyIsImRyYWZ0IiwiR3JhcGhRTEJvb2xlYW4iLCJsb2NhbGl6YXRpb24iLCJmYWxsYmFja0xvY2FsZSIsInR5cGVzIiwiZmFsbGJhY2tMb2NhbGVJbnB1dFR5cGUiLCJsb2NhbGUiLCJsb2NhbGVJbnB1dFR5cGUiLCJyZXNvbHZlIiwiZmluZEJ5SURSZXNvbHZlciIsIndoZXJlIiwibGltaXQiLCJHcmFwaFFMSW50IiwicGFnZSIsInNvcnQiLCJHcmFwaFFMU3RyaW5nIiwiZmluZFJlc29sdmVyIiwiR3JhcGhRTE9iamVjdFR5cGUiLCJ0b3RhbERvY3MiLCJjb3VudFJlc29sdmVyIiwiYnVpbGRQb2xpY3lUeXBlIiwiZW50aXR5Iiwic2NvcGUiLCJ0eXBlU3VmZml4IiwiZG9jQWNjZXNzUmVzb2x2ZXIiLCJNdXRhdGlvbiIsImRhdGEiLCJjcmVhdGVSZXNvbHZlciIsImF1dG9zYXZlIiwidXBkYXRlUmVzb2x2ZXIiLCJnZXREZWxldGVSZXNvbHZlciIsInZlcnNpb25JRFR5cGUiLCJ2ZXJzaW9uQ29sbGVjdGlvbkZpZWxkcyIsImJ1aWxkVmVyc2lvbkNvbGxlY3Rpb25GaWVsZHMiLCJ2ZXJzaW9uVHlwZSIsImZvcm1hdE5hbWUiLCJmaW5kVmVyc2lvbkJ5SURSZXNvbHZlciIsImZpbmRWZXJzaW9uc1Jlc29sdmVyIiwicmVzdG9yZVZlcnNpb25SZXNvbHZlciIsImF1dGhGaWVsZHMiLCJKV1QiLCJzYXZlVG9KV1QiLCJleHAiLCJzdHJhdGVneSIsInRva2VuIiwidXNlciIsIm1lIiwiaW5pdCIsInJlZnJlc2hlZFRva2VuIiwicmVmcmVzaCIsImxvZ291dCIsIm1heExvZ2luQXR0ZW1wdHMiLCJlbWFpbCIsInVubG9jayIsInBhc3N3b3JkIiwibG9naW4iLCJkaXNhYmxlRW1haWwiLCJleHBpcmF0aW9uIiwiZm9yZ290UGFzc3dvcmQiLCJyZXNldFBhc3N3b3JkIiwidmVyaWZ5RW1haWwiXSwicmFuZ2VNYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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