UNPKG

@leosprograms/vf-graphql-holochain

Version:

GraphQL schema bindings for the Holochain implementation of ValueFlows

131 lines 25.3 kB
/** * Resolvers for Commitment fields * * @package: HoloREA * @since: 2019-08-28 */ import { DEFAULT_VF_MODULES, VfModule } from '../types.js'; import { extractEdges, mapZomeFn } from '../connection.js'; import agentQueries from '../queries/agent.js'; import agreementQueries from '../queries/agreement.js'; import planQueries from '../queries/plan.js'; export default (enabledVFModules = DEFAULT_VF_MODULES, dnaConfig, conductorUri) => { const hasHistory = -1 !== enabledVFModules.indexOf(VfModule.History); const hasAgent = -1 !== enabledVFModules.indexOf(VfModule.Agent); const hasProcess = -1 !== enabledVFModules.indexOf(VfModule.Process); const hasResourceSpecification = -1 !== enabledVFModules.indexOf(VfModule.ResourceSpecification); const hasProcessSpecification = -1 !== enabledVFModules.indexOf(VfModule.ProcessSpecification); const hasAction = -1 !== enabledVFModules.indexOf(VfModule.Action); const hasAgreement = -1 !== enabledVFModules.indexOf(VfModule.Agreement); const hasPlan = -1 !== enabledVFModules.indexOf(VfModule.Plan); const hasFulfillment = -1 !== enabledVFModules.indexOf(VfModule.Fulfillment); const hasSatisfaction = -1 !== enabledVFModules.indexOf(VfModule.Satisfaction); const hasObservation = -1 !== enabledVFModules.indexOf(VfModule.Observation); const readRevision = mapZomeFn(dnaConfig, conductorUri, 'combined', 'commitment', 'get_revision'); const readFulfillments = mapZomeFn(dnaConfig, conductorUri, 'combined', 'indexing', 'query_fulfillments'); const readSatisfactions = mapZomeFn(dnaConfig, conductorUri, 'combined', 'indexing', 'query_satisfactions'); const readProcesses = mapZomeFn(dnaConfig, conductorUri, 'combined', 'indexing', 'query_processes'); const readResourceSpecification = mapZomeFn(dnaConfig, conductorUri, 'combined', 'resource_specification', 'get_resource_specification'); const readProcessSpecification = mapZomeFn(dnaConfig, conductorUri, 'combined', 'process_specification', 'get_process_specification'); const readAction = mapZomeFn(dnaConfig, conductorUri, 'combined', 'action', 'get_action'); const readPlan = planQueries(dnaConfig, conductorUri)['plan']; const readAgent = agentQueries(dnaConfig, conductorUri)['agent']; const readAgreement = agreementQueries(dnaConfig, conductorUri)['agreement']; return Object.assign((hasFulfillment ? { fulfilledBy: async (record) => { const results = await readFulfillments({ params: { fulfills: record.id } }); return extractEdges(results); }, } : {}), (hasSatisfaction ? { satisfies: async (record) => { const results = await readSatisfactions({ params: { satisfiedBy: record.id } }); return extractEdges(results); }, } : {}), (hasAgent ? { providerId: async (record) => { return record.provider ? record.provider : null; }, provider: async (record) => { return readAgent(record, { id: record.provider }); }, receiverId: async (record) => { return record.receiver ? record.receiver : null; }, receiver: async (record) => { return readAgent(record, { id: record.receiver }); }, inScopeOf: async (record) => { return (await Promise.all((record.inScopeOf || []).map((address) => readAgent(record, { address })))); }, involvedAgents: async (record) => { return (await Promise.all((record.involvedAgents || []).map((address) => readAgent(record, { address })))); }, } : {}), (hasProcess ? { inputOf: async (record) => { try { const results = await readProcesses({ params: { committedInputs: record.id } }); console.log("inputOf", results); return results.edges.pop()['node']; } catch (e) { console.error(`Error fetching inputOf for Commitment ${record.id}`, e); return null; } }, outputOf: async (record) => { try { const results = await readProcesses({ params: { committedOutputs: record.id } }); console.log("outputOf", results); return results.edges.pop()['node']; } catch (e) { console.error(`Error fetching outputOf for Commitment ${record.id}`, e); return null; } }, } : {}), (hasResourceSpecification ? { resourceConformsTo: async (record) => { return (await readResourceSpecification({ address: record.resourceConformsTo })).resourceSpecification; }, } : {}), (hasProcessSpecification ? { stageId: async (record) => { return record.stage ? record.stage : "undefined"; }, stage: async (record) => { return record.stage ? (await readProcessSpecification({ address: record.stage })).processSpecification : {}; }, } : {}), (hasAction ? { action: async (record) => { return (await readAction({ id: record.action })); }, } : {}), (hasAgreement ? { clauseOf: async (record) => { if (!record.clauseOf) { return null; } try { return await readAgreement(record, { id: record.clauseOf }); } catch (e) { console.error(`Error fetching clauseOf for Commitment ${record.id}`, e); return null; } }, } : {}), (hasPlan ? { independentDemandOf: async (record) => { return readPlan(record, { id: record.independentDemandOf }); }, plannedWithin: async (record) => { return readPlan(record, { id: record.plannedWithin }); }, } : {}), (hasObservation ? { resourceInventoriedAs: async (record) => { throw new Error('resolver unimplemented'); }, } : {}), (hasHistory ? { revision: async (record, args) => { return (await readRevision(args)).commitment; }, } : {})); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Jlc29sdmVycy9jb21taXRtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFpQixrQkFBa0IsRUFBRSxRQUFRLEVBQWdJLE1BQU0sYUFBYSxDQUFBO0FBQ3ZNLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUF3QjFELE9BQU8sWUFBWSxNQUFNLHFCQUFxQixDQUFBO0FBQzlDLE9BQU8sZ0JBQWdCLE1BQU0seUJBQXlCLENBQUE7QUFDdEQsT0FBTyxXQUFXLE1BQU0sb0JBQW9CLENBQUE7QUFHNUMsZUFBZSxDQUFDLG1CQUErQixrQkFBa0IsRUFBRSxTQUF3QixFQUFFLFlBQW9CLEVBQUUsRUFBRTtJQUNuSCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDaEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwRSxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQTtJQUNoRyxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUM5RixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0s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QUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDWixRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQWtCLEVBQUUsSUFBMkMsRUFBdUIsRUFBRTtZQUN2RyxPQUFPLENBQUMsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7UUFDOUMsQ0FBQztLQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUNSLENBQUE7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc29sdmVycyBmb3IgQ29tbWl0bWVudCBmaWVsZHNcbiAqXG4gKiBAcGFja2FnZTogSG9sb1JFQVxuICogQHNpbmNlOiAgIDIwMTktMDgtMjhcbiAqL1xuXG5pbXBvcnQgeyBETkFJZE1hcHBpbmdzLCBERUZBVUxUX1ZGX01PRFVMRVMsIFZmTW9kdWxlLCBSZWFkUGFyYW1zLCBCeUlkLCBCeVJldmlzaW9uLCBSZXNvdXJjZVNwZWNpZmljYXRpb25BZGRyZXNzLCBBZGRyZXNzYWJsZUlkZW50aWZpZXIsIEFnZW50QWRkcmVzcywgUHJvY2Vzc1NwZWNpZmljYXRpb25BZGRyZXNzIH0gZnJvbSAnLi4vdHlwZXMuanMnXG5pbXBvcnQgeyBleHRyYWN0RWRnZXMsIG1hcFpvbWVGbiB9IGZyb20gJy4uL2Nvbm5lY3Rpb24uanMnXG5cbmltcG9ydCB7XG4gIEFnZW50LFxuICBDb21taXRtZW50LFxuICBDb21taXRtZW50UmVzcG9uc2UsXG4gIEZ1bGZpbGxtZW50LFxuICBTYXRpc2ZhY3Rpb24sXG4gIFByb2Nlc3MsXG4gIFJlc291cmNlU3BlY2lmaWNhdGlvbixcbiAgQWN0aW9uLFxuICBBZ3JlZW1lbnQsXG4gIE1heWJlLFxuICBQbGFuLFxuICBGdWxmaWxsbWVudENvbm5lY3Rpb24sXG4gIFByb2Nlc3NDb25uZWN0aW9uLFxuICBTYXRpc2ZhY3Rpb25Db25uZWN0aW9uLFxuICBSZXNvdXJjZVNwZWNpZmljYXRpb25SZXNwb25zZSxcbiAgUHJvY2Vzc1NwZWNpZmljYXRpb25SZXNwb25zZSxcbiAgQWNjb3VudGluZ1Njb3BlLFxuICBQcm9jZXNzU3BlY2lmaWNhdGlvbixcbiAgRWNvbm9taWNSZXNvdXJjZSxcbn0gZnJvbSAnQGxlb3Nwcm9ncmFtcy92Zi1ncmFwaHFsJ1xuXG5pbXBvcnQgYWdlbnRRdWVyaWVzIGZyb20gJy4uL3F1ZXJpZXMvYWdlbnQuanMnXG5pbXBvcnQgYWdyZWVtZW50UXVlcmllcyBmcm9tICcuLi9xdWVyaWVzL2FncmVlbWVudC5qcydcbmltcG9ydCBwbGFuUXVlcmllcyBmcm9tICcuLi9xdWVyaWVzL3BsYW4uanMnXG5pbXBvcnQgeyBGdWxmaWxsbWVudFNlYXJjaElucHV0LCBQcm9jZXNzU2VhcmNoSW5wdXQsIFNhdGlzZmFjdGlvblNlYXJjaElucHV0IH0gZnJvbSAnLi96b21lU2VhcmNoSW5wdXRUeXBlcy5qcydcblxuZXhwb3J0IGRlZmF1bHQgKGVuYWJsZWRWRk1vZHVsZXM6IFZmTW9kdWxlW10gPSBERUZBVUxUX1ZGX01PRFVMRVMsIGRuYUNvbmZpZzogRE5BSWRNYXBwaW5ncywgY29uZHVjdG9yVXJpOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgaGFzSGlzdG9yeSA9IC0xICE9PSBlbmFibGVkVkZNb2R1bGVzLmluZGV4T2YoVmZNb2R1bGUuSGlzdG9yeSlcbiAgY29uc3QgaGFzQWdlbnQgPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLkFnZW50KVxuICBjb25zdCBoYXNQcm9jZXNzID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5Qcm9jZXNzKVxuICBjb25zdCBoYXNSZXNvdXJjZVNwZWNpZmljYXRpb24gPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLlJlc291cmNlU3BlY2lmaWNhdGlvbilcbiAgY29uc3QgaGFzUHJvY2Vzc1NwZWNpZmljYXRpb24gPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLlByb2Nlc3NTcGVjaWZpY2F0aW9uKVxuICBjb25zdCBoYXNBY3Rpb24gPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLkFjdGlvbilcbiAgY29uc3QgaGFzQWdyZWVtZW50ID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5BZ3JlZW1lbnQpXG4gIGNvbnN0IGhhc1BsYW4gPSAtMSAhPT0gZW5hYmxlZFZGTW9kdWxlcy5pbmRleE9mKFZmTW9kdWxlLlBsYW4pXG4gIGNvbnN0IGhhc0Z1bGZpbGxtZW50ID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5GdWxmaWxsbWVudClcbiAgY29uc3QgaGFzU2F0aXNmYWN0aW9uID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5TYXRpc2ZhY3Rpb24pXG4gIGNvbnN0IGhhc09ic2VydmF0aW9uID0gLTEgIT09IGVuYWJsZWRWRk1vZHVsZXMuaW5kZXhPZihWZk1vZHVsZS5PYnNlcnZhdGlvbilcblxuICBjb25zdCByZWFkUmV2aXNpb24gPSBtYXBab21lRm48QnlSZXZpc2lvbiwgQ29tbWl0bWVudFJlc3BvbnNlPihkbmFDb25maWcsIGNvbmR1Y3RvclVyaSwgJ2NvbWJpbmVkJywgJ2NvbW1pdG1lbnQnLCAnZ2V0X3JldmlzaW9uJylcbiAgY29uc3QgcmVhZEZ1bGZpbGxtZW50cyA9IG1hcFpvbWVGbjxGdWxmaWxsbWVudFNlYXJjaElucHV0LCBGdWxmaWxsbWVudENvbm5lY3Rpb24+KGRuYUNvbmZpZywgY29uZHVjdG9yVXJpLCAnY29tYmluZWQnLCAnaW5kZXhpbmcnLCAncXVlcnlfZnVsZmlsbG1lbnRzJylcbiAgY29uc3QgcmVhZFNhdGlzZmFjdGlvbnMgPSBtYXBab21lRm48U2F0aXNmYWN0aW9uU2VhcmNoSW5wdXQsIFNhdGlzZmFjdGlvbkNvbm5lY3Rpb24+KGRuYUNvbmZpZywgY29uZHVjdG9yVXJpLCAnY29tYmluZWQnLCAnaW5kZXhpbmcnLCAncXVlcnlfc2F0aXNmYWN0aW9ucycpXG4gIGNvbnN0IHJlYWRQcm9jZXNzZXMgPSBtYXBab21lRm48UHJvY2Vzc1NlYXJjaElucHV0LCBQcm9jZXNzQ29ubmVjdGlvbj4oZG5hQ29uZmlnLCBjb25kdWN0b3JVcmksICdjb21iaW5lZCcsICdpbmRleGluZycsICdxdWVyeV9wcm9jZXNzZXMnKVxuICBjb25zdCByZWFkUmVzb3VyY2VTcGVjaWZpY2F0aW9uID0gbWFwWm9tZUZuPFJlYWRQYXJhbXMsIFJlc291cmNlU3BlY2lmaWNhdGlvblJlc3BvbnNlPihkbmFDb25maWcsIGNvbmR1Y3RvclVyaSwgJ2NvbWJpbmVkJywgJ3Jlc291cmNlX3NwZWNpZmljYXRpb24nLCAnZ2V0X3Jlc291cmNlX3NwZWNpZmljYXRpb24nKVxuICBjb25zdCByZWFkUHJvY2Vzc1NwZWNpZmljYXRpb24gPSBtYXBab21lRm48UmVhZFBhcmFtcywgUHJvY2Vzc1NwZWNpZmljYXRpb25SZXNwb25zZT4oZG5hQ29uZmlnLCBjb25kdWN0b3JVcmksICdjb21iaW5lZCcsICdwcm9jZXNzX3NwZWNpZmljYXRpb24nLCAnZ2V0X3Byb2Nlc3Nfc3BlY2lmaWNhdGlvbicpXG4gIGNvbnN0IHJlYWRBY3Rpb24gPSBtYXBab21lRm48QnlJZCwgQWN0aW9uPihkbmFDb25maWcsIGNvbmR1Y3RvclVyaSwgJ2NvbWJpbmVkJywgJ2FjdGlvbicsICdnZXRfYWN0aW9uJylcbiAgY29uc3QgcmVhZFBsYW4gPSBwbGFuUXVlcmllcyhkbmFDb25maWcsIGNvbmR1Y3RvclVyaSlbJ3BsYW4nXVxuICBjb25zdCByZWFkQWdlbnQgPSBhZ2VudFF1ZXJpZXMoZG5hQ29uZmlnLCBjb25kdWN0b3JVcmkpWydhZ2VudCddXG4gIGNvbnN0IHJlYWRBZ3JlZW1lbnQgPSBhZ3JlZW1lbnRRdWVyaWVzKGRuYUNvbmZpZywgY29uZHVjdG9yVXJpKVsnYWdyZWVtZW50J11cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAoaGFzRnVsZmlsbG1lbnQgPyB7XG4gICAgICBmdWxmaWxsZWRCeTogYXN5bmMgKHJlY29yZDogQ29tbWl0bWVudCk6IFByb21pc2U8RnVsZmlsbG1lbnRbXT4gPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcmVhZEZ1bGZpbGxtZW50cyh7IHBhcmFtczogeyBmdWxmaWxsczogcmVjb3JkLmlkIH0gfSlcbiAgICAgICAgcmV0dXJuIGV4dHJhY3RFZGdlcyhyZXN1bHRzKVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNTYXRpc2ZhY3Rpb24gPyB7XG4gICAgICBzYXRpc2ZpZXM6IGFzeW5jIChyZWNvcmQ6IENvbW1pdG1lbnQpOiBQcm9taXNlPFNhdGlzZmFjdGlvbltdPiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCByZWFkU2F0aXNmYWN0aW9ucyh7IHBhcmFtczogeyBzYXRpc2ZpZWRCeTogcmVjb3JkLmlkIH0gfSlcbiAgICAgICAgcmV0dXJuIGV4dHJhY3RFZGdlcyhyZXN1bHRzKVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNBZ2VudCA/IHtcbiAgICAgIHByb3ZpZGVySWQ6IGFzeW5jIChyZWNvcmQ6IENvbW1pdG1lbnQpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnByb3ZpZGVyID8gcmVjb3JkLnByb3ZpZGVyIDogbnVsbFxuICAgICAgfSxcblxuICAgICAgcHJvdmlkZXI6IGFzeW5jIChyZWNvcmQ6IENvbW1pdG1lbnQpOiBQcm9taXNlPEFnZW50PiA9PiB7XG4gICAgICAgIHJldHVybiByZWFkQWdlbnQocmVjb3JkLCB7IGlkOiByZWNvcmQucHJvdmlkZXIgfSlcbiAgICAgIH0sXG5cbiAgICAgIHJlY2VpdmVySWQ6IGFzeW5jIChyZWNvcmQ6IENvbW1pdG1lbnQpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICByZXR1cm4gcmVjb3JkLnJlY2VpdmVyID8gcmVjb3JkLnJlY2VpdmVyIDogbnVsbFxuICAgICAgfSxcblxuICAgICAgcmVjZWl2ZXI6IGFzeW5jIChyZWNvcmQ6IENvbW1pdG1lbnQpOiBQcm9taXNlPEFnZW50PiA9PiB7XG4gICAgICAgIHJldHVybiByZWFkQWdlbnQocmVjb3JkLCB7IGlkOiByZWNvcmQucmVjZWl2ZXIgfSlcbiAgICAgIH0sXG4gICAgICBpblNjb3BlT2Y6IGFzeW5jIChyZWNvcmQ6IHsgaW5TY29wZU9mOiBBZ2VudEFkZHJlc3NbXSB9KTogUHJvbWlzZTxBY2NvdW50aW5nU2NvcGVbXT4gPT4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKChyZWNvcmQuaW5TY29wZU9mIHx8IFtdKS5tYXAoKGFkZHJlc3MpPT5yZWFkQWdlbnQocmVjb3JkLCB7YWRkcmVzc30pKSkpXG4gICAgICB9LFxuICAgICAgaW52b2x2ZWRBZ2VudHM6IGFzeW5jIChyZWNvcmQ6IHsgaW52b2x2ZWRBZ2VudHM6IEFnZW50QWRkcmVzc1tdIH0pOiBQcm9taXNlPEFnZW50W10+ID0+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBQcm9taXNlLmFsbCgocmVjb3JkLmludm9sdmVkQWdlbnRzIHx8IFtdKS5tYXAoKGFkZHJlc3MpPT5yZWFkQWdlbnQocmVjb3JkLCB7YWRkcmVzc30pKSkpXG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgKGhhc1Byb2Nlc3MgPyB7XG4gICAgICBpbnB1dE9mOiBhc3luYyAocmVjb3JkOiBDb21taXRtZW50KTogUHJvbWlzZTxQcm9jZXNzIHwgbnVsbD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCByZWFkUHJvY2Vzc2VzKHsgcGFyYW1zOiB7IGNvbW1pdHRlZElucHV0czogcmVjb3JkLmlkIH0gfSlcbiAgICAgICAgICBjb25zb2xlLmxvZyhcImlucHV0T2ZcIiwgcmVzdWx0cylcbiAgICAgICAgICByZXR1cm4gcmVzdWx0cy5lZGdlcy5wb3AoKSFbJ25vZGUnXVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgaW5wdXRPZiBmb3IgQ29tbWl0bWVudCAke3JlY29yZC5pZH1gLCBlKVxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIG91dHB1dE9mOiBhc3luYyAocmVjb3JkOiBDb21taXRtZW50KTogUHJvbWlzZTxQcm9jZXNzIHwgbnVsbD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCByZWFkUHJvY2Vzc2VzKHsgcGFyYW1zOiB7IGNvbW1pdHRlZE91dHB1dHM6IHJlY29yZC5pZCB9IH0pXG4gICAgICAgICAgY29uc29sZS5sb2coXCJvdXRwdXRPZlwiLCByZXN1bHRzKVxuICAgICAgICAgIHJldHVybiByZXN1bHRzLmVkZ2VzLnBvcCgpIVsnbm9kZSddXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBmZXRjaGluZyBvdXRwdXRPZiBmb3IgQ29tbWl0bWVudCAke3JlY29yZC5pZH1gLCBlKVxuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICAoaGFzUmVzb3VyY2VTcGVjaWZpY2F0aW9uID8ge1xuICAgICAgcmVzb3VyY2VDb25mb3Jtc1RvOiBhc3luYyAocmVjb3JkOiB7IHJlc291cmNlQ29uZm9ybXNUbzogUmVzb3VyY2VTcGVjaWZpY2F0aW9uQWRkcmVzcyB9KTogUHJvbWlzZTxSZXNvdXJjZVNwZWNpZmljYXRpb24+ID0+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCByZWFkUmVzb3VyY2VTcGVjaWZpY2F0aW9uKHsgYWRkcmVzczogcmVjb3JkLnJlc291cmNlQ29uZm9ybXNUbyB9KSkucmVzb3VyY2VTcGVjaWZpY2F0aW9uXG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgKGhhc1Byb2Nlc3NTcGVjaWZpY2F0aW9uID8ge1xuICAgICAgc3RhZ2VJZDogYXN5bmMgKHJlY29yZDogQ29tbWl0bWVudCk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIHJldHVybiByZWNvcmQuc3RhZ2UgPyByZWNvcmQuc3RhZ2UgOiBcInVuZGVmaW5lZFwiXG4gICAgICB9LFxuICAgICAgc3RhZ2U6IGFzeW5jIChyZWNvcmQ6IHsgc3RhZ2U6IFByb2Nlc3NTcGVjaWZpY2F0aW9uQWRkcmVzcyB9KTogUHJvbWlzZTxQcm9jZXNzU3BlY2lmaWNhdGlvbiB8IHt9PiA9PiB7XG4gICAgICAgIHJldHVybiByZWNvcmQuc3RhZ2UgPyAoYXdhaXQgcmVhZFByb2Nlc3NTcGVjaWZpY2F0aW9uKHsgYWRkcmVzczogcmVjb3JkLnN0YWdlIH0pKS5wcm9jZXNzU3BlY2lmaWNhdGlvbiA6IHt9XG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgKGhhc0FjdGlvbiA/IHtcbiAgICAgIGFjdGlvbjogYXN5bmMgKHJlY29yZDogeyBhY3Rpb246IEFkZHJlc3NhYmxlSWRlbnRpZmllciB9KTogUHJvbWlzZTxBY3Rpb24+ID0+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCByZWFkQWN0aW9uKHsgaWQ6IHJlY29yZC5hY3Rpb24gfSkpXG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgKGhhc0FncmVlbWVudCA/IHtcbiAgICAgIGNsYXVzZU9mOiBhc3luYyAocmVjb3JkOiBDb21taXRtZW50KTogUHJvbWlzZTxNYXliZTxBZ3JlZW1lbnQ+PiA9PiB7XG4gICAgICAgIGlmICghcmVjb3JkLmNsYXVzZU9mKSB7IHJldHVybiBudWxsIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgcmVhZEFncmVlbWVudChyZWNvcmQsIHsgaWQ6IHJlY29yZC5jbGF1c2VPZiB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgZmV0Y2hpbmcgY2xhdXNlT2YgZm9yIENvbW1pdG1lbnQgJHtyZWNvcmQuaWR9YCwgZSlcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgKGhhc1BsYW4gPyB7XG4gICAgICBpbmRlcGVuZGVudERlbWFuZE9mOiBhc3luYyAocmVjb3JkOiBDb21taXRtZW50KTogUHJvbWlzZTxQbGFuPiA9PiB7XG4gICAgICAgIHJldHVybiByZWFkUGxhbihyZWNvcmQsIHsgaWQ6IHJlY29yZC5pbmRlcGVuZGVudERlbWFuZE9mIH0pXG4gICAgICB9LFxuICAgICAgcGxhbm5lZFdpdGhpbjogYXN5bmMgKHJlY29yZDogQ29tbWl0bWVudCk6IFByb21pc2U8UGxhbj4gPT4ge1xuICAgICAgICByZXR1cm4gcmVhZFBsYW4ocmVjb3JkLCB7IGlkOiByZWNvcmQucGxhbm5lZFdpdGhpbiB9KVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNPYnNlcnZhdGlvbiA/IHtcbiAgICAgIHJlc291cmNlSW52ZW50b3JpZWRBczogYXN5bmMgKHJlY29yZDogQ29tbWl0bWVudCk6IFByb21pc2U8RWNvbm9taWNSZXNvdXJjZT4gPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc29sdmVyIHVuaW1wbGVtZW50ZWQnKVxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIChoYXNIaXN0b3J5ID8ge1xuICAgICAgcmV2aXNpb246IGFzeW5jIChyZWNvcmQ6IENvbW1pdG1lbnQsIGFyZ3M6IHsgcmV2aXNpb25JZDogQWRkcmVzc2FibGVJZGVudGlmaWVyIH0pOiBQcm9taXNlPENvbW1pdG1lbnQ+ID0+IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCByZWFkUmV2aXNpb24oYXJncykpLmNvbW1pdG1lbnRcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgKVxufVxuIl19