@indexnetwork/protocol 3.6.3 → 3.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +90 -26
  2. package/dist/agent/tests/fakes.d.ts.map +1 -1
  3. package/dist/agent/tests/fakes.js.map +1 -1
  4. package/dist/chat/chat.agent.d.ts.map +1 -1
  5. package/dist/chat/chat.agent.js +3 -3
  6. package/dist/chat/chat.agent.js.map +1 -1
  7. package/dist/chat/chat.streamer.d.ts.map +1 -1
  8. package/dist/chat/chat.streamer.js +1 -1
  9. package/dist/chat/chat.streamer.js.map +1 -1
  10. package/dist/chat/chat.summarizer.d.ts.map +1 -1
  11. package/dist/chat/chat.summarizer.js +1 -1
  12. package/dist/chat/chat.summarizer.js.map +1 -1
  13. package/dist/chat/tests/chat.graph.mocks.d.ts.map +1 -1
  14. package/dist/chat/tests/chat.graph.mocks.js +0 -1
  15. package/dist/chat/tests/chat.graph.mocks.js.map +1 -1
  16. package/dist/index.d.ts +21 -21
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +10 -10
  19. package/dist/index.js.map +1 -1
  20. package/dist/intent/intent.graph.js +1 -1
  21. package/dist/intent/intent.graph.js.map +1 -1
  22. package/dist/maintenance/maintenance.graph.d.ts.map +1 -1
  23. package/dist/maintenance/maintenance.graph.js +1 -1
  24. package/dist/maintenance/maintenance.graph.js.map +1 -1
  25. package/dist/negotiation/negotiation.agent.d.ts.map +1 -1
  26. package/dist/negotiation/negotiation.agent.js +1 -1
  27. package/dist/negotiation/negotiation.agent.js.map +1 -1
  28. package/dist/negotiation/negotiation.summarizer.d.ts.map +1 -1
  29. package/dist/negotiation/negotiation.summarizer.js +1 -1
  30. package/dist/negotiation/negotiation.summarizer.js.map +1 -1
  31. package/dist/network/indexer/indexer.graph.d.ts.map +1 -1
  32. package/dist/network/indexer/indexer.graph.js +2 -2
  33. package/dist/network/indexer/indexer.graph.js.map +1 -1
  34. package/dist/opportunity/discovery-question.helper.d.ts.map +1 -1
  35. package/dist/opportunity/discovery-question.helper.js.map +1 -1
  36. package/dist/opportunity/feed/feed.graph.d.ts.map +1 -1
  37. package/dist/opportunity/feed/feed.graph.js +1 -1
  38. package/dist/opportunity/feed/feed.graph.js.map +1 -1
  39. package/dist/opportunity/negotiation-summary.builder.d.ts.map +1 -1
  40. package/dist/opportunity/negotiation-summary.builder.js.map +1 -1
  41. package/dist/opportunity/opportunity.discover.d.ts.map +1 -1
  42. package/dist/opportunity/opportunity.discover.js +1 -1
  43. package/dist/opportunity/opportunity.discover.js.map +1 -1
  44. package/dist/opportunity/opportunity.enricher.d.ts.map +1 -1
  45. package/dist/opportunity/opportunity.enricher.js.map +1 -1
  46. package/dist/opportunity/opportunity.graph.d.ts.map +1 -1
  47. package/dist/opportunity/opportunity.graph.js +5 -5
  48. package/dist/opportunity/opportunity.graph.js.map +1 -1
  49. package/dist/opportunity/opportunity.persist.d.ts.map +1 -1
  50. package/dist/opportunity/opportunity.persist.js.map +1 -1
  51. package/dist/opportunity/opportunity.presentation.d.ts +9 -0
  52. package/dist/opportunity/opportunity.presentation.d.ts.map +1 -1
  53. package/dist/opportunity/opportunity.presentation.js +23 -0
  54. package/dist/opportunity/opportunity.presentation.js.map +1 -1
  55. package/dist/opportunity/opportunity.presenter.d.ts.map +1 -1
  56. package/dist/opportunity/opportunity.presenter.js +9 -3
  57. package/dist/opportunity/opportunity.presenter.js.map +1 -1
  58. package/dist/opportunity/question.generator.d.ts.map +1 -1
  59. package/dist/opportunity/question.generator.js +2 -2
  60. package/dist/opportunity/question.generator.js.map +1 -1
  61. package/dist/premise/premise.graph.d.ts.map +1 -1
  62. package/dist/premise/premise.graph.js +1 -1
  63. package/dist/premise/premise.graph.js.map +1 -1
  64. package/dist/profile/profile.graph.js +1 -1
  65. package/dist/profile/profile.graph.js.map +1 -1
  66. package/dist/questioner/questioner.agent.d.ts.map +1 -1
  67. package/dist/questioner/questioner.agent.js +1 -1
  68. package/dist/questioner/questioner.agent.js.map +1 -1
  69. package/dist/questioner/questioner.presets.d.ts.map +1 -1
  70. package/dist/questioner/questioner.presets.js +1 -1
  71. package/dist/questioner/questioner.presets.js.map +1 -1
  72. package/dist/shared/agent/response.streamer.d.ts.map +1 -1
  73. package/dist/shared/agent/response.streamer.js +1 -1
  74. package/dist/shared/agent/response.streamer.js.map +1 -1
  75. package/dist/shared/agent/tool.factory.d.ts.map +1 -1
  76. package/dist/shared/agent/tool.factory.js +1 -1
  77. package/dist/shared/agent/tool.factory.js.map +1 -1
  78. package/dist/shared/agent/tool.helpers.d.ts.map +1 -1
  79. package/dist/shared/agent/tool.helpers.js.map +1 -1
  80. package/dist/shared/assignment/network-assignment.policy.d.ts.map +1 -1
  81. package/dist/shared/assignment/network-assignment.policy.js.map +1 -1
  82. package/dist/shared/interfaces/questioner.interface.d.ts.map +1 -1
  83. package/dist/shared/interfaces/questioner.interface.js.map +1 -1
  84. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"opportunity.graph.js","sourceRoot":"/","sources":["opportunity/opportunity.graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAc,MAAM,sBAAsB,CAAC;AAG1E,OAAO,EACL,qBAAqB,GAQtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,oBAAoB,GAKrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AA4BzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAyD,MAAM,qCAAqC,CAAC;AACjI,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7F,OAAO,EAAE,KAAK,EAAE,MAAM,wCAAwC,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAE5E,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,GAAG,cAAc,CAAC,kBAAkB,CAAC,CAAC;AAElD,+JAA+J;AAC/J,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvC,8GAA8G;AAC9G,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAElD,oDAAoD;AACpD,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAE1C,qGAAqG;AACrG,SAAS,8BAA8B;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;IACvD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,sCAAsC,CAAC;IAC1F,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAAC;AAClG,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAyB;IAC1D,OAAO;QACL,SAAS,CAAC,eAAe;QACzB,SAAS,CAAC,SAAS;QACnB,SAAS,CAAC,iBAAiB,IAAI,SAAS,CAAC,kBAAkB,IAAI,SAAS,CAAC,eAAe,IAAI,SAAS;KACtG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAiBD;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA6C,EAC7C,OAAoC;IAEpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;QACjC,IAAI,QAAQ,EAAE,IAAI,IAAI,QAAQ,EAAE,GAAG,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,0EAA0E;QAC1E,4DAA4D;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,oBAAoB,CACjC,QAA2B,EAC3B,QAAsD;IAEtD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChH,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAA4B,CAAC;QACrE,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAuD,CAAC;QAChF,IAAI,SAAS,EAAE,SAAS,KAAK,KAAK;YAAE,SAAS;QAC7C,QAAQ,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAC;YACnC,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,WAAW;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;SACjC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAClC,YACU,QAAkC,EAClC,QAAkB,EAClB,aAMP,EACO,iBAA4C,EAC5C,iBAAkD,EAClD,gBAAuC;IAC/C;;;;OAIG;IACK,eAA2D;IACnE;;;;OAIG;IACK,sBAAiF;QAvBjF,aAAQ,GAAR,QAAQ,CAA0B;QAClC,aAAQ,GAAR,QAAQ,CAAU;QAClB,kBAAa,GAAb,aAAa,CAMpB;QACO,sBAAiB,GAAjB,iBAAiB,CAA2B;QAC5C,sBAAiB,GAAjB,iBAAiB,CAAiC;QAClD,qBAAgB,GAAhB,gBAAgB,CAAuB;QAMvC,oBAAe,GAAf,eAAe,CAA4C;QAM3D,2BAAsB,GAAtB,sBAAsB,CAA2D;IACxF,CAAC;IAEG,WAAW;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,oBAAoB,EAAE,CAAC;QAE5E,kEAAkE;QAClE,mBAAmB;QACnB,kEAAkE;QAElE;;;;;;WAMG;QACH,SAAS,aAAa,CACpB,SAAiB,EACjB,MAAgC,EAChC,SAA6C;YAE7C,OAAO,KAAK,EAAE,KAAQ,EAAE,EAAE;gBACxB,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;gBAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;gBACzD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;oBACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAC1C,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;oBACjD,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC5E,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAC1C,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAChE,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC,CAAC;oBAChG,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;QAED;;;;WAIG;QACH,MAAM,QAAQ,GAAG,aAAa,CAC5B,kBAAkB,EAClB,KAAK,EAAE,KAAyC,EAAE,EAAE,CACpD,KAAK,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE,CACxC,eAAe,CACb,MAAM,EACN,uBAAuB,EACvB;YACE,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW;YACnC,gBAAgB,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS;SAC/C,EACD,KAAK,IAAI,EAAE;YACT,qFAAqF;YACrF,iFAAiF;YACjF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC5E,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAqB,CAAC;YAC7E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,0EAA0E,CAAC,CAAC;gBAC3F,OAAO;oBACL,YAAY,EAAE,EAAsB;oBACpC,aAAa,EAAE,IAAI;oBACnB,KAAK,EAAE,8DAA8D;iBACtE,CAAC;YACJ,CAAC;YACD,MAAM,eAAe,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC;YAC/D,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,eAAe,CAAC;gBAC/C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC;aAC1C,CAAC,CAAC;YACH,MAAM,cAAc,GAAoB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAoB,EAAE,EAAE,CAAC,CAAC;gBAC7E,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;gBACpC,OAAO,EAAE,EAAE;aACZ,CAAC,CAAC,CAAC;YACJ,MAAM,aAAa,GAAG,OAAO;gBAC3B,CAAC,CAAC;oBACE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS;oBACvC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS;oBACzC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,SAAS;iBAC5C;gBACH,CAAC,CAAC,IAAI,CAAC;YACT,0EAA0E;YAC1E,uEAAuE;YACvE,mEAAmE;YACnE,2EAA2E;YAC3E,MAAM,cAAc,GAA8D,EAAE,CAAC;YACrF,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;YAC/E,MAAM,WAAW,GAAG,sBAAsB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,KAAK,UAAU;gBAC/F,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC;gBACtD,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,cAAc,GAAG,WAAW;iBAC/B,MAAM,CAAC,CAAC,CAAgE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,SAA2B,CAAC,CAAC;iBAC7K,GAAG,CAAC,CAAC,CAAgE,EAAE,EAAE,CAAC,CAAC;gBAC1E,SAAS,EAAE,CAAC,CAAC,EAAE;gBACf,SAAS,EAAE,CAAC,CAAC,SAA2B;gBACxC,SAAS,EAAE,CAAC,CAAC,SAAU;aACxB,CAAC,CAAC,CAAC;YACN,OAAO;gBACL,YAAY,EAAE,cAAc;gBAC5B,cAAc;gBACd,aAAa;gBACb,cAAc;gBACd,cAAc;gBACd,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,MAAM;wBACZ,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,gBAAgB,OAAO,CAAC,MAAM,2CAA2C,cAAc,CAAC,MAAM,gBAAgB,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,EAAE;qBAC1L,CAAC;aACH,CAAC;QACJ,CAAC,EACD,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CACvD,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChB,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtE,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/C,OAAO;gBACL,KAAK,EAAE,yDAAyD;gBAChE,KAAK,EAAE,CAAC;wBACN,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,gBAAgB,MAAM,EAAE;wBAChC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;qBACxB,CAAC;aACH,CAAC;QACJ,CAAC,CAAC,CACH,EACD,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,CAAC,GAAG,MAAiC,CAAC;YAC5C,IAAI,CAAC,EAAE,KAAK;gBAAE,OAAO,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,CAAC,EAAE,YAAyB,CAAC;YAC7C,MAAM,OAAO,GAAG,CAAC,EAAE,cAA2B,CAAC;YAC/C,OAAO,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QACrG,CAAC,CACF,CAAC;QAEF;;;;;WAKG;QACH,MAAM,SAAS,GAAG,aAAa,CAC7B,mBAAmB,EACnB,KAAK,EAAE,KAAyC,EAAE,EAAE;YACpD,OAAO,KAAK,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;gBAChD,MAAM,CAAC,OAAO,CAAC,wCAAwC,EAAE;oBACvD,gBAAgB,EAAE,KAAK,CAAC,SAAS;oBACjC,iBAAiB,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM;iBAC7C,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,IAAI,cAAgC,CAAC;oBAErC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;wBACpB,wDAAwD;wBACxD,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBAC/D,MAAM,OAAO,GAAG,CAAC,SAAS,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;wBAC9F,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;4BAC3B,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE;gCAChE,SAAS,EAAE,KAAK,CAAC,SAAS;6BAC3B,CAAC,CAAC;4BACH,OAAO;gCACL,cAAc,EAAE,EAAE;gCAClB,KAAK,EAAE,uCAAuC;6BAC/C,CAAC;wBACJ,CAAC;wBACD,cAAc,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACrC,CAAC;yBAAM,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC3D,mEAAmE;wBACnE,kEAAkE;wBAClE,oDAAoD;wBACpD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBAC1C,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBAClE,MAAM,CAAC,OAAO,CAAC,+CAA+C,EAAE;4BAC9D,eAAe,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;4BACxC,iBAAiB,EAAE,KAAK,CAAC,YAAY,CAAC,MAAM;4BAC5C,WAAW,EAAE,cAAc,CAAC,MAAM;yBACnC,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,4BAA4B;wBAC5B,cAAc,GAAG,KAAK,CAAC,YAAY,CAAC;oBACtC,CAAC;oBAED,sBAAsB;oBACtB,MAAM,cAAc,GAAoB,MAAM,OAAO,CAAC,GAAG,CACvD,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;wBACrC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;wBACxD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;wBACzE,OAAO;4BACL,SAAS;4BACT,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,SAAS;4BAChC,WAAW;yBACZ,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBAEF,MAAM,CAAC,OAAO,CAAC,gCAAgC,EAAE;wBAC/C,kBAAkB,EAAE,cAAc,CAAC,MAAM;wBACzC,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;qBAC1C,CAAC,CAAC;oBAEH,+DAA+D;oBAC/D,IAAI,oBAAoB,GAA2B,EAAE,CAAC;oBAEtD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;wBAC1B,gEAAgE;wBAChE,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;4BAC/E,KAAK,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,MAAM,EAAE,CAAC;gCACnD,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;oCAC3B,oBAAoB,CAAC,SAAS,CAAC,GAAG,cAAc,CAAC;gCACnD,CAAC;4BACH,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;wBAC1H,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;wBACrC,4DAA4D;wBAC5D,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;4BACpC,MAAM,iBAAiB,GAAqB,EAAE,CAAC;4BAC/C,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;4BAC5E,MAAM,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gCACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;gCACpF,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;oCAC5D,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gCACjD,CAAC;gCACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gCACjC,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;gCAC7D,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;gCAChE,IAAI,MAAM,GAAsD,IAAI,CAAC;gCACrE,IAAI,CAAC;oCACH,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAC3B,KAAK,CAAC,WAAY,EAClB,GAAG,EAAE,WAAW,IAAI,IAAI,EACxB,GAAG,EAAE,YAAY,IAAI,IAAI,CAC1B,CAAC;gCACJ,CAAC;gCAAC,MAAM,CAAC;oCACP,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gCACjD,CAAC;wCAAS,CAAC;oCACT,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC;oCACpD,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;oCACrI,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;gCACnF,CAAC;gCACD,IAAI,CAAC,MAAM;oCAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gCAC5D,MAAM,KAAK,GAAG,GAAG,EAAE,WAAW,IAAI,GAAG,EAAE,YAAY;oCACjD,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,GAAG,MAAM,CAAC,WAAW,GAAG,GAAG;oCACpD,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gCAC9D,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;4BAC5C,CAAC,CAAC,CAAC;4BACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;4BACnD,KAAK,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;gCAC3C,oBAAoB,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;4BAC1C,CAAC;4BACD,8CAA8C;4BAC9C,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACjC,OAAO;oCACL,cAAc;oCACd,oBAAoB;oCACpB,YAAY,EAAE,iBAAiB;oCAC/B,KAAK,EAAE,CAAC;4CACN,IAAI,EAAE,OAAO;4CACb,MAAM,EAAE,aAAa,cAAc,CAAC,MAAM,eAAe,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;4CAC9H,IAAI,EAAE,EAAE,YAAY,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE;yCAClF,CAAC;iCACH,CAAC;4BACJ,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,CAAC,qDAAqD,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;wBACrF,CAAC;oBACH,CAAC;oBAED,MAAM,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;oBAC/E,OAAO;wBACL,cAAc;wBACd,oBAAoB;wBACpB,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,OAAO;gCACb,MAAM,EAAE,aAAa,cAAc,CAAC,MAAM,eAAe,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gCAC9H,IAAI,EAAE,EAAE,YAAY,EAAE;6BACvB,CAAC;qBACH,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtE,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBAChD,OAAO;wBACL,cAAc,EAAE,EAAE;wBAClB,KAAK,EAAE,mCAAmC;wBAC1C,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,aAAa;gCACnB,MAAM,EAAE,iBAAiB,MAAM,EAAE;gCACjC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;6BACxB,CAAC;qBACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EACC,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,CAAC,GAAG,MAAiC,CAAC;YAC5C,IAAI,CAAC,EAAE,KAAK;gBAAE,OAAO,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,CAAC,EAAE,cAA2B,CAAC;YAC/C,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;QACtE,CAAC,CACF,CAAC;QAEF;;;;WAIG;QACH,MAAM,WAAW,GAAG,aAAa,CAC/B,qBAAqB,EACrB,KAAK,EAAE,KAAyC,EAAE,EAAE;YACpD,OAAO,KAAK,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;gBAClD,MAAM,CAAC,OAAO,CAAC,uDAAuD,EAAE;oBACtE,eAAe,EAAE,KAAK,CAAC,eAAe;oBACtC,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW;oBACnC,mBAAmB,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM;iBACjD,CAAC,CAAC;gBAEH,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAEpE,IAAI,CAAC;oBACH,IAAI,gBAA2C,CAAC;oBAChD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;wBAC1B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;wBACpF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAoB,CAAC,CAAC,CAAC;wBACvF,gBAAgB,GAAG,KAAK,CAAC,eAAe,CAAC;wBACzC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;wBACvC,MAAM,eAAe,GAAG,qBAAqB,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,SAAmB,CAAC;wBAC3F,OAAO;4BACL,uBAAuB,EAAE,gBAAgB;4BACzC,qBAAqB;4BACrB,eAAe;yBAChB,CAAC;oBACJ,CAAC;oBAED,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACjE,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;wBACjD,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;wBACvF,IAAI,OAAO,EAAE,CAAC;4BACZ,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;4BACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;4BAC/E,MAAM,qBAAqB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAoB,CAAC,CAAC,CAAC;4BACpG,MAAM,eAAe,GAAG,qBAAqB,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,SAAmB,CAAC;4BAC3F,OAAO;gCACL,uBAAuB,EAAE,gBAAgB;gCACzC,qBAAqB;gCACrB,eAAe;6BAChB,CAAC;wBACJ,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,gFAAgF,EAAE;4BAC5F,WAAW,EAAE,KAAK,CAAC,WAAW;4BAC9B,mBAAmB,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM;yBACjD,CAAC,CAAC;oBACL,CAAC;oBAED,OAAO;wBACL,uBAAuB,EAAE,SAAS;wBAClC,qBAAqB,EAAE,KAAK;wBAC5B,eAAe,EAAE,SAAkB;qBACpC,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAChE,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;wBACrC,eAAe,EAAE,KAAK,CAAC,eAAe;wBACtC,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC9B,KAAK,EAAE,GAAG;qBACX,CAAC,CAAC;oBACH,OAAO;wBACL,uBAAuB,EAAE,SAAS;wBAClC,qBAAqB,EAAE,KAAK;wBAC5B,eAAe,EAAE,SAAkB;wBACnC,KAAK,EAAE,MAAM,IAAI,gBAAgB;wBACjC,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,eAAe;gCACrB,MAAM,EAAE,mBAAmB,MAAM,EAAE;gCACnC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;6BACxB,CAAC;qBACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EACC,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,CAAC,GAAG,MAAiC,CAAC;YAC5C,IAAI,CAAC,EAAE,KAAK;gBAAE,OAAO,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;YACzC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,CAAC,CACF,CAAC;QAEF;;;WAGG;QACH,MAAM,aAAa,GAAG,aAAa,CACjC,uBAAuB,EACvB,KAAK,EAAE,KAAyC,EAAE,EAAE;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC;YAClB,OAAO,KAAK,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;gBACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,eAAe,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC;gBAE/D,2EAA2E;gBAC3E,MAAM,cAAc,GAAG,CAAC,UAA4B,EAAoB,EAAE;oBACxE,IAAI,CAAC,KAAK,CAAC,YAAY;wBAAE,OAAO,UAAU,CAAC;oBAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,KAAK,CAAC,YAAY,CAAC,CAAC;oBAClF,MAAM,CAAC,OAAO,CAAC,+CAA+C,EAAE;wBAC9D,YAAY,EAAE,KAAK,CAAC,YAAY;wBAChC,MAAM,EAAE,UAAU,CAAC,MAAM;wBACzB,KAAK,EAAE,QAAQ,CAAC,MAAM;qBACvB,CAAC,CAAC;oBACH,OAAO,QAAQ,CAAC;gBAClB,CAAC,CAAC;gBAEF,uFAAuF;gBACvF,IAAI,kBAAqF,CAAC;gBAC1F,gFAAgF;gBAChF,IAAI,mBAA2I,CAAC;gBAEhJ,MAAM,CAAC,OAAO,CAAC,4CAA4C,EAAE;oBAC3D,kBAAkB,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM;oBAC/C,eAAe,EAAE,KAAK,CAAC,eAAe;oBACtC,kBAAkB,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,QAAQ;iBACvE,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACtC,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;wBAC9D,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;oBAC5B,CAAC;oBAED,oCAAoC;oBACpC,4EAA4E;oBAC5E,yDAAyD;oBACzD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;wBACvB,IAAI,KAAK,CAAC,YAAY,KAAK,eAAe,EAAE,CAAC;4BAC3C,MAAM,CAAC,IAAI,CAAC,oFAAoF,EAAE;gCAChG,YAAY,EAAE,KAAK,CAAC,YAAY;6BACjC,CAAC,CAAC;4BACH,OAAO;gCACL,UAAU,EAAE,EAAE;gCACd,KAAK,EAAE,CAAC;wCACN,IAAI,EAAE,WAAW;wCACjB,MAAM,EAAE,sDAAsD;wCAC9D,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE;qCAC3C,CAAC;6BACH,CAAC;wBACJ,CAAC;wBACD,MAAM,CAAC,OAAO,CAAC,oEAAoE,EAAE;4BACnF,YAAY,EAAE,KAAK,CAAC,YAAY;yBACjC,CAAC,CAAC;wBACH,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;wBACxF,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;wBACnE,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc;6BACxC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;6BACvD,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;wBAE3B,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAChC,MAAM,CAAC,IAAI,CAAC,iEAAiE,EAAE;gCAC7E,YAAY,EAAE,KAAK,CAAC,YAAY;gCAChC,iBAAiB,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC;6BAChE,CAAC,CAAC;4BACH,OAAO;gCACL,UAAU,EAAE,EAAE;gCACd,KAAK,EAAE,CAAC;wCACN,IAAI,EAAE,WAAW;wCACjB,MAAM,EAAE,kDAAkD;wCAC1D,IAAI,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE;qCAC3C,CAAC;6BACH,CAAC;wBACJ,CAAC;wBAED,sEAAsE;wBACtE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;wBAC/E,MAAM,gBAAgB,GAAqB,EAAE,CAAC;wBAE9C,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC7B,gEAAgE;4BAChE,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gCACnC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gCAC/E,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;gCAC/E,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;oCACpC,gBAAgB,CAAC,IAAI,CAAC,qBAAqB,CAAC;wCAC1C,eAAe,EAAE,KAAK,CAAC,YAAY;wCACnC,iBAAiB,EAAE,MAAM,CAAC,EAAmB;wCAC7C,SAAS;wCACT,UAAU,EAAE,GAAG;wCACf,IAAI,EAAE,kBAAkB;wCACxB,gBAAgB,EAAE,MAAM,CAAC,OAAO;wCAChC,gBAAgB,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;wCAC7C,eAAe,EAAE,OAAO;qCACzB,CAAC,CAAC,CAAC;gCACN,CAAC;4BACH,CAAC;wBACH,CAAC;wBAED,iFAAiF;wBACjF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;4BAClC,gBAAgB,CAAC,IAAI,CAAC,qBAAqB,CAAC;gCAC1C,eAAe,EAAE,KAAK,CAAC,YAAY;gCACnC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAmB;gCAC9C,UAAU,EAAE,GAAG;gCACf,IAAI,EAAE,kBAAkB;gCACxB,gBAAgB,EAAE,EAAE;gCACpB,gBAAgB,EAAE,SAAS;gCAC3B,eAAe,EAAE,OAAO;6BACzB,CAAC,CAAC,CAAC;wBACN,CAAC;wBAED,MAAM,CAAC,OAAO,CAAC,iDAAiD,EAAE;4BAChE,KAAK,EAAE,gBAAgB,CAAC,MAAM;4BAC9B,aAAa,EAAE,cAAc,CAAC,MAAM;4BACpC,aAAa,EAAE,aAAa,CAAC,MAAM;yBACpC,CAAC,CAAC;wBAEH,OAAO;4BACL,UAAU,EAAE,gBAAgB;4BAC5B,KAAK,EAAE,CAAC;oCACN,IAAI,EAAE,WAAW;oCACjB,MAAM,EAAE,uBAAuB,gBAAgB,CAAC,MAAM,sBAAsB,cAAc,CAAC,MAAM,mBAAmB;oCACpH,IAAI,EAAE;wCACJ,YAAY,EAAE,KAAK,CAAC,YAAY;wCAChC,cAAc,EAAE,gBAAgB,CAAC,MAAM;wCACvC,aAAa,EAAE,cAAc,CAAC,MAAM;wCACpC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;qCACnC;iCACF,CAAC;yBACH,CAAC;oBACJ,CAAC;oBAED,uDAAuD;oBACvD,6DAA6D;oBAC7D,MAAM,gBAAgB,GAAG,EAAE,CAAC;oBAC5B,MAAM,aAAa,GAAG,EAAE,CAAC;oBACzB,0DAA0D;oBAC1D,MAAM,QAAQ,GAAG,GAAG,CAAC;oBAErB,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;wBACxC,mFAAmF;wBACnF,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;4BAC9B,MAAM,CAAC,OAAO,CAAC,wFAAwF,EAAE;gCACvG,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;6BACvD,CAAC,CAAC;4BACH,MAAM,eAAe,GAAG,MAAM,qBAAqB,EAAE,CAAC;4BACtD,MAAM,CAAC,OAAO,CAAC,4CAA4C,EAAE,EAAE,eAAe,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC;4BAE1G,oCAAoC;4BACpC,MAAM,YAAY,GAA6E,EAAE,CAAC;4BAElG,yDAAyD;4BACzD,IAAI,kBAAkB,EAAE,CAAC;gCACvB,YAAY,CAAC,IAAI,CAAC;oCAChB,IAAI,EAAE,YAAY;oCAClB,MAAM,EAAE,oCAAoC;oCAC5C,IAAI,EAAE,kBAAkB;iCACzB,CAAC,CAAC;4BACL,CAAC;4BAED,6EAA6E;4BAC7E,IAAI,mBAAmB,EAAE,CAAC;gCACxB,IAAI,mBAAmB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oCAC1C,YAAY,CAAC,IAAI,CAAC;wCAChB,IAAI,EAAE,aAAa;wCACnB,MAAM,EAAE,YAAY,mBAAmB,CAAC,MAAM,CAAC,MAAM,cAAc,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;wCAC5H,IAAI,EAAE,EAAE,MAAM,EAAE,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE;qCAClF,CAAC,CAAC;gCACL,CAAC;gCACD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC;oCAC5E,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC;wCAClB,YAAY,CAAC,IAAI,CAAC;4CAChB,IAAI,EAAE,YAAY;4CAClB,MAAM,EAAE,IAAI,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG;4CAC5F,IAAI,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;yCACvG,CAAC,CAAC;oCACL,CAAC;gCACH,CAAC;4BACH,CAAC;4BAED,iDAAiD;4BACjD,MAAM,SAAS,GAA6D,EAAE,CAAC;4BAC/E,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;gCAChC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC;gCAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;oCAAE,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;gCACjE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;gCACrB,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,UAAU,CAAC;4BAC7C,CAAC;4BACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;gCACzC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;4BAC5F,CAAC;4BAED,YAAY,CAAC,IAAI,CAAC;gCAChB,IAAI,EAAE,WAAW;gCACjB,MAAM,EAAE,iBAAiB,eAAe,CAAC,MAAM,+BAA+B;gCAC9E,IAAI,EAAE;oCACJ,cAAc,EAAE,eAAe,CAAC,MAAM;oCACtC,MAAM,EAAE,SAAS;oCACjB,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;oCACnD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oCAClC,KAAK,EAAE,YAAY,CAAC,eAAe,CAAC;iCACrC;6BACF,CAAC,CAAC;4BAEH,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gCACrD,mBAAmB,EAAE;gCACrB,2BAA2B,EAAE;6BAC9B,CAAC,CAAC;4BACH,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,eAAe,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;4BACpG,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC5B,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,wBAAwB,YAAY,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;4BAC9G,CAAC;4BACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC5B,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,uBAAuB,YAAY,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;4BAC7G,CAAC;4BACD,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;wBACrF,CAAC;wBAED,qEAAqE;wBACrE,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;4BACrD,mBAAmB,EAAE;4BACrB,2BAA2B,EAAE;yBAC9B,CAAC,CAAC;wBACH,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACvD,MAAM,MAAM,GAAG,uBAAuB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;4BACnE,MAAM,YAAY,GAA6E,EAAE,CAAC;4BAClG,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC5B,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,wBAAwB,YAAY,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;4BAC9G,CAAC;4BACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC5B,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,uBAAuB,YAAY,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;4BAC7G,CAAC;4BACD,YAAY,CAAC,IAAI,CAAC;gCAChB,IAAI,EAAE,WAAW;gCACjB,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,oBAAoB,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,iBAAiB,YAAY,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,cAAc;6BAClO,CAAC,CAAC;4BACH,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;wBACrE,CAAC;wBACD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;oBAC5B,CAAC;oBAED,KAAK,UAAU,qBAAqB;wBAClC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;wBACnD,IAAI,CAAC,UAAU;4BAAE,OAAO,EAAE,CAAC;wBAC3B,MAAM,CAAC,OAAO,CAAC,+CAA+C,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;wBACzG,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;wBAC5F,kBAAkB,GAAG;4BACnB,cAAc,EAAE,iBAAiB;4BACjC,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC;yBACpC,CAAC;wBACF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;4BACjD,UAAU,EAAE,OAAO;4BACnB,UAAU,EAAE,UAAU;4BACtB,eAAe,EAAE,KAAK;4BACtB,cAAc,EAAE,iBAAiB;yBAClC,CAAC,CAAC;wBACH,MAAM,cAAc,GAAG,UAAU,CAAC,cAA0C,CAAC;wBAC7E,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;wBACvC,mBAAmB,GAAG;4BACpB,MAAM,EAAE,MAAkD;4BAC1D,aAAa,EAAE,CAAC,UAAU,CAAC,aAAa,IAAI,EAAE,CAA0C;yBACzF,CAAC;wBACF,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;wBACxE,MAAM,CAAC,OAAO,CAAC,yCAAyC,EAAE;4BACxD,SAAS,EAAE,aAAa,CAAC,MAAM;4BAC/B,MAAM,EAAE,aAAa;yBACtB,CAAC,CAAC;wBACH,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,EAAE,CAAC;wBAC3E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;wBACvD,MAAM,cAAc,GAAoB,EAAE,CAAC;wBAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;4BAC1D,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;gCAChB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gCAChC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;4BAC3F,CAAC;wBACH,CAAC;wBACD,MAAM,GAAG,GAAqB,EAAE,CAAC;wBACjC,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;4BAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,cAAc,EAAE;gCAC3E,UAAU,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;gCACnC,aAAa,EAAE,eAAe;gCAC9B,gBAAgB;gCAChB,KAAK,EAAE,aAAa;gCACpB,QAAQ;6BACT,CAAC,CAAC;4BACH,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;gCAC3D,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;oCAC7B,eAAe,EAAE,CAAC,CAAC,MAAqB;oCACxC,iBAAiB,EAAE,CAAC,CAAC,EAAmB;oCACxC,SAAS,EAAE,WAAW,CAAC,SAAS;oCAChC,UAAU,EAAE,CAAC,CAAC,KAAK;oCACnB,IAAI,EAAE,CAAC,CAAC,UAAU;oCAClB,gBAAgB,EAAE,EAAE;oCACpB,gBAAgB,EAAE,SAAS;oCAC3B,eAAe,EAAE,OAAgB;iCAClC,CAAC,CAAC,CAAC;4BACN,CAAC;4BACD,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;gCAC5D,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;oCAC7B,eAAe,EAAE,CAAC,CAAC,MAAqB;oCACxC,kBAAkB,EAAE,CAAC,CAAC,EAAoB;oCAC1C,SAAS,EAAE,WAAW,CAAC,SAAS;oCAChC,UAAU,EAAE,CAAC,CAAC,KAAK;oCACnB,IAAI,EAAE,CAAC,CAAC,UAAU;oCAClB,gBAAgB,EAAE,EAAE;oCACpB,gBAAgB,EAAE,SAAS;oCAC3B,eAAe,EAAE,OAAgB;iCAClC,CAAC,CAAC,CAAC;4BACN,CAAC;wBACH,CAAC,CAAC,CACH,CAAC;wBACF,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;wBAClE,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;wBACpE,MAAM,CAAC,OAAO,CAAC,wDAAwD,EAAE;4BACvE,KAAK,EAAE,GAAG,CAAC,MAAM;4BACjB,UAAU,EAAE,WAAW;4BACvB,WAAW,EAAE,YAAY;yBAC1B,CAAC,CAAC;wBACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;wBAChD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;4BACpB,yEAAyE;4BACzE,kFAAkF;4BAClF,MAAM,SAAS,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,CAAC;4BAC5G,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC;4BAChD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC;gCACxE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;4BACpB,CAAC;wBACH,CAAC;wBACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBACpC,CAAC;oBAED;;;;uBAIG;oBACH,KAAK,UAAU,mBAAmB;wBAChC,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;wBACpE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,EAAE,CAAC;wBAE7C,MAAM,WAAW,GAAG,8BAA8B,EAAE,CAAC;wBACrD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;4BACtB,MAAM,CAAC,OAAO,CAAC,oFAAoF,CAAC,CAAC;4BACrG,OAAO,EAAE,CAAC;wBACZ,CAAC;wBAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,4BAA4B;4BACrE,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,eAAe,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,CAAC;4BAC5G,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;wBACtE,MAAM,cAAc,GAAG,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC;4BACrD,CAAC,CAAC,oBAAoB;iCACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;iCACjE,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;iCACrB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAoB,EAAE,SAAS,EAAE,CAAC,CAAC,SAAU,EAAE,CAAC,CAAC;4BAC/E,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CACrD,CAAC;wBAEF,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,EAAE,CAAC;wBAE3C,MAAM,CAAC,OAAO,CAAC,6CAA6C,EAAE;4BAC5D,YAAY,EAAE,cAAc,CAAC,MAAM;4BACnC,WAAW;4BACX,cAAc,EAAE,gBAAgB,CAAC,MAAM;4BACvC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,+BAA+B;yBACzD,CAAC,CAAC;wBAEH,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,+BAA+B;4BAC9D,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CAAC;gCAClD,OAAO,EAAE,cAAc;gCACvB,UAAU,EAAE,gBAAgB;gCAC5B,aAAa,EAAE,eAAe;gCAC9B,cAAc,EAAE,8BAA8B;6BAC/C,CAAC;4BACJ,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAChB,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gCAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC;oCAC7D,SAAS,EAAE,EAAE,CAAC,SAAS;oCACvB,UAAU,EAAE,gBAAgB;oCAC5B,aAAa,EAAE,eAAe;oCAC9B,KAAK,EAAE,8BAA8B;iCACtC,CAAC,CAAC;gCACH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,eAAe,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;4BACvE,CAAC,CAAC,CACH,CAAC,CAAC,IAAI,EAAE,CAAC;wBAEd,MAAM,iBAAiB,GAAqB,EAAE,CAAC;wBAC/C,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;4BAC3B,iBAAiB,CAAC,IAAI,CAAC,qBAAqB,CAAC;gCAC3C,eAAe,EAAE,CAAC,CAAC,MAAqB;gCACxC,eAAe,EAAE,CAAC,CAAC,eAA6C;gCAChE,kBAAkB,EAAE,CAAC,CAAC,SAA2B;gCACjD,SAAS,EAAE,CAAC,CAAC,SAA2B;gCACxC,UAAU,EAAE,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;gCAC9F,IAAI,EAAE,eAAe;gCACrB,gBAAgB,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE;gCACvC,eAAe,EAAE,oBAAoB;6BACtC,CAAC,CAAC,CAAC;wBACN,CAAC;wBAED,sFAAsF;wBACtF,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;wBAChD,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;4BAClC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,kBAAkB,IAAI,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;4BACpF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC;gCACxE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;4BACpB,CAAC;wBACH,CAAC;wBACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC3C,MAAM,CAAC,OAAO,CAAC,gDAAgD,EAAE;4BAC/D,kBAAkB,EAAE,cAAc,CAAC,MAAM;4BACzC,QAAQ,EAAE,iBAAiB,CAAC,MAAM;4BAClC,YAAY,EAAE,OAAO,CAAC,MAAM;yBAC7B,CAAC,CAAC;wBACH,OAAO,OAAO,CAAC;oBACjB,CAAC;oBAED;;;;;uBAKG;oBACH,KAAK,UAAU,2BAA2B;wBACxC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM;4BAAE,OAAO,EAAE,CAAC;wBAC7C,MAAM,sBAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,GAAG,CAAC;wBAC/E,IAAI,CAAC,sBAAsB;4BAAE,OAAO,EAAE,CAAC;wBAEvC,MAAM,gBAAgB,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;wBACpE,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,EAAE,CAAC;wBAE7C,MAAM,CAAC,OAAO,CAAC,qDAAqD,EAAE;4BACpE,YAAY,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM;4BACzC,cAAc,EAAE,gBAAgB,CAAC,MAAM;yBACxC,CAAC,CAAC;wBAEH,MAAM,iBAAiB,GAAqB,EAAE,CAAC;wBAE/C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;4BAC3F,qCAAqC;4BACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;4BACzF,MAAM,cAAc,GAAoB,QAAQ;iCAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,CAAC;iCACxC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gCACT,IAAI,EAAE,CAAC,CAAC,QAAQ;gCAChB,MAAM,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAwC;gCAClJ,SAAS,EAAE,CAAC,CAAC,aAAa;6BAC3B,CAAC,CAAC,CAAC;4BAEN,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC9B,kFAAkF;gCAClF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,cAAc,EAAE;oCAC3E,UAAU,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;oCAC3B,aAAa,EAAE,eAAe;oCAC9B,gBAAgB,EAAE,gBAAgB;oCAClC,KAAK,EAAE,EAAE;oCACT,QAAQ;iCACT,CAAC,CAAC;gCACH,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;oCACzD,iBAAiB,CAAC,IAAI,CAAC,qBAAqB,CAAC;wCAC3C,eAAe,EAAE,CAAC,CAAC,MAAqB;wCACxC,iBAAiB,EAAE,CAAC,CAAC,EAAmB;wCACxC,eAAe,EAAE,GAAG,CAAC,SAAS;wCAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;wCACxB,UAAU,EAAE,CAAC,CAAC,KAAK;wCACnB,IAAI,EAAE,CAAC,CAAC,UAAU;wCAClB,gBAAgB,EAAE,EAAE;wCACpB,gBAAgB,EAAE,SAAS;wCAC3B,eAAe,EAAE,mBAAmB;qCACrC,CAAC,CAAC,CAAC;gCACN,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,4DAA4D;gCAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,+BAA+B,CAAC;oCAClE,SAAS,EAAE,GAAG,CAAC,SAAS;oCACxB,UAAU,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;oCAC3B,aAAa,EAAE,eAAe;oCAC9B,KAAK,EAAE,EAAE;oCACT,QAAQ,EAAE,QAAQ;iCACnB,CAAC,CAAC;gCACH,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oCACxB,iBAAiB,CAAC,IAAI,CAAC,qBAAqB,CAAC;wCAC3C,eAAe,EAAE,CAAC,CAAC,MAAqB;wCACxC,iBAAiB,EAAE,CAAC,CAAC,QAAyB;wCAC9C,eAAe,EAAE,GAAG,CAAC,SAAS;wCAC9B,SAAS,EAAE,CAAC,CAAC,SAA2B;wCACxC,UAAU,EAAE,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;wCAC9F,IAAI,EAAE,eAAe;wCACrB,gBAAgB,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;wCACjC,gBAAgB,EAAE,CAAC,CAAC,OAAO,IAAI,SAAS;wCACxC,eAAe,EAAE,mBAAmB;qCACrC,CAAC,CAAC,CAAC;gCACN,CAAC;4BACH,CAAC;wBACH,CAAC;wBAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;wBAChD,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;4BAClC,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,iBAAiB,IAAI,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;4BACnF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC;gCACxE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;4BACpB,CAAC;wBACH,CAAC;wBACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC3C,MAAM,CAAC,OAAO,CAAC,wDAAwD,EAAE;4BACvE,QAAQ,EAAE,iBAAiB,CAAC,MAAM;4BAClC,YAAY,EAAE,OAAO,CAAC,MAAM;yBAC7B,CAAC,CAAC;wBACH,OAAO,OAAO,CAAC;oBACjB,CAAC;oBAED;;;;;uBAKG;oBACH,SAAS,uBAAuB,CAAC,GAAG,MAA0B;wBAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyD,CAAC;wBAChF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;4BAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gCACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,kBAAkB,IAAI,MAAM,CAAC;gCACvE,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC;gCAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gCACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;oCACd,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;gCACpF,CAAC;qCAAM,CAAC;oCACN,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,CAAC;oCACzD,MAAM,cAAc,GAAG,wBAAwB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;oCAC/E,IAAI,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;wCACvC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;oCAC9D,CAAC;yCAAM,CAAC;wCACN,QAAQ,CAAC,QAAQ,GAAG,cAAc,CAAC;oCACrC,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;wBACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE;4BAC/D,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;4BAClD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;4BAC5D,OAAO;gCACL,GAAG,CAAC;gCACJ,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,EAAE,GAAG,CAAC;gCAC/C,iBAAiB;gCACjB,QAAQ,EAAE,qBAAqB,CAAC,wBAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;6BACzF,CAAC;wBACJ,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,MAAM,cAAc,GAAG,KAAK,CAAC,uBAAuB;wBAClD,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,uBAAuB,CAAC;wBAChF,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;oBAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,IAAI,cAAc,EAAE,OAAO,IAAI,EAAE,CAAC;oBACtE,IAAI,CAAC,UAAU,EAAE,CAAC;wBAChB,MAAM,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;wBAC1E,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;4BACrD,mBAAmB,EAAE;4BACrB,2BAA2B,EAAE;yBAC9B,CAAC,CAAC;wBACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;wBACnE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACtB,OAAO;gCACL,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC;gCAClC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,6BAA6B,YAAY,CAAC,MAAM,eAAe,YAAY,CAAC,MAAM,cAAc,MAAM,CAAC,MAAM,eAAe,EAAE,CAAC;6BACrK,CAAC;wBACJ,CAAC;wBACD,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;oBAC5B,CAAC;oBAED,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;oBAC5F,kBAAkB,GAAG;wBACnB,cAAc,EAAE,iBAAiB;wBACjC,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC;qBACpC,CAAC;oBACF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;wBACjD,UAAU,EAAE,OAAO;wBACnB,UAAU,EAAE,UAAU;wBACtB,eAAe,EAAE,KAAK;wBACtB,cAAc,EAAE,iBAAiB;qBAClC,CAAC,CAAC;oBACH,MAAM,cAAc,GAAG,UAAU,CAAC,cAA0C,CAAC;oBAC7E,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC;oBACvC,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAChE,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;4BACrD,mBAAmB,EAAE;4BACrB,2BAA2B,EAAE;yBAC9B,CAAC,CAAC;wBACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;wBACnE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACtB,OAAO;gCACL,cAAc,EAAE,EAA8B;gCAC9C,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC;gCAClC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,iCAAiC,YAAY,CAAC,MAAM,eAAe,YAAY,CAAC,MAAM,cAAc,MAAM,CAAC,MAAM,eAAe,EAAE,CAAC;6BACzK,CAAC;wBACJ,CAAC;wBACD,OAAO,EAAE,cAAc,EAAE,EAA8B,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;oBAC5E,CAAC;oBACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvD,MAAM,cAAc,GAAoB,EAAE,CAAC;oBAC3C,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;wBAC1D,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;4BAChB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;4BAChC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;wBAC3F,CAAC;oBACH,CAAC;oBACD,MAAM,aAAa,GAAqB,EAAE,CAAC;oBAC3C,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;wBAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,cAAc,EAAE;4BAC3E,UAAU,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC;4BACnC,aAAa,EAAE,eAAe;4BAC9B,gBAAgB;4BAChB,KAAK,EAAE,aAAa;4BACpB,QAAQ;yBACT,CAAC,CAAC;wBACH,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;4BAChE,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC;gCACvC,eAAe,EAAE,MAAM,CAAC,MAAqB;gCAC7C,iBAAiB,EAAE,MAAM,CAAC,EAAmB;gCAC7C,SAAS,EAAE,WAAW,CAAC,SAAS;gCAChC,UAAU,EAAE,MAAM,CAAC,KAAK;gCACxB,IAAI,EAAE,MAAM,CAAC,UAAU;gCACvB,gBAAgB,EAAE,EAAE;gCACpB,gBAAgB,EAAE,SAAS;gCAC3B,eAAe,EAAE,OAAgB;6BAClC,CAAC,CAAC,CAAC;wBACN,CAAC;wBACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;4BACjE,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC;gCACvC,eAAe,EAAE,MAAM,CAAC,MAAqB;gCAC7C,kBAAkB,EAAE,MAAM,CAAC,EAAoB;gCAC/C,SAAS,EAAE,WAAW,CAAC,SAAS;gCAChC,UAAU,EAAE,MAAM,CAAC,KAAK;gCACxB,IAAI,EAAE,MAAM,CAAC,UAAU;gCACvB,gBAAgB,EAAE,EAAE;gCACpB,gBAAgB,EAAE,SAAS;gCAC3B,eAAe,EAAE,OAAgB;6BAClC,CAAC,CAAC,CAAC;wBACN,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,cAAc,GAAG,IAAI,GAAG,EAA0B,CAAC;oBACzD,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;wBAC9B,MAAM,SAAS,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,kBAAkB,EAAE,CAAC;wBAC5G,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;wBAC/D,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC;4BAC1F,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBAC7B,CAAC;oBACH,CAAC;oBACD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;oBACvD,MAAM,CAAC,OAAO,CAAC,kDAAkD,EAAE,EAAE,eAAe,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC3G,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBAE/C,0DAA0D;oBAC1D,MAAM,YAAY,GAA6E,EAAE,CAAC;oBAElG,mBAAmB;oBACnB,IAAI,kBAAkB,EAAE,CAAC;wBACvB,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI,EAAE,YAAY;4BAClB,MAAM,EAAE,oCAAoC;4BAC5C,IAAI,EAAE,kBAAkB;yBACzB,CAAC,CAAC;oBACL,CAAC;oBAED,oBAAoB;oBACpB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtB,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI,EAAE,aAAa;4BACnB,MAAM,EAAE,YAAY,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;4BACpF,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC,EAAE;yBACtD,CAAC,CAAC;oBACL,CAAC;oBAED,iDAAiD;oBACjD,MAAM,SAAS,GAA6D,EAAE,CAAC;oBAC/E,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;wBAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC;wBAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;4BAAE,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;wBACjE,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;wBACrB,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,UAAU,CAAC;oBAC7C,CAAC;oBACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;wBACzC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC5F,CAAC;oBAED,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,WAAW;wBACjB,MAAM,EAAE,WAAW,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,UAAU,CAAC,MAAM,eAAe;wBACvH,IAAI,EAAE;4BACJ,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;4BAC/B,MAAM,EAAE,UAAU;4BAClB,cAAc,EAAE,UAAU,CAAC,MAAM;4BACjC,MAAM,EAAE,SAAS;4BACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;4BAClC,KAAK,EAAE,YAAY,CAAC,eAAe,CAAC;yBACrC;qBACF,CAAC,CAAC;oBAEH,iEAAiE;oBACjE,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAAC;oBAC/C,IAAI,aAAa,EAAE,CAAC;wBAClB,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;4BACxD,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC;gCAClB,YAAY,CAAC,IAAI,CAAC;oCAChB,IAAI,EAAE,YAAY;oCAClB,MAAM,EAAE,IAAI,IAAI,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG;oCAC5F,IAAI,EAAE;wCACJ,IAAI;wCACJ,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;qCACvF;iCACF,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,4CAA4C;oBAC5C,MAAM,gBAAgB,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAClG,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;wBACjC,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE,cAAc,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE;4BACrE,IAAI,EAAE;gCACJ,MAAM,EAAE,CAAC,CAAC,eAAe;gCACzB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;gCAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,iBAAiB;6BACjC;yBACF,CAAC,CAAC;oBACL,CAAC;oBAED,MAAM,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;wBACrD,mBAAmB,EAAE;wBACrB,2BAA2B,EAAE;qBAC9B,CAAC,CAAC;oBACH,MAAM,aAAa,GAAG,uBAAuB,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;oBACtF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvD,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI,EAAE,WAAW;4BACjB,MAAM,EAAE,eAAe,YAAY,CAAC,MAAM,eAAe,YAAY,CAAC,MAAM,eAAe,aAAa,CAAC,MAAM,eAAe;yBAC/H,CAAC,CAAC;oBACL,CAAC;oBACD,OAAO;wBACL,cAAc,EAAE,cAA0C;wBAC1D,UAAU,EAAE,cAAc,CAAC,aAAa,CAAC;wBACzC,KAAK,EAAE,YAAY;qBACpB,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtE,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBACpD,OAAO;wBACL,UAAU,EAAE,EAAE;wBACd,KAAK,EAAE,kCAAkC;wBACzC,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,iBAAiB;gCACvB,MAAM,EAAE,qBAAqB,MAAM,EAAE;gCACrC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;6BACxB,CAAC;qBACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EACC,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,CAAC,GAAG,MAAiC,CAAC;YAC5C,IAAI,CAAC,EAAE,KAAK;gBAAE,OAAO,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,CAAC,EAAE,UAAuB,CAAC;YAC9C,OAAO,UAAU,CAAC,CAAC,CAAC,SAAS,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,CAAC,CACF,CAAC;QAEF;;;WAGG;QACH,MAAM,cAAc,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YACzE,OAAO,KAAK,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;gBACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,CAAC,OAAO,CAAC,wCAAwC,EAAE;oBACvD,eAAe,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;iBACzC,CAAC,CAAC;gBAEH,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClC,MAAM,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;oBAC/D,OAAO,EAAE,sBAAsB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;gBAC1D,CAAC;gBAED,iFAAiF;gBACjF,MAAM,eAAe,GAAG,EAAE,CAAC;gBAC3B,MAAM,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;qBAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;gBAE/C,mFAAmF;gBACnF,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAC;gBACrD,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;oBACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;oBACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;oBACvC,CAAC;yBAAM,IAAI,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;wBAC9C,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;oBACvC,CAAC;yBAAM,IAAI,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;wBAChD,sDAAsD;wBACtD,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;wBAC5D,MAAM,aAAa,GAAG,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;wBAC1E,IAAI,MAAM,GAAG,aAAa,EAAE,CAAC;4BAC3B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;wBACvC,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC1D,gFAAgF;gBAChF,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;gBAE9D,IAAI,iBAAiB,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC;oBACvD,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE;wBAC7D,MAAM,EAAE,gBAAgB,CAAC,MAAM;wBAC/B,KAAK,EAAE,iBAAiB,CAAC,MAAM;wBAC/B,OAAO,EAAE,gBAAgB,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM;qBAC5D,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,eAAe,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;gBACpE,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAE3D,wFAAwF;gBACxF,8EAA8E;gBAC9E,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;gBAClD,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,OAAO,IAAI,CAAC,CAAC,eAAe,IAAI,IAAI,CAClE,CAAC;gBACF,MAAM,kBAAkB,GACtB,aAAa,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAEhE,IAAI,aAAa,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzE,MAAM,CAAC,IAAI,CACT,0EAA0E,EAC1E;wBACE,iBAAiB,EAAE,SAAS,CAAC,MAAM;qBACpC,CACF,CAAC;gBACJ,CAAC;gBAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,MAAM,CAAC,OAAO,CAAC,sDAAsD,EAAE;wBACrE,UAAU,EAAE,eAAe,CAAC,MAAM;wBAClC,SAAS,EAAE,kBAAkB,CAAC,MAAM;wBACpC,KAAK,EAAE,gBAAgB,CAAC,MAAM;qBAC/B,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,iBAAiB,GAAqB,EAAE,CAAC;gBAE/C,IAAI,CAAC;oBACH,MAAM,eAAe,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC;oBAC/D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;oBACtE,MAAM,YAAY,GAAoB;wBACpC,MAAM,EAAE,eAAe;wBACvB,OAAO,EAAE;4BACP,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI;4BACnC,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG;4BACjC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ;4BAC3C,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS;4BAC/C,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM;4BACzC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO;yBAC3C;wBACD,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BACpD,QAAQ,EAAE,CAAC,CAAC,QAAQ;4BACpB,OAAO,EAAE,CAAC,CAAC,OAAO;4BAClB,OAAO,EAAE,CAAC,CAAC,OAAO;yBACnB,CAAC,CAAC;wBACH,SAAS,EAAE,EAAoB,EAAG,8CAA8C;wBAChF,WAAW,EAAE,GAAG,eAAe,UAAU;wBACzC,QAAQ,EAAE,SAAS;wBACnB,UAAU,EAAE,SAAS;qBACtB,CAAC;oBAEF,MAAM,iBAAiB,GAAsB,MAAM,OAAO,CAAC,GAAG,CAC5D,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;wBAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;wBAClE,IAAI,aAAa,GAAG,CAAC,CAAC,gBAAgB,CAAC;wBACvC,IAAI,aAAa,GAAG,CAAC,CAAC,gBAAgB,CAAC;wBACvC,IAAI,CAAC,CAAC,iBAAiB,IAAI,IAAI,IAAI,CAAC,CAAC,aAAa,IAAI,aAAa,KAAK,EAAE,CAAC,EAAE,CAAC;4BAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;4BAClE,IAAI,MAAM,EAAE,CAAC;gCACX,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;gCAC/B,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC;4BAC9C,CAAC;wBACH,CAAC;wBACD,MAAM,WAAW,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAC;wBACjD,OAAO;4BACL,MAAM,EAAE,CAAC,CAAC,eAAe;4BACzB,OAAO,EAAE;gCACP,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI;gCAC7B,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG;gCAC3B,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ;gCACrC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS;gCACzC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM;gCACnC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO;6BACrC;4BACD,OAAO,EACL,CAAC,CAAC,iBAAiB,IAAI,IAAI;gCACzB,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,iBAAiB,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;gCAC3F,CAAC,CAAC,SAAS;4BACf,SAAS,EAAE,CAAC,CAAC,SAAS;4BACtB,WAAW;4BACX,QAAQ,EAAE,CAAC,CAAC,UAAU,GAAG,GAAG;4BAC5B,UAAU,EAAE,CAAC,CAAC,IAAI;4BAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;yBACrB,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBAEF,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;oBAC1D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAiC,CAAC;oBACrE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAoB,CAAC;oBACvD,KAAK,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC;wBAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;4BAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAA2B,CAAC,CAAC;wBACjG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;4BAClB,mBAAmB,CAAC,GAAG,CACrB,CAAC,CAAC,WAAW,EACb,wBAAwB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAC7E,CAAC;4BACF,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;wBACjG,CAAC;oBACH,CAAC;oBAED,SAAS,gBAAgB,CAAC,KAAgF;wBACxG,IAAI,KAAK,CAAC,WAAW;4BAAE,OAAO,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBACzE,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;wBACxD,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;wBACtG,IAAI,SAAS;4BAAE,OAAO,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;wBACzD,kFAAkF;wBAClF,0DAA0D;wBAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/D,OAAO,SAAS,CAAC;oBACnB,CAAC;oBAED,kDAAkD;oBAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;oBAE9C,MAAM,SAAS,GAAG,OAAQ,cAAuC,CAAC,kBAAkB,KAAK,UAAU;wBACjG,CAAC,CAAE,cAAuC;wBAC1C,CAAC,CAAC,IAAI,oBAAoB,EAAE,CAAC;oBAE/B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,KAAK,MAAM,CAAC;oBAC5E,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,CAAC,YAAY,EAAE,GAAG,iBAAiB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAExG,uFAAuF;oBACvF,MAAM,YAAY,GAA6E,EAAE,CAAC;oBAClG,MAAM,cAAc,GAAiG,EAAE,CAAC;oBAExH,IAAI,qBAAgM,CAAC;oBAErM,IAAI,WAAW,EAAE,CAAC;wBAChB,kEAAkE;wBAClE,MAAM,CAAC,OAAO,CAAC,gDAAgD,EAAE,EAAE,UAAU,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC;wBAC3G,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,iBAAiB,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,EAAE;4BACxC,MAAM,KAAK,GAAmB;gCAC5B,YAAY,EAAE,eAAe;gCAC7B,QAAQ,EAAE,CAAC,YAAY,EAAE,eAAe,CAAC;gCACzC,qBAAqB,EAAE,KAAK,CAAC,OAAO,CAAC,qBAAqB;gCAC1D,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCAClF,eAAe;6BAChB,CAAC;4BACF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;4BAC9B,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;4BAC9D,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC;4BACxE,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;4BAClE,OAAO,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;iCACtE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gCACZ,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;gCAC9C,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;gCACrF,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gCAC3E,MAAM,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,YAAY,CAAC,CAAC,CAAC,GAAG,cAAc,KAAK,SAAS,EAAE,CAAC;gCACnG,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;gCACpH,OAAO,GAAG,CAAC;4BACb,CAAC,CAAC;iCACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gCACb,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;gCAC9C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gCACjE,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;gCACrF,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,cAAc,aAAa,OAAO,EAAE,EAAE,CAAC,CAAC;gCACnJ,MAAM,CAAC,IAAI,CAAC,uDAAuD,EAAE;oCACnE,eAAe,EAAE,eAAe,CAAC,MAAM;oCACvC,KAAK,EAAE,GAAG;iCACX,CAAC,CAAC;gCACH,cAAc,CAAC,IAAI,CAAC;oCAClB,eAAe,EAAE,eAAe,CAAC,MAAM;oCACvC,aAAa,EAAE,cAAc;oCAC7B,KAAK,EAAE,OAAO;oCACd,UAAU,EAAE,aAAa;iCAC1B,CAAC,CAAC;gCACH,OAAO,EAA+K,CAAC;4BACzL,CAAC,CAAC,CAAC;wBACP,CAAC,CAAC,CACH,CAAC;wBACF,0EAA0E;wBAC1E,qBAAqB,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC;wBAE/C,6EAA6E;wBAC7E,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC9B,YAAY,CAAC,IAAI,CAAC;gCAChB,IAAI,EAAE,mBAAmB;gCACzB,MAAM,EAAE,GAAG,cAAc,CAAC,MAAM,IAAI,iBAAiB,CAAC,MAAM,iCAAiC;gCAC7F,IAAI,EAAE;oCACJ,WAAW,EAAE,cAAc,CAAC,MAAM;oCAClC,eAAe,EAAE,iBAAiB,CAAC,MAAM;oCACzC,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wCAC/B,eAAe,EAAE,CAAC,CAAC,eAAe;wCAClC,aAAa,EAAE,CAAC,CAAC,aAAa;wCAC9B,KAAK,EAAE,CAAC,CAAC,KAAK;wCACd,UAAU,EAAE,CAAC,CAAC,UAAU;qCACzB,CAAC,CAAC;iCACJ;6BACF,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,uDAAuD;wBACvD,MAAM,QAAQ,GAAsB,CAAC,YAAY,EAAE,GAAG,iBAAiB,CAAC,CAAC;wBACzE,MAAM,KAAK,GAAmB;4BAC5B,YAAY,EAAE,eAAe;4BAC7B,QAAQ;4BACR,qBAAqB,EAAE,KAAK,CAAC,OAAO,CAAC,qBAAqB;4BAC1D,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;4BAClF,eAAe;yBAChB,CAAC;wBACF,qFAAqF;wBACrF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBAC9B,MAAM,mBAAmB,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;wBACpE,mBAAmB,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC;wBAC9E,IAAI,uBAAyD,CAAC;wBAC9D,IAAI,CAAC;4BACH,uBAAuB,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;4BACnG,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;4BAC9C,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;4BACrF,mBAAmB,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,iBAAiB,CAAC,MAAM,eAAe,EAAE,CAAC,CAAC;wBACxK,CAAC;wBAAC,OAAO,SAAS,EAAE,CAAC;4BACnB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;4BAC9C,MAAM,OAAO,GAAG,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;4BACnF,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;4BACrF,mBAAmB,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,OAAO,EAAE,EAAE,CAAC,CAAC;4BACtI,MAAM,SAAS,CAAC,CAAC,yCAAyC;wBAC5D,CAAC;wBAED,0EAA0E;wBAC1E,qEAAqE;wBACrE,yEAAyE;wBACzE,+DAA+D;wBAC/D,qBAAqB,GAAG,EAAE,CAAC;wBAC3B,KAAK,MAAM,EAAE,IAAI,uBAAuB,EAAE,CAAC;4BACzC,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAC;4BAChE,MAAM,eAAe,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC;4BAC7E,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gCAChC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4BACjC,CAAC;iCAAM,CAAC;gCACN,MAAM,CAAC,IAAI,CAAC,gHAAgH,EAAE;oCAC5H,UAAU,EAAE,eAAe,CAAC,MAAM;oCAClC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;iCAC5C,CAAC,CAAC;gCACH,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC;gCACvE,KAAK,MAAM,SAAS,IAAI,eAAe,EAAE,CAAC;oCACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC;oCAC1E,MAAM,aAAa,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;oCAClD,MAAM,cAAc,GAAG,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;oCAClD,MAAM,iBAAiB,GACrB,aAAa,KAAK,EAAE;wCACpB,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;oCACvD,MAAM,sBAAsB,GAAG,eAAe;yCAC3C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,CAAC;yCACpD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CACvF;yCACA,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;oCACjE,IAAI,SAAiB,CAAC;oCACtB,IAAI,iBAAiB,IAAI,CAAC,sBAAsB,EAAE,CAAC;wCACjD,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;oCAC3B,CAAC;yCAAM,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;wCAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;wCACzB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wCAC9C,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM;4CAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wCACnE,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM;4CAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wCAC5E,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC;oCAC/C,CAAC;yCAAM,CAAC;wCACN,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;oCAC3B,CAAC;oCACD,qBAAqB,CAAC,IAAI,CAAC;wCACzB,SAAS;wCACT,KAAK,EAAE,EAAE,CAAC,KAAK;wCACf,MAAM,EAAE;4CACN,WAAW,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE;4CACrF,SAAS;yCACV;qCACF,CAAC,CAAC;gCACL,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,MAAM,sBAAsB,GAA2B,qBAAqB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBACxF,SAAS,EAAE,EAAE,CAAC,SAAS;wBACvB,KAAK,EAAE,EAAE,CAAC,KAAK;wBACf,QAAQ,EAAE,wBAAwB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;wBACtE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;4BAC1B,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC;4BAC9C,IAAI,QAAQ,EAAE,CAAC;gCACb,2EAA2E;gCAC3E,MAAM,WAAW,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;gCACzE,MAAM,kBAAkB,GAAG,WAAW;oCACpC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC,EAAE,SAA4B;oCAC1I,CAAC,CAAC,SAAS,CAAC;gCACd,OAAO;oCACL,MAAM,EAAE,CAAC,CAAC,MAAqB;oCAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;oCACZ,QAAQ,EAAE,CAAC,CAAC,QAAqC;oCACjD,SAAS,EAAE,kBAAkB,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,EAAqB;iCACzF,CAAC;4BACJ,CAAC;4BACD,OAAO;gCACL,MAAM,EAAE,CAAC,CAAC,MAAqB;gCAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,QAAQ,EAAE,CAAC,CAAC,QAAqC;gCACjD,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,SAA4B;6BAChI,CAAC;wBACJ,CAAC,CAAC;qBACH,CAAC,CAAC,CAAC;oBAEJ,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC;oBACzE,MAAM,CAAC,OAAO,CAAC,wCAAwC,EAAE;wBACvD,cAAc,EAAE,sBAAsB,CAAC,MAAM;wBAC7C,MAAM,EAAE,MAAM,CAAC,MAAM;qBACtB,CAAC,CAAC;oBAEH,4DAA4D;oBAE5D,kGAAkG;oBAClG,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;oBAChF,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,GAAG,cAAc,CAAC;oBAC/D,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,kBAAkB;wBACxB,MAAM,EAAE,GAAG,cAAc,gBAAgB,cAAc,oBAAoB,eAAe,CAAC,MAAM,GAAG;wBACpG,IAAI,EAAE;4BACJ,cAAc;4BACd,cAAc;4BACd,QAAQ,EAAE,IAAI;4BACd,SAAS,EAAE,eAAe,CAAC,MAAM;yBAClC;qBACF,CAAC,CAAC;oBAEH,mEAAmE;oBACnE,+EAA+E;oBAC/E,sFAAsF;oBACtF,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAgD,CAAC;oBAClF,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;wBACzC,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC;wBAC1E,IAAI,cAAc,EAAE,CAAC;4BACnB,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;wBAC/F,CAAC;oBACH,CAAC;oBAED,gBAAgB;oBAChB,YAAY,CAAC,IAAI,CAAC;wBAChB,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,aAAa,iBAAiB,CAAC,MAAM,mBAAmB,MAAM,CAAC,MAAM,sBAAsB,QAAQ,GAAG;wBAC9G,IAAI,EAAE;4BACJ,eAAe,EAAE,eAAe,CAAC,MAAM;4BACvC,qBAAqB,EAAE,sBAAsB,CAAC,MAAM;4BACpD,WAAW,EAAE,MAAM,CAAC,MAAM;4BAC1B,QAAQ;4BACR,SAAS,EAAE,kBAAkB,CAAC,MAAM;4BACpC,WAAW,EAAE,CAAC;4BACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;4BAClC,KAAK,EAAE,YAAY,CAAC,sBAAsB,CAAC;yBAC5C;qBACF,CAAC,CAAC;oBAEH,4EAA4E;oBAC5E,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;wBACvC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBACxE,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;wBACzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;wBACvD,MAAM,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC;wBAC/B,MAAM,SAAS,GAAG,SAAS,EAAE,SAAS,CAAC;wBACvC,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,QAAQ,CAAC;wBACzD,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS;4BAChC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,CAAC;4BAC7C,CAAC,CAAC,cAAc,CAAC;wBAEnB,YAAY,CAAC,IAAI,CAAC;4BAChB,IAAI,EAAE,WAAW;4BACjB,MAAM,EAAE,GAAG,aAAa,KAAK,MAAM,EAAE;4BACrC,IAAI,EAAE;gCACJ,MAAM,EAAE,MAAM,CAAC,MAAM;gCACrB,IAAI,EAAE,aAAa;gCACnB,GAAG,EAAE,YAAY;gCACjB,KAAK,EAAE,KAAK;gCACZ,MAAM,EAAE,OAAO;gCACf,SAAS,EAAE,SAAS,IAAI,2CAA2C;gCACnE,UAAU,EAAE,MAAM,CAAC,UAAU;gCAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,KAAK,EAAE,YAAY,CAAC,sBAAsB,CAAC;gCAC3C,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAA4D,EAAE,EAAE,CAAC,CAAC;oCAC9F,QAAQ,EAAE,CAAC,CAAC,QAAQ;oCACpB,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;iCACtD,CAAC,CAAC;gCACH,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oCACxB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI;oCACzB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;iCAClC,CAAC,CAAC,CAAC,SAAS;6BACd;yBACF,CAAC,CAAC;oBACL,CAAC;oBAED,wEAAwE;oBACxE,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC;oBAEtF,OAAO;wBACL,sBAAsB,EAAE,mBAAmB;wBAC3C,mBAAmB,EAAE,kBAAkB;wBACvC,KAAK,EAAE,YAAY;wBACnB,YAAY,EAAE,iBAAiB;qBAChC,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtE,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBACrD,OAAO;wBACL,sBAAsB,EAAE,EAAE;wBAC1B,KAAK,EAAE,gCAAgC;wBACvC,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,kBAAkB;gCACxB,MAAM,EAAE,sBAAsB,MAAM,EAAE;gCACtC,IAAI,EAAE;oCACJ,KAAK,EAAE,MAAM;oCACb,cAAc,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC;oCAC7C,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iCACnC;6BACF,CAAC;wBACF,YAAY,EAAE,iBAAiB;qBAChC,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;;;;;;;WAQG;QACH,MAAM,wBAAwB,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YACxE,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAAE,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAExE,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC9B,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAEnE,IAAI,CAAC;gBACH,yDAAyD;gBACzD,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAW,CAAC;gBAE3E,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAErF,MAAM,UAAU,GAAG;oBACjB,EAAE,EAAE,eAAe;oBACnB,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACnD,EAAE,EAAE,CAAC,CAAC,QAAkB;wBACxB,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;wBACtB,WAAW,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE;wBAC5B,UAAU,EAAE,CAAC;qBACd,CAAC,CAAC,IAAI,EAAE;oBACT,OAAO,EAAE;wBACP,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,IAAI,aAAa,EAAE,IAAI;wBAChE,GAAG,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,GAAG,IAAI,aAAa,EAAE,KAAK,IAAI,SAAS;wBAC5E,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,IAAI,aAAa,EAAE,QAAQ,IAAI,SAAS;wBACzF,MAAM,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM;wBAC/C,SAAS,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU,EAAE,SAAS;qBACtD;iBACF,CAAC;gBAEF,oFAAoF;gBACpF,mFAAmF;gBACnF,MAAM,CAAC,OAAO,CAAC,0DAA0D,EAAE;oBACzE,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM;oBAC5C,eAAe;iBAChB,CAAC,CAAC;gBAEH,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa;qBACzC,GAAG,CAAC,GAAG,CAAC,EAAE;oBACT,2EAA2E;oBAC3E,MAAM,gBAAgB,GAAI,GAAG,CAAC,MAA6B;yBACxD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;oBACxC,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;wBACrF,MAAM,CAAC,OAAO,CAAC,iEAAiE,EAAE;4BAChF,aAAa,EAAE,GAAG,CAAC,EAAE;4BACrB,eAAe,EAAE,gBAAgB,CAAC,MAAM;4BACxC,aAAa,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,MAAM;yBACxE,CAAC,CAAC;wBACH,OAAO,IAAI,CAAC;oBACd,CAAC;oBAED,MAAM,cAAc,GAAI,GAAG,CAAC,MAA0F;yBACnH,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC;oBAC3C,IAAI,CAAC,cAAc,EAAE,CAAC;wBACpB,MAAM,CAAC,OAAO,CAAC,iEAAiE,EAAE;4BAChF,aAAa,EAAE,GAAG,CAAC,EAAE;4BACrB,eAAe;4BACf,MAAM,EAAG,GAAG,CAAC,MAA6B,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;yBACjG,CAAC,CAAC;wBACH,OAAO,IAAI,CAAC;oBACd,CAAC;oBACD,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC;gBACjC,CAAC,CAAC;qBACD,MAAM,CAAC,CAAC,CAAC,EAA8B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;gBAEzD,MAAM,CAAC,OAAO,CAAC,gDAAgD,EAAE;oBAC/D,kBAAkB,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM;oBAC9C,gBAAgB,EAAE,gBAAgB,CAAC,MAAM;iBAC1C,CAAC,CAAC;gBAEH,MAAM,UAAU,GAA2B,MAAM,OAAO,CAAC,GAAG,CAC1D,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE;oBACrD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAgB,CAAC;oBAC/C,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;wBAC/D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;wBAClD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;wBAC/C,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;wBACtD,cAAc,CAAC,QAAQ;4BACrB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,QAAkB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;4BAC9E,CAAC,CAAC,IAAI;qBACT,CAAC,CAAC;oBAEH,MAAM,WAAW,GAAG,CAAC,EAA4E,EAAE,EAAE,CAAC,CAAC;wBACrG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,cAAc,CAAC,QAAQ,CAAW;wBAChD,KAAK,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE;wBACvB,WAAW,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE;wBAC7B,UAAU,EAAE,CAAC;qBACd,CAAC,CAAC;oBACH,MAAM,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;oBACpF,MAAM,eAAe,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChF,MAAM,gBAAgB,GAAG;wBACvB,GAAG,eAAe;wBAClB,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;wBACjF,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;qBAClF,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAEd,OAAO;wBACL,MAAM;wBACN,aAAa,EAAE,GAAG,CAAC,EAAY;wBAC/B,SAAS,EAAG,GAAG,CAAC,cAAgD,EAAE,SAAS,IAAI,EAAE;wBACjF,WAAW,EAAE,cAAc,CAAC,IAAI,IAAI,MAAM;wBAC1C,SAAS,EAAE,cAAc,CAAC,SAAmB;wBAC7C,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC9E,aAAa,EAAE;4BACb,EAAE,EAAE,MAAM;4BACV,OAAO,EAAE,gBAAgB;4BACzB,OAAO,EAAE;gCACP,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI;gCAC3C,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,KAAK,IAAI,SAAS;gCACvD,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,IAAI,EAAE,QAAQ,IAAI,SAAS;gCACpE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM;gCACnC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS;6BAC1C;yBACF;qBACF,CAAC;gBACJ,CAAC,CAAC,CACH,CAAC;gBAEF,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC;gBACnD,MAAM,QAAQ,GAAG,UAAU;oBACzB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,IAAI,CAAC;oBACrD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;gBAE3D,oFAAoF;gBACpF,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzG,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;gBAClD,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;oBACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;oBACtG,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,CAAC;yBACjD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;yBACvC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChB,IAAI,MAAM;wBAAE,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBACrD,CAAC,CAAC,CACH,CAAC;gBAEF,uBAAuB;gBACvB,wEAAwE;gBACxE,4DAA4D;gBAC5D,wEAAwE;gBACxE,uEAAuE;gBACvE,6DAA6D;gBAC7D,2EAA2E;gBAC3E,yEAAyE;gBACzE,8BAA8B;gBAC9B,yEAAyE;gBACzE,oEAAoE;gBACpE,yEAAyE;gBACzE,yEAAyE;gBACzE,uEAAuE;gBACvE,wEAAwE;gBACxE,qEAAqE;gBACrE,gCAAgC;gBAChC,MAAM,gBAAgB,GAAG,UAAU,IAAI,IAAI,CAAC,eAAe;oBACzD,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;wBACxB,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAChB,cAAc,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC/B,IAAI,CAAC,eAAgB,CAAC,gBAAgB,CACpC,eAAe,EACf,EAAE,MAAM,EAAE,qBAAqB,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAC5E,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CACrB,CACF,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;wBACnB,CAAC,CAAC,KAAK,CAAC;oBACZ,CAAC,CAAC,KAAK,CAAC;gBACV,wEAAwE;gBACxE,yEAAyE;gBACzE,8DAA8D;gBAC9D,MAAM,2BAA2B,GAAG,KAAM,CAAC;gBAC3C,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,KAAK,cAAc,CAAC;gBACxD,MAAM,cAAc,GAAG,CAAC,UAAU,IAAI,gBAAgB,CAAC;gBACvD,MAAM,SAAS,GAAG,cAAc;oBAC9B,CAAC,CAAC,2BAA2B;oBAC7B,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,KAAM,CAAC;gBAErD,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBAC5C,eAAe;oBACf,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,UAAU;oBACV,cAAc;oBACd,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe;oBACrC,gBAAgB;oBAChB,cAAc;oBACd,SAAS;oBACT,cAAc,EAAE,UAAU,CAAC,MAAM;iBAClC,CAAC,CAAC;gBAEH,sEAAsE;gBACtE,wEAAwE;gBACxE,iEAAiE;gBACjE,gEAAgE;gBAChE,kEAAkE;gBAClE,iEAAiE;gBACjE,iEAAiE;gBACjE,iDAAiD;gBACjD,qEAAqE;gBACrE,oEAAoE;gBACpE,mEAAmE;gBACnE,kEAAkE;gBAClE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;gBACrD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBAElE,MAAM,WAAW,GAAuD,EAAE,CAAC;gBAE3E,MAAM,mBAAmB,GAA0B,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;oBACnG,WAAW,CAAC,IAAI,CAAC;wBACf,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,gBAAgB;wBAC5E,eAAe,EAAE,SAAS,CAAC,MAAM;wBACjC,gBAAgB,EAAE,CAAC,GAAG,EAAE;4BACtB,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;4BACzD,IAAI,GAAG;gCAAE,OAAO,GAAG,CAAC;4BACpB,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACvE,CAAC,CAAC,EAAE;wBACJ,YAAY,EAAE,SAAS,CAAC,SAAS;4BAC/B,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE;4BAChD,CAAC,CAAC,EAAE;wBACN,KAAK;wBACL,OAAO;qBACR,CAAC,CAAC;oBAEH,IAAI,KAAK,CAAC,OAAO,KAAK,cAAc;wBAAE,OAAO;oBAC7C,sCAAsC;oBACtC,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC;oBAC3D,IAAI,WAAW,EAAE,OAAO;wBAAE,OAAO;oBACjC,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,CAAC,aAAa;wBAAE,OAAO;oBAElD,+DAA+D;oBAC/D,gEAAgE;oBAChE,+DAA+D;oBAC/D,+DAA+D;oBAC/D,8DAA8D;oBAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ;yBAChC,uBAAuB,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC;yBACzD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;wBACb,MAAM,CAAC,IAAI,CAAC,8EAA8E,EAAE;4BAC1F,aAAa,EAAE,SAAS,CAAC,aAAa;4BACtC,KAAK,EAAE,GAAG;yBACX,CAAC,CAAC;wBACH,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC,CAAC;oBACL,IAAI,CAAC,OAAO,IAAI,WAAW,EAAE,OAAO;wBAAE,OAAO;oBAE7C,MAAM,eAAe,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;oBACpE,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;oBAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,EAAE,SAAS,IAAI,EAAE,CAAC;oBAC7D,MAAM,mBAAmB,GAAG,wBAAwB,CAClD,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,CACX,CAAC;oBAEF,YAAY,EAAE,CAAC;wBACb,IAAI,EAAE,yBAAyB;wBAC/B,aAAa,EAAE,SAAS,CAAC,aAAa;wBACtC,WAAW,EAAE,OAAO;wBACpB,mBAAmB;wBACnB,YAAY,EAAE;4BACZ,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,EAAE;4BAClC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI;gCACvC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE;gCAChD,CAAC,CAAC,EAAE,CAAC;yBACR;qBACF,CAAC,CAAC;gBACL,CAAC,CAAC;gBAEF,MAAM,eAAe,GAAG,mBAAmB,CACzC,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAC7C,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,+CAA+C;gBAC9E,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,IAAI,SAAS;oBACjD,qBAAqB,EAAE,eAAe;oBACtC,SAAS;oBACT,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS;oBACtE,mBAAmB,EAAE,CACxB,CAAC;gBAEF,sEAAsE;gBACtE,sEAAsE;gBACtE,mEAAmE;gBACnE,qEAAqE;gBACrE,mEAAmE;gBACnE,6DAA6D;gBAC7D,qEAAqE;gBACrE,oEAAoE;gBACpE,YAAY;gBACZ,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC;gBAClD,IAAI,eAAgD,CAAC;gBACrD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,IAAI,OAAkD,CAAC;oBACvD,MAAM,SAAS,GAAG,IAAI,OAAO,CAAkC,CAAC,OAAO,EAAE,EAAE;wBACzE,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAC1E,CAAC,CAAC,CAAC;oBACH,gEAAgE;oBAChE,mEAAmE;oBACnE,iEAAiE;oBACjE,sDAAsD;oBACtD,IAAI,KAAwE,CAAC;oBAC7E,IAAI,CAAC;wBACH,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;oBAC3D,CAAC;4BAAS,CAAC;wBACT,IAAI,OAAO,KAAK,SAAS;4BAAE,YAAY,CAAC,OAAO,CAAC,CAAC;oBACnD,CAAC;oBACD,IAAI,KAAK,KAAK,wBAAwB,EAAE,CAAC;wBACvC,uDAAuD;wBACvD,KAAK,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;4BACjC,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;wBACnG,CAAC,CAAC,CAAC;wBACH,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE;4BAC/E,eAAe;4BACf,cAAc,EAAE,UAAU,CAAC,MAAM;4BACjC,kBAAkB,EAAE,QAAQ;yBAC7B,CAAC,CAAC;wBACH,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;wBACtG,MAAM,yBAAyB,GAAG,CAAC,GAAG,WAAW,CAAC;6BAC/C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;6BACrC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAA0B,CAAC,CAAC;wBAC9D,MAAM,4BAA4B,GAAG,yBAAyB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;wBAC3F,MAAM,uBAAuB,GAAG,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;wBACjF,OAAO;4BACL,KAAK,EAAE,CAAC;oCACN,IAAI,EAAE,WAAW;oCACjB,MAAM,EAAE,WAAW;oCACnB,IAAI,EAAE;wCACJ,kBAAkB,EAAE,QAAQ;wCAC5B,cAAc,EAAE,UAAU,CAAC,MAAM;wCACjC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU;qCACpC;iCACF,CAAC;4BACF,qBAAqB,EAAE,4BAA4B;4BACnD,gBAAgB,EAAE,uBAAuB;yBAC1C,CAAC;oBACJ,CAAC;oBACD,eAAe,GAAG,KAAK,CAAC;gBAC1B,CAAC;qBAAM,CAAC;oBACN,eAAe,GAAG,MAAM,eAAe,CAAC;gBAC1C,CAAC;gBAED,qFAAqF;gBACrF,oFAAoF;gBACpF,wFAAwF;gBACxF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpE,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;gBAEtD,MAAM,qBAAqB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAClF,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC;oBACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC;oBAC9D,OAAO;wBACL,IAAI,EAAE,qBAAqB;wBAC3B,MAAM,EAAE,GAAG,IAAI,KAAK,OAAO,EAAE;wBAC7B,IAAI,EAAE;4BACJ,MAAM,EAAE,CAAC,CAAC,MAAM;4BAChB,aAAa,EAAE,CAAC,CAAC,aAAa;4BAC9B,IAAI;4BACJ,OAAO;4BACP,KAAK,EAAE,MAAM,EAAE,SAAS,IAAI,CAAC;yBAC9B;qBACF,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC;gBAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,aAAa,CAAC;gBACrD,MAAM,cAAc,GAAG;oBACrB;wBACE,IAAI,EAAE,WAAW;wBACjB,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,oBAAoB,aAAa,cAAc,UAAU,mBAAmB;wBACxG,IAAI,EAAE;4BACJ,UAAU,EAAE,qBAAqB;4BACjC,cAAc,EAAE,UAAU,CAAC,MAAM;4BACjC,aAAa;4BACb,UAAU;yBACX;qBACF;oBACD,GAAG,qBAAqB;iBACzB,CAAC;gBAEF,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;gBACtG,MAAM,kBAAkB,GAAG,CAAC,GAAG,WAAW,CAAC;qBACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;qBACrC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAA0B,CAAC,CAAC;gBAC9D,MAAM,qBAAqB,GAAG,kBAAkB,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBAC7E,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;gBACnE,OAAO;oBACL,KAAK,EAAE,cAAc;oBACrB,qBAAqB;oBACrB,gBAAgB;iBACjB,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC3E,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;gBACtG,OAAO;oBACL,KAAK,EAAE,CAAC;4BACN,IAAI,EAAE,WAAW;4BACjB,MAAM,EAAE,oBAAoB;4BAC5B,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE;yBAC3D,CAAC;oBACF,qBAAqB,EAAE,EAAE;oBACzB,gBAAgB,EAAE,qBAAqB,CAAC,EAAE,CAAC;iBAC5C,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;QAEF;;;WAGG;QACH,MAAM,WAAW,GAAG,aAAa,CAC/B,qBAAqB,EACrB,KAAK,EAAE,KAAyC,EAAE,EAAE;YACpD,OAAO,KAAK,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;gBAClD,MAAM,CAAC,OAAO,CAAC,kCAAkC,EAAE;oBACjD,cAAc,EAAE,KAAK,CAAC,sBAAsB,CAAC,MAAM;iBACpD,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;oBACnF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;oBACxC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBAEtC,MAAM,WAAW,GAAG,CAAC,GAAyB,EAAE,EAAE,CAChD,GAAG,CAAC,MAAM;yBACP,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;yBACxC,IAAI,EAAE;yBACN,IAAI,CAAC,GAAG,CAAC,CAAC;oBACf,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;oBAC/B,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;wBACzC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;wBAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;4BAAE,OAAO,KAAK,CAAC;wBAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBACd,OAAO,IAAI,CAAC;oBACd,CAAC,CAAC,CAAC;oBAEH,MAAM,CAAC,OAAO,CAAC,kCAAkC,EAAE;wBACjD,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,UAAU,EAAE,MAAM,CAAC,MAAM;wBACzB,UAAU,EAAE,YAAY,CAAC,MAAM;qBAChC,CAAC,CAAC;oBACH,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,CAAC;gBAClD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtE,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBAClD,OAAO;wBACL,sBAAsB,EAAE,EAAE;wBAC1B,KAAK,EAAE,+BAA+B;wBACtC,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,eAAe;gCACrB,MAAM,EAAE,mBAAmB,MAAM,EAAE;gCACnC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;6BACxB,CAAC;qBACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EACC,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,CAAC,GAAG,MAAiC,CAAC;YAC5C,IAAI,CAAC,EAAE,KAAK;gBAAE,OAAO,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,CAAC,EAAE,sBAAmC,CAAC;YACpD,OAAO,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,CAAC,CACF,CAAC;QAEF;;;WAGG;QACH,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YAC9E,OAAO,KAAK,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;gBAC1D,MAAM,CAAC,OAAO,CAAC,kCAAkC,EAAE;oBACjD,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,aAAa,EAAE,KAAK,CAAC,oBAAoB,EAAE,MAAM,IAAI,CAAC;iBACvD,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC;oBAClD,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAA+B,CAAC;oBACnG,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAErG,IAAI,CAAC,gBAAgB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACjD,OAAO;4BACL,KAAK,EAAE,2FAA2F;yBACnG,CAAC;oBACJ,CAAC;oBAED,IAAI,KAAK,CAAC,iBAAiB,IAAI,gBAAgB,KAAK,KAAK,CAAC,iBAAiB,EAAE,CAAC;wBAC5E,OAAO;4BACL,KAAK,EAAE,wGAAwG;yBAChH,CAAC;oBACJ,CAAC;oBAED,MAAM,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;wBAChE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC;wBAC7D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC;qBAC3D,CAAC,CAAC;oBACH,IAAI,CAAC,kBAAkB,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAC9C,OAAO;4BACL,KAAK,EAAE,mHAAmH;yBAC3H,CAAC;oBACJ,CAAC;oBACD,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;wBAChC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;4BAC5C,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,gBAAgB,EAAE,MAAM,CAAC;4BACvD,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC;yBACrD,CAAC,CAAC;wBACH,OAAO,QAAQ,IAAI,OAAO,CAAC;oBAC7B,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,eAAe,GAAG,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACpD,IAAI,CAAC,eAAe,EAAE,CAAC;wBACrB,OAAO;4BACL,KAAK,EAAE,mHAAmH;yBAC3H,CAAC;oBACJ,CAAC;oBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;oBAClG,IAAI,MAAM,EAAE,CAAC;wBACX,OAAO,EAAE,KAAK,EAAE,qDAAqD,EAAE,CAAC;oBAC1E,CAAC;oBAED,MAAM,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;oBAC5D,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAChE,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;wBAC7C,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;wBAC1B,KAAK,EAAE,GAAG;qBACX,CAAC,CAAC;oBACH,OAAO;wBACL,KAAK,EAAE,iCAAiC;wBACxC,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,wBAAwB;gCAC9B,MAAM,EAAE,2BAA2B,MAAM,EAAE;gCAC3C,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;6BACxB,CAAC;qBACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;WAEG;QACH,SAAS,kBAAkB,CACzB,QAA2B,EAC3B,KAAyC,EACzC,gBAAgC,EAChC,cAAuB;YAEvB,MAAM,SAAS,GACb,GAAG,cAAc,IAAI,UAAU,wCAAwC;gBACvE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;YACvF,MAAM,MAAM,GAAgC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBACrE,MAAM,EAAE,GAAkB;gBAC1B,IAAI,EAAE,MAAe;gBACrB,SAAS,EAAE,gBAAgB;aAC5B,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QACtC,CAAC;QAED;;;WAGG;QACH,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YAC9E,OAAO,KAAK,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;gBAC1D,MAAM,CAAC,OAAO,CAAC,kCAAkC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAE7E,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,OAAO,EAAE,sBAAsB,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;gBAC1D,CAAC;gBAED,MAAM,QAAQ,GAAG,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC;gBAClD,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAA+B,CAAC;gBACnG,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7C,OAAO,EAAE,sBAAsB,EAAE,EAAE,EAAE,KAAK,EAAE,+CAA+C,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;gBAClH,CAAC;gBAED,MAAM,iBAAiB,GAAqB,EAAE,CAAC;gBAC/C,IAAI,cAAkC,CAAC;gBACvC,IAAI,SAAiB,CAAC;gBACtB,IAAI,KAAa,CAAC;gBAClB,IAAI,MAAM,GAAgC,EAAE,CAAC;gBAE7C,MAAM,kBAAkB,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,YAAY,CAAC;gBACnE,IAAI,iBAAiB,GAAG,KAAK,CAAC;gBAC9B,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjE,cAAc,GAAG,cAAc,EAAE,IAAI,IAAI,SAAS,CAAC;oBACnD,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC5E,MAAM,KAAK,GAAmB;wBAC5B,YAAY,EAAE,KAAK,CAAC,MAAM;wBAC1B,QAAQ;wBACR,gBAAgB,EAAE,IAAI;wBACtB,cAAc;wBACd,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,SAAS;wBACrD,eAAe;qBAChB,CAAC;oBAEF,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACxB,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;oBACvE,iBAAiB,GAAG,IAAI,CAAC;oBACzB,MAAM,SAAS,GAAG,MAAO,cAAuC,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC5G,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;oBAC/C,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC;oBACtF,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;oBACpI,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACzB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;wBAC1B,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;wBAC3B,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;wBACnB,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;4BAC/B,MAAM,EAAE,CAAC,CAAC,MAAqB;4BAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;4BACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,SAAS;4BACjC,SAAS,EAAE,gBAAgB;yBAC5B,CAAC,CAAC,CAAC;oBACN,CAAC;yBAAM,CAAC;wBACN,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;wBACvF,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;wBAC/B,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;wBACvB,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBAAC,OAAO,OAAO,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC5E,oEAAoE;oBACpE,IAAI,iBAAiB,EAAE,CAAC;wBACtB,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;wBAClD,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW,MAAM,EAAE,EAAE,CAAC,CAAC;wBAClI,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,CAAC;oBAC3F,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC,qEAAqE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;oBACvG,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;oBACvF,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;oBAC/B,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;oBACvB,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;oBACzB,OAAO;wBACL,sBAAsB,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;wBACtD,mBAAmB,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE;wBACtD,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa,IAAI,QAAQ,EAAE;wBACrF,YAAY,EAAE,iBAAiB;wBAC/B,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,wBAAwB;gCAC9B,MAAM,EAAE,4CAA4C,MAAM,EAAE;gCAC5D,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;6BACxB,CAAC;qBACH,CAAC;gBACJ,CAAC;gBAED,MAAM,oBAAoB,GAAyB;oBACjD,MAAM;oBACN,KAAK;oBACL,SAAS;iBACV,CAAC;gBAEF,OAAO;oBACL,sBAAsB,EAAE,CAAC,oBAAoB,CAAC;oBAC9C,mBAAmB,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE;oBACtD,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa,IAAI,QAAQ,EAAE;oBACrF,YAAY,EAAE,iBAAiB;iBAChC,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;;WAGG;QACH,MAAM,WAAW,GAAG,aAAa,CAC/B,qBAAqB,EACrB,KAAK,EAAE,KAAyC,EAAE,EAAE;YACpD,OAAO,KAAK,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;gBAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBACvF,MAAM,CAAC,OAAO,CAAC,iDAAiD,EAAE;oBAChE,qBAAqB,EAAE,KAAK,CAAC,sBAAsB,CAAC,MAAM;oBAC1D,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,aAAa;iBACd,CAAC,CAAC;gBAEH,IAAI,KAAK,CAAC,sBAAsB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC9C,MAAM,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;oBAC9D,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;gBAC/B,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,cAAc,GAA4B,EAAE,CAAC;oBACnD,MAAM,wBAAwB,GAAkB,EAAE,CAAC;oBACnD,MAAM,qBAAqB,GAKtB,EAAE,CAAC;oBACR,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBACrC,4DAA4D;oBAC5D,oFAAoF;oBACpF,8EAA8E;oBAC9E,mEAAmE;oBACnE,MAAM,mBAAmB,GAAmB,CAAC,OAAO,CAAC,CAAC;oBAEtD,MAAM,yBAAyB,GAAG,KAAK,CAAC,gBAAgB;wBACtD,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;wBAC3C,CAAC,CAAC,IAAI,CAAC;oBAET,gEAAgE;oBAChE,gEAAgE;oBAChE,2DAA2D;oBAC3D,wDAAwD;oBACxD,8DAA8D;oBAC9D,4DAA4D;oBAC5D,8DAA8D;oBAC9D,MAAM,oBAAoB,GAAiE,EAAE,CAAC;oBAC9F,IAAI,KAAK,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;wBACrC,iEAAiE;wBACjE,8DAA8D;wBAC9D,0DAA0D;wBAC1D,iEAAiE;wBACjE,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,MAAM,CAAW,CAAC;wBACvE,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;wBAC7C,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;4BACrD,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,EAAE,MAAM,CAAC;4BACrF,IAAI,eAAe;gCAAE,kBAAkB,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;wBAC/D,CAAC;wBACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,CAAC,GAAG,kBAAkB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAAE;4BACvD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ;iCACjC,yBAAyB,CAAC,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;iCAClH,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gCACtB,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE;oCAC/E,MAAM,EAAE,WAAW;oCACnB,kBAAkB;oCAClB,KAAK,EAAE,GAAG;iCACX,CAAC,CAAC;gCACH,OAAO,EAAyE,CAAC;4BACnF,CAAC,CAAC,CAAC;4BACL,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAmB,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;wBAChG,CAAC,CAAC,CACH,CAAC;wBACF,oBAAoB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC/C,CAAC;oBAED,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;wBACrD,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;wBAC3E,IAAI,MAA0B,CAAC;wBAC/B,IAAI,IAA2B,CAAC;wBAEhC,MAAM,CAAC,OAAO,CAAC,4BAA4B,EAAE;4BAC3C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB;4BAC3C,WAAW,EAAE,KAAK,CAAC,MAAM;4BACzB,YAAY,EAAE,KAAK,CAAC,SAAS;4BAC7B,qBAAqB,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;yBAC3D,CAAC,CAAC;wBAEH,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;4BAC9B,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gCACnC,MAAM,CAAC,IAAI,CAAC,2EAA2E,EAAE;oCACvF,MAAM,EAAE,KAAK,CAAC,MAAM;oCACpB,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;iCACrC,CAAC,CAAC;gCACH,SAAS;4BACX,CAAC;4BACD,kFAAkF;4BAClF,MAAM,eAAe,GAAuB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAA4B,EAAE,EAAE,CAAC,CAAC;gCAClG,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,gBAAgB;gCAC1C,MAAM,EAAE,CAAC,CAAC,MAAM;gCAChB,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;6BAC9C,CAAC,CAAC,CAAC;4BACJ,MAAM,qBAAqB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;4BACnF,MAAM,GAAG,qBAAqB;gCAC5B,CAAC,CAAC,eAAe;gCACjB,CAAC,CAAC;oCACE,GAAG,eAAe;oCAClB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,YAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE;iCACpG,CAAC;4BACN,IAAI,GAAG;gCACL,SAAS,EAAE;oCACT,MAAM,EAAE,QAAQ;oCAChB,SAAS,EAAE,KAAK,CAAC,MAAM;oCACvB,aAAa,EAAE,KAAK,CAAC,mBAAmB,CAAC,aAAa;oCACtD,SAAS,EAAE,GAAG;iCACf;gCACD,MAAM;gCACN,cAAc,EAAE;oCACd,QAAQ,EAAE,eAAe;oCACzB,SAAS,EAAE,SAAS,CAAC,SAAS;oCAC9B,UAAU,EAAE,SAAS,CAAC,KAAK,GAAG,GAAG;oCACjC,OAAO,EAAE;wCACP;4CACE,IAAI,EAAE,kBAAkB;4CACxB,MAAM,EAAE,CAAC;4CACT,MAAM,EAAE,mBAAmB,KAAK,CAAC,mBAAmB,CAAC,aAAa,IAAI,UAAU,WAAW;yCAC5F;qCACF;iCACF;gCACD,OAAO,EAAE;oCACP,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,gBAAgB;oCAC9C,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iCAC1F;gCACD,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,GAAG,CAAC;gCACzC,MAAM,EAAE,aAAa;6BACtB,CAAC;wBACJ,CAAC;6BAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;4BAClC,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;gCACnC,MAAM,CAAC,IAAI,CAAC,mFAAmF,EAAE;oCAC/F,MAAM,EAAE,KAAK,CAAC,MAAM;oCACpB,WAAW,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM;iCACrC,CAAC,CAAC;gCACH,SAAS;4BACX,CAAC;4BACD,qFAAqF;4BACrF,MAAM,eAAe,GAAuB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAA4B,EAAE,EAAE,CAAC,CAAC;gCAClG,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,gBAAgB;gCAC1C,MAAM,EAAE,CAAC,CAAC,MAAM;gCAChB,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;6BAC9C,CAAC,CAAC,CAAC;4BACJ,MAAM,qBAAqB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;4BACnF,MAAM,GAAG,qBAAqB;gCAC5B,CAAC,CAAC,eAAe;gCACjB,CAAC,CAAC;oCACE,GAAG,eAAe;oCAClB,EAAE,SAAS,EAAE,gBAAiB,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,YAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE;iCACrG,CAAC;4BAEN,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;4BAClG,MAAM,WAAW,GAAG,eAAe;gCACjC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAC3C,CAAC,KAAK,CAAC,gBAA+B,EAAE,eAA8B,CAAC,EACvE,EAAE,eAAe,EAAE,mBAAmB,EAAE,CACzC;gCACH,CAAC,CAAC,EAAE,CAAC;4BACP,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gCAChC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;gCACvF,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CACxE,CAAC;gCAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oCACnE,qFAAqF;oCACrF,sFAAsF;oCACtF,qEAAqE;oCACrE,iFAAiF;oCACjF,uFAAuF;oCACvF,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,cAAc,EAAE,CAAC;wCACpD,iFAAiF;wCACjF,6FAA6F;wCAC7F,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;wCACtF,IAAI,WAAW,EAAE,CAAC;4CAChB,MAAM,CAAC,OAAO,CAAC,6DAA6D,EAAE;gDAC5E,aAAa,EAAE,QAAQ,CAAC,EAAE;gDAC1B,eAAe;gDACf,cAAc,EAAE,QAAQ,CAAC,MAAM;6CAChC,CAAC,CAAC;4CACH,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wCAC7C,CAAC;wCACD,SAAS;oCACX,CAAC;gCACH,CAAC;qCAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;oCAC7C,gEAAgE;oCAChE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gCAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oCACpF,IAAI,SAAS,EAAE,CAAC;wCACd,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;wCAChG,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;wCACvF,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;4CACtD,qBAAqB,CAAC,IAAI,CAAC;gDACzB,eAAe,EAAE,eAA8B;gDAC/C,SAAS,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,gBAAgB,IAAI,EAAE,CAAmB;gDACxE,qBAAqB,EAAE,QAAQ,CAAC,EAAyB;gDACzD,cAAc,EAAE,QAAQ,CAAC,MAAM;6CAChC,CAAC,CAAC;4CACH,MAAM,CAAC,OAAO,CAAC,uFAAuF,EAAE;gDACtG,aAAa,EAAE,QAAQ,CAAC,EAAE;gDAC1B,eAAe;gDACf,SAAS,EAAE,SAAS,CAAC,KAAK;6CAC3B,CAAC,CAAC;4CACH,SAAS;wCACX,CAAC;oCACH,CAAC;oCACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;oCACtF,IAAI,WAAW,EAAE,CAAC;wCAChB,MAAM,CAAC,IAAI,CAAC,+EAA+E,EAAE;4CAC3F,aAAa,EAAE,QAAQ,CAAC,EAAE;4CAC1B,eAAe;4CACf,cAAc,EAAE,SAAS,EAAE,KAAK;yCACjC,CAAC,CAAC;wCACH,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oCAC7C,CAAC;oCACD,SAAS;gCACX,CAAC;qCAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oCACxC,gDAAgD;oCAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;oCACnF,IAAI,QAAQ,EAAE,CAAC;wCACb,MAAM,CAAC,OAAO,CAAC,0EAA0E,EAAE;4CACzF,aAAa,EAAE,QAAQ,CAAC,EAAE;4CAC1B,eAAe;yCAChB,CAAC,CAAC;wCACH,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oCAC1C,CAAC;oCACD,SAAS;gCACX,CAAC;qCAAM,IAAI,QAAQ,IAAI,eAAe,EAAE,CAAC;oCACvC,+EAA+E;oCAC/E,qBAAqB,CAAC,IAAI,CAAC;wCACzB,eAAe,EAAE,eAA8B;wCAC/C,SAAS,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,gBAAgB,IAAI,EAAE,CAAmB;wCACxE,qBAAqB,EAAE,QAAQ,CAAC,EAAyB;wCACzD,cAAc,EAAE,QAAQ,CAAC,MAAM;qCAChC,CAAC,CAAC;oCACH,MAAM,CAAC,OAAO,CAAC,+DAA+D,EAAE;wCAC9E,eAAe;wCACf,cAAc,EAAE,QAAQ,CAAC,MAAM;wCAC/B,qBAAqB,EAAE,QAAQ,CAAC,EAAE;qCACnC,CAAC,CAAC;oCACH,SAAS;gCACX,CAAC;gCACD,2EAA2E;gCAC3E,MAAM,CAAC,OAAO,CAAC,gGAAgG,EAAE;oCAC/G,eAAe;oCACf,cAAc,EAAE,QAAQ,CAAC,MAAM;oCAC/B,qBAAqB,EAAE,QAAQ,CAAC,EAAE;iCACnC,CAAC,CAAC;4BACL,CAAC;4BAED,IAAI,GAAG;gCACL,SAAS,EAAE;oCACT,MAAM,EAAE,2BAA2B;oCACnC,SAAS,EAAE,KAAK,CAAC,MAAM;oCACvB,aAAa,EAAE,yBAAyB,EAAE,IAAI,IAAI,SAAS;oCAC3D,SAAS,EAAE,GAAG;iCACf;gCACD,MAAM;gCACN,cAAc,EAAE;oCACd,QAAQ,EAAE,eAAe;oCACzB,SAAS,EAAE,SAAS,CAAC,SAAS;oCAC9B,UAAU,EAAE,SAAS,CAAC,KAAK,GAAG,GAAG;oCACjC,OAAO,EAAE,CAAC;4CACR,IAAI,EAAE,kBAAkB;4CACxB,MAAM,EAAE,CAAC;4CACT,MAAM,EAAE,4BAA4B,yBAAyB,EAAE,IAAI,IAAI,UAAU,6BAA6B;yCAC/G,CAAC;iCACH;gCACD,OAAO,EAAE;oCACP,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,gBAAgB;oCAC9C,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iCAC1F;gCACD,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,GAAG,CAAC;gCACzC,MAAM,EAAE,aAAa;6BACtB,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACN,8FAA8F;4BAE9F,uEAAuE;4BACvE,6FAA6F;4BAC7F,MAAM,aAAa,GAAG,IAAI,GAAG,EAAqD,CAAC;4BACnF,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;gCACvC,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;oCACzB,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;oCACtD,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;wCACpD,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,kBAAkB,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;oCACtG,CAAC;gCACH,CAAC;4BACH,CAAC;4BAED,MAAM,eAAe,GAAuB,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAA4B,EAAE,EAAE,CAAC,CAAC;gCAClG,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,gBAAgB;gCAC1C,MAAM,EAAE,CAAC,CAAC,MAAM;gCAChB,IAAI,EAAE,CAAC,CAAC,IAAI;gCACZ,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCAC7C,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,SAA2B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;6BAC9G,CAAC,CAAC,CAAC;4BACJ,MAAM,GAAG,eAAe,CAAC;4BAEzB,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;4BACrE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gCACxB,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;gCACvE,IAAI,aAAa,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oCACjE,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CACrC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,aAAa,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CACtD,CAAC;oCACF,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;oCACtE,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;wCACxB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oCACxE,CAAC;oCACD,MAAM,CAAC,OAAO,CAAC,mFAAmF,EAAE;wCAClG,YAAY,EAAE,KAAK,CAAC,MAAM;qCAC3B,CAAC,CAAC;gCACL,CAAC;4BACH,CAAC;4BAED,2EAA2E;4BAC3E,mFAAmF;4BACnF,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;4BACxF,MAAM,CAAC,OAAO,CAAC,0DAA0D,EAAE;gCACzE,WAAW,EAAE,KAAK,CAAC,MAAM;gCACzB,eAAe,EAAE,eAAe,IAAI,MAAM;gCAC1C,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;6BACjF,CAAC,CAAC;4BACH,MAAM,WAAW,GAAG,eAAe;gCACjC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAC3C,CAAC,KAAK,CAAC,MAAqB,EAAE,eAA8B,CAAC,EAC7D,EAAE,eAAe,EAAE,mBAAmB,EAAE,CACzC;gCACH,CAAC,CAAC,EAAE,CAAC;4BACP,MAAM,CAAC,OAAO,CAAC,wDAAwD,EAAE;gCACvE,KAAK,EAAE,WAAW,CAAC,MAAM;gCACzB,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;6BACtJ,CAAC,CAAC;4BAEH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;gCAChC,MAAM,eAAe,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAmB,CAAC;gCAC5H,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAC;gCAEvF,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oCACnE,+CAA+C;oCAC/C,iFAAiF;oCACjF,uFAAuF;oCACvF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;oCAC5F,IAAI,WAAW,EAAE,CAAC;wCAChB,MAAM,CAAC,OAAO,CAAC,yCAAyC,EAAE;4CACxD,aAAa,EAAE,QAAQ,CAAC,EAAE;4CAC1B,eAAe;4CACf,cAAc,EAAE,QAAQ,CAAC,MAAM;4CAC/B,SAAS,EAAE,aAAa;yCACzB,CAAC,CAAC;wCACH,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oCAC7C,CAAC;oCACD,SAAS;gCACX,CAAC;qCAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;oCAC7C,mFAAmF;oCACnF,uFAAuF;oCACvF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,gCAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oCACpF,IAAI,SAAS,EAAE,CAAC;wCACd,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;wCAChG,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;wCACvF,IAAI,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;4CACtD,2DAA2D;4CAC3D,qBAAqB,CAAC,IAAI,CAAC;gDACzB,eAAe,EAAE,eAA8B;gDAC/C,SAAS,EAAE,eAAe;gDAC1B,qBAAqB,EAAE,QAAQ,CAAC,EAAyB;gDACzD,cAAc,EAAE,QAAQ,CAAC,MAAM;6CAChC,CAAC,CAAC;4CACH,MAAM,CAAC,OAAO,CAAC,mEAAmE,EAAE;gDAClF,aAAa,EAAE,QAAQ,CAAC,EAAE;gDAC1B,eAAe;gDACf,SAAS,EAAE,SAAS,CAAC,KAAK;6CAC3B,CAAC,CAAC;4CACH,SAAS;wCACX,CAAC;oCACH,CAAC;oCACD,6EAA6E;oCAC7E,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;oCAC5F,IAAI,WAAW,EAAE,CAAC;wCAChB,MAAM,CAAC,IAAI,CAAC,2DAA2D,EAAE;4CACvE,aAAa,EAAE,QAAQ,CAAC,EAAE;4CAC1B,eAAe;4CACf,cAAc,EAAE,SAAS,EAAE,KAAK;yCACjC,CAAC,CAAC;wCACH,wBAAwB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oCAC7C,CAAC;oCACD,SAAS;gCACX,CAAC;qCAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,aAAa,KAAK,QAAQ,EAAE,CAAC;oCACtE,sFAAsF;oCACtF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;oCACzF,IAAI,QAAQ,EAAE,CAAC;wCACb,MAAM,CAAC,OAAO,CAAC,uEAAuE,EAAE;4CACtF,aAAa,EAAE,QAAQ,CAAC,EAAE;4CAC1B,eAAe;4CACf,cAAc,EAAE,QAAQ;4CACxB,SAAS,EAAE,aAAa;yCACzB,CAAC,CAAC;wCACH,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oCAC1C,CAAC;oCACD,SAAS;gCACX,CAAC;qCAAM,IAAI,QAAQ,IAAI,eAAe,EAAE,CAAC;oCACvC,+EAA+E;oCAC/E,gGAAgG;oCAChG,qBAAqB,CAAC,IAAI,CAAC;wCACzB,eAAe,EAAE,eAA8B;wCAC/C,SAAS,EAAE,eAAe;wCAC1B,qBAAqB,EAAE,QAAQ,CAAC,EAAyB;wCACzD,cAAc,EAAE,QAAQ,CAAC,MAAM;qCAChC,CAAC,CAAC;oCACH,MAAM,CAAC,OAAO,CAAC,oFAAoF,EAAE;wCACnG,eAAe;wCACf,cAAc,EAAE,QAAQ,CAAC,MAAM;wCAC/B,qBAAqB,EAAE,QAAQ,CAAC,EAAE;wCAClC,SAAS,EAAE,QAAQ,CAAC,SAAS;qCAC9B,CAAC,CAAC;oCACH,SAAS;gCACX,CAAC;gCACD,qFAAqF;gCACrF,MAAM,CAAC,OAAO,CAAC,4EAA4E,EAAE;oCAC3F,eAAe;oCACf,cAAc,EAAE,QAAQ,CAAC,MAAM;oCAC/B,qBAAqB,EAAE,QAAQ,CAAC,EAAE;oCAClC,SAAS,EAAE,QAAQ,CAAC,SAAS;iCAC9B,CAAC,CAAC;4BACL,CAAC;4BAED,IAAI,GAAG;gCACL,SAAS,EAAE;oCACT,MAAM,EAAE,mBAAmB;oCAC3B,SAAS,EAAE,0BAA0B;oCACrC,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,KAAK,CAAC,uBAAuB;wCACrE,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,uBAAuB,EAAE;wCAChD,CAAC,CAAC,EAAE,CAAC;oCACP,SAAS,EAAE,GAAG;iCACf;gCACD,MAAM;gCACN,cAAc,EAAE;oCACd,QAAQ,EAAE,eAAe;oCACzB,SAAS,EAAE,SAAS,CAAC,SAAS;oCAC9B,UAAU,EAAE,SAAS,CAAC,KAAK,GAAG,GAAG;oCACjC,OAAO,EAAE;wCACP;4CACE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe;4CACjF,MAAM,EAAE,SAAS,CAAC,KAAK,GAAG,GAAG;4CAC7B,MAAM,EAAE,yBAAyB;yCAClC;qCACF;iCACF;gCACD,OAAO,EAAE;oCACP,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oCAC1D,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iCAC1F;gCACD,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,GAAG,GAAG,CAAC;gCACzC,MAAM,EAAE,aAAa;gCACrB,QAAQ,EAAE;oCACR,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,EAAE;iCACnC;6BACF,CAAC;wBACJ,CAAC;wBAED,IAAI,CAAC;4BACH,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACzC,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE;gCACtE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gCACvD,oBAAoB,EAAE,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;6BACxD,CAAC,CAAC;4BACH,SAAS;wBACX,CAAC;wBAED,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;oBAED,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,oBAAoB,CAAC;wBAC1D,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,KAAK,EAAE,cAAc;qBACtB,CAAC,CAAC;oBAEH,MAAM,gBAAgB,GAAG,CAAC,GAAG,wBAAwB,EAAE,GAAG,WAAW,CAAC,CAAC;oBAEvE,MAAM,CAAC,OAAO,CAAC,sCAAsC,EAAE;wBACrD,OAAO,EAAE,WAAW,CAAC,MAAM;wBAC3B,WAAW,EAAE,wBAAwB,CAAC,MAAM;wBAC5C,0BAA0B,EAAE,qBAAqB,CAAC,MAAM;wBACxD,MAAM,EAAE,aAAa;qBACtB,CAAC,CAAC;oBACH,OAAO;wBACL,aAAa,EAAE,gBAAgB;wBAC/B,qBAAqB;wBACrB,oBAAoB;wBACpB,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,SAAS;gCACf,MAAM,EAAE,WAAW,WAAW,CAAC,MAAM,iBAAiB,wBAAwB,CAAC,MAAM,KAAK,qBAAqB,CAAC,MAAM,sBAAsB,oBAAoB,CAAC,MAAM,2BAA2B;gCAClM,IAAI,EAAE;oCACJ,OAAO,EAAE,WAAW,CAAC,MAAM;oCAC3B,WAAW,EAAE,wBAAwB,CAAC,MAAM;oCAC5C,eAAe,EAAE,qBAAqB,CAAC,MAAM;oCAC7C,eAAe,EAAE,oBAAoB,CAAC,MAAM;oCAC5C,WAAW,EAAE,gBAAgB,CAAC,MAAM;oCACpC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iCACnC;6BACF,CAAC;qBACH,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtE,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;oBAClD,OAAO;wBACL,aAAa,EAAE,EAAE;wBACjB,qBAAqB,EAAE,EAAE;wBACzB,KAAK,EAAE,kCAAkC;wBACzC,KAAK,EAAE,CAAC;gCACN,IAAI,EAAE,eAAe;gCACrB,MAAM,EAAE,mBAAmB,MAAM,EAAE;gCACnC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;6BACxB,CAAC;qBACH,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,EACC,CAAC,MAAM,EAAE,EAAE;YACT,MAAM,CAAC,GAAG,MAAiC,CAAC;YAC5C,IAAI,CAAC,EAAE,KAAK;gBAAE,OAAO,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,CAAC,EAAE,aAA0B,CAAC;YAC3C,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,CAAC,CACF,CAAC;QAEF,kEAAkE;QAClE,0CAA0C;QAC1C,kEAAkE;QAElE;;;WAGG;QACH,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YACnE,OAAO,KAAK,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;gBAC/C,MAAM,CAAC,OAAO,CAAC,oCAAoC,EAAE;oBACnD,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,IAAI,aAAiC,CAAC;oBACtC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;wBACpB,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;4BAC5C,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;4BAC5D,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC;yBAC1D,CAAC,CAAC;wBACH,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;4BAC1B,OAAO;gCACL,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE;6BACnG,CAAC;wBACJ,CAAC;wBACD,aAAa,GAAG,KAAK,CAAC,SAAS,CAAC;oBAClC,CAAC;oBAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE;wBACxE,KAAK,EAAE,EAAE;wBACT,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACvD,CAAC,CAAC;oBACH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;oBAE/D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACtB,OAAO;4BACL,UAAU,EAAE;gCACV,KAAK,EAAE,CAAC;gCACR,OAAO,EAAE,sFAAsF;gCAC/F,aAAa,EAAE,EAAE;6BAClB;yBACF,CAAC;oBACJ,CAAC;oBAED,gGAAgG;oBAChG,MAAM,cAAc,GAAG,CAAC,GAA0B,EAAE,EAAE,CACpD,GAAG,CAAC,MAAM;yBACP,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;yBACrF,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;yBACtC,IAAI,EAAE;yBACN,IAAI,CAAC,GAAG,CAAC,CAAC;oBACf,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiC,CAAC;oBACvD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;wBAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBAChC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,IAAI,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;wBAC3E,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,UAAU,IAAI,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5G,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;wBAC5G,MAAM,YAAY,GAAG,QAAQ;4BAC3B,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,YAAY,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;4BAC9G,CAAC,CAAC,CAAC,CAAC;wBACN,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,YAAY,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,GAAG,YAAY,CAAC,EAAE,CAAC;4BAC1F,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;wBACtB,CAAC;oBACH,CAAC;oBACD,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAExC,MAAM,WAAW,GAA2B;wBAC1C,IAAI,EAAE,mBAAmB;wBACzB,iBAAiB,EAAE,cAAc;wBACjC,MAAM,EAAE,QAAQ;wBAChB,IAAI,EAAE,WAAW;wBACjB,YAAY,EAAE,cAAc;wBAC5B,oBAAoB,EAAE,sBAAsB;qBAC7C,CAAC;oBAEF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;wBAC5B,kGAAkG;wBAClG,iGAAiG;wBACjG,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;wBACtH,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;wBACrF,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;wBACrE,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;wBAC9E,wFAAwF;wBACxF,gFAAgF;wBAChF,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;wBAC7F,MAAM,YAAY,GAAG,gBAAgB,EAAE,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;wBAC7E,MAAM,CAAC,WAAW,EAAE,GAAG,mBAAmB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;4BAC9D,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;4BAC7E,GAAG,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE;gCACxC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oCACxC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;oCAC7B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;iCAC3B,CAAC,CAAC;gCACH,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,SAAS,CAAW,CAAC;4BACxE,CAAC,CAAC;yBACH,CAAC,CAAC;wBACH,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;wBACpE,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;wBACrF,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,EAAE,QAAQ,IAAI,YAAY,CAAC;wBAC9D,MAAM,UAAU,GAAG,GAAG,CAAC,cAAc,EAAE,UAAU,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;wBACtG,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAC1G,OAAO;4BACL,EAAE,EAAE,GAAG,CAAC,EAAE;4BACV,SAAS,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;4BACrD,aAAa;4BACb,WAAW;4BACX,SAAS,EAAE,GAAG,CAAC,cAAc,EAAE,SAAS,IAAI,wBAAwB;4BACpE,MAAM,EAAE,GAAG,CAAC,MAAM;4BAClB,QAAQ;4BACR,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI;4BAClD,MAAM;yBACP,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBAEF,OAAO;wBACL,UAAU,EAAE;4BACV,KAAK,EAAE,QAAQ,CAAC,MAAM;4BACtB,OAAO,EAAE,YAAY,QAAQ,CAAC,MAAM,oBAAoB;4BACxD,aAAa,EAAE,QAAQ;yBACxB;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACpD,OAAO;wBACL,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE;qBACtF,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;;;;;WAMG;QACH,MAAM,UAAU,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YACrE,OAAO,KAAK,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,CAAC,OAAO,CAAC,4CAA4C,EAAE;oBAC3D,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,aAAa,EAAE,KAAK,CAAC,aAAa;oBAClC,SAAS,EAAE,KAAK,CAAC,SAAS;iBAC3B,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;wBACzB,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,CAAC;oBACrF,CAAC;oBACD,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;wBACvF,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wDAAwD,EAAE,EAAE,CAAC;oBACjH,CAAC;oBAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBACpE,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC;oBACjF,CAAC;oBACD,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;oBACxF,IAAI,CAAC,WAAW,EAAE,CAAC;wBACjB,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,CAAC;oBAChG,CAAC;oBAED,8EAA8E;oBAC9E,8DAA8D;oBAC9D,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBAC1D,OAAO;4BACL,cAAc,EAAE;gCACd,OAAO,EAAE,KAAK;gCACd,KAAK,EAAE,0EAA0E;6BAClF;yBACF,CAAC;oBACJ,CAAC;oBAED,IAAI,cAAkC,CAAC;oBACvC,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;wBACnC,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CACjC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,CAC9E,CAAC;wBACF,IAAI,WAAW,EAAE,CAAC;4BAChB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;4BAC/E,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC;wBACzB,CAAC;oBACH,CAAC;oBAED,IAAI,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;wBACnC,MAAM,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAC7C,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,MAAM,EACZ,UAAU,EACV,KAAK,CAAC,MAAM,CACb,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,6DAA6D;wBAC7D,4DAA4D;wBAC5D,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CACzC,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAmC,CAC1C,CAAC;oBACJ,CAAC;oBAED,OAAO;wBACL,cAAc,EAAE;4BACd,OAAO,EAAE,IAAI;4BACb,aAAa,EAAE,KAAK,CAAC,aAAa;4BAClC,OAAO,EAAE,iCAAiC,KAAK,CAAC,SAAS,GAAG;4BAC5D,GAAG,CAAC,cAAc,IAAI,EAAE,cAAc,EAAE,CAAC;yBAC1C;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACtD,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,CAAC;gBACxF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,UAAU,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YACrE,OAAO,KAAK,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,CAAC,OAAO,CAAC,qCAAqC,EAAE;oBACpD,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,aAAa,EAAE,KAAK,CAAC,aAAa;iBACnC,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;wBACzB,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,CAAC;oBACrF,CAAC;oBAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBACpE,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC;oBACjF,CAAC;oBACD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;oBACpF,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,CAAC;oBAChG,CAAC;oBAED,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;oBAE5E,OAAO;wBACL,cAAc,EAAE;4BACd,OAAO,EAAE,IAAI;4BACb,aAAa,EAAE,KAAK,CAAC,aAAa;4BAClC,OAAO,EAAE,iCAAiC;yBAC3C;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACtD,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,CAAC;gBACxF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YACnE,OAAO,KAAK,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;gBAC/C,MAAM,CAAC,OAAO,CAAC,kCAAkC,EAAE;oBACjD,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,aAAa,EAAE,KAAK,CAAC,aAAa;iBACnC,CAAC,CAAC;gBAEH,IAAI,CAAC;oBACH,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;wBACzB,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAE,CAAC;oBACrF,CAAC;oBAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBACpE,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,CAAC;oBACjF,CAAC;oBACD,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;oBACxE,IAAI,CAAC,aAAa,EAAE,CAAC;wBACnB,OAAO;4BACL,cAAc,EAAE;gCACd,OAAO,EAAE,KAAK;gCACd,KAAK,EAAE,0BAA0B,GAAG,CAAC,MAAM,mDAAmD;6BAC/F;yBACF,CAAC;oBACJ,CAAC;oBACD,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;oBACxF,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;oBACxF,MAAM,OAAO,GACX,WAAW,EAAE,IAAI,KAAK,YAAY;wBAClC,WAAW,EAAE,IAAI,KAAK,MAAM;wBAC5B,CAAC,WAAW,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC;wBACnD,CAAC,WAAW,EAAE,IAAI,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC;oBACpD,IAAI,CAAC,WAAW,EAAE,CAAC;wBACjB,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAE,CAAC;oBAChG,CAAC;oBACD,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mCAAmC,EAAE,EAAE,CAAC;oBAC5F,CAAC;oBAED,MAAM,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAC7C,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,MAAM,EACZ,SAAS,CACV,CAAC;oBAEF,6DAA6D;oBAC7D,IAAI,UAA8B,CAAC;oBACnC,IAAI,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBACtC,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;oBACtG,CAAC;yBAAM,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBACvC,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC1G,CAAC;yBAAM,CAAC;wBACN,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;oBAC9E,CAAC;oBAED,6FAA6F;oBAC7F,MAAM,QAAQ,GAA+C,IAAI,CAAC,iBAAiB,CAAC;oBACpF,IAAI,QAAQ,EAAE,CAAC;wBACb,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;4BACnC,MAAM,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;wBACnD,CAAC;oBACH,CAAC;oBAED,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBACvE,OAAO;wBACL,cAAc,EAAE;4BACd,OAAO,EAAE,IAAI;4BACb,aAAa,EAAE,GAAG,CAAC,EAAE;4BACrB,QAAQ,EAAE,YAAY;4BACtB,OAAO,EAAE,uDAAuD;yBACjE;qBACF,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;oBACpD,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,CAAC;gBACtF,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF;;;WAGG;QACH,MAAM,qBAAqB,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YAChF,IAAI,CAAC,KAAK,CAAC,aAAa;gBAAE,OAAO,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,+DAA+D,EAAE;oBAC3E,aAAa,EAAE,KAAK,CAAC,aAAa;iBACnC,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,aAAuB,CAAC,CAAC;gBAC9E,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;oBACvG,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAA4B,CAAC;gBAChD,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;gBAExE,oGAAoG;gBACpG,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;uBACxF,mBAAmB,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,iDAAiD,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;oBACvG,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,sEAAsE;gBACtE,MAAM,cAAc,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,CAAC,CAAC;gBACtF,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,oDAAoD,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;oBAC1G,OAAO,EAAE,CAAC;gBACZ,CAAC;gBAED,6CAA6C;gBAC7C,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,GAC3G,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;oBAC3D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;oBAC9D,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAoB,CAAC;oBACpF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;oBAC9D,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;oBACjE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAoB,CAAC;iBACxF,CAAC,CAAC;gBAEL,MAAM,WAAW,GAAG,CAAC,EAAgB,EAAE,EAAE,CAAC,CAAC;oBACzC,EAAE,EAAE,EAAE,CAAC,EAAY;oBACnB,KAAK,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE;oBACvB,WAAW,EAAE,EAAE,CAAC,OAAO,IAAI,EAAE;oBAC7B,UAAU,EAAE,CAAC;iBACd,CAAC,CAAC;gBAEH,MAAM,UAAU,GAAG;oBACjB,EAAE,EAAE,WAAW,CAAC,MAAM;oBACtB,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;oBACnD,OAAO,EAAE;wBACP,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,IAAI,iBAAiB,EAAE,IAAI;wBAC9D,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,IAAI,iBAAiB,EAAE,KAAK,IAAI,SAAS;wBAC1E,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,IAAI,iBAAiB,EAAE,QAAQ,IAAI,SAAS;wBACvF,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM;wBACzC,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS;qBAChD;iBACF,CAAC;gBAEF,MAAM,sBAAsB,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAE7E,MAAM,SAAS,GAAyB;oBACtC,MAAM,EAAE,cAAc,CAAC,MAAM;oBAC7B,aAAa,EAAE,GAAG,CAAC,EAAY;oBAC/B,SAAS,EAAG,GAAG,CAAC,cAAgD,EAAE,SAAS,IAAI,EAAE;oBACjF,WAAW,EAAE,cAAc,CAAC,IAAI,IAAI,MAAM;oBAC1C,SAAS,EAAG,cAAyC,CAAC,SAAmB;oBACzE,aAAa,EAAE;wBACb,EAAE,EAAE,cAAc,CAAC,MAAM;wBACzB,OAAO,EAAE,sBAAsB;wBAC/B,OAAO,EAAE;4BACP,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,IAAI,gBAAgB,EAAE,IAAI;4BAChE,GAAG,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,IAAI,gBAAgB,EAAE,KAAK,IAAI,SAAS;4BAC5E,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,IAAI,gBAAgB,EAAE,QAAQ,IAAI,SAAS;4BACzF,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM;4BAC5C,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,SAAS;yBACnD;qBACF;iBACF,CAAC;gBAEF,iDAAiD;gBACjD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;gBAClD,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;oBACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,SAAS,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;oBACnH,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,CAAC;yBACjD,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;yBACvC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChB,IAAI,MAAM;wBAAE,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC/D,CAAC;gBAED,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAC/C,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAC9C,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAC7B;oBACE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,CAAC;oBAChE,qBAAqB,EAAE,eAAe;oBACtC,SAAS,EAAE,sBAAsB;oBACjC,OAAO,EAAE,SAAS;iBACnB,CACF,CAAC;gBAEF,0EAA0E;gBAC1E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACzD,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,CAAC;wBACxC,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;4BACvE,MAAM,CAAC,IAAI,CAAC,wDAAwD,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;wBAC/G,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;oBAC5D,aAAa,EAAE,GAAG,CAAC,EAAE;oBACrB,QAAQ,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;iBACrC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBACrG,OAAO,EAAE,KAAK,EAAE,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACtG,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF;;;;;WAKG;QACH,MAAM,uBAAuB,GAAG,KAAK,EAAE,KAAyC,EAAE,EAAE;YAClF,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;YACxC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iDAAiD,EAAE,EAAE,CAAC;YAC1G,CAAC;YAED,IAAI,GAAG,CAAC;YACR,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,aAAuB,CAAC,CAAC;YACpE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;YAC1I,CAAC;YACD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,CAAC;YAChF,CAAC;YAED,MAAM,eAAe,GAAI,GAAG,CAAC,MAA6B;iBACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;YAC7D,IAAI,CAAC,eAAe,EAAE,CAAC;gBACrB,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iDAAiD,EAAE,EAAE,CAAC;YAC1G,CAAC;YACD,IAAI,eAAe,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtC,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,EAAE,CAAC;YACxF,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,aAAuB,EAAE,MAAgB,EAAE,IAAI,CAAC,CAAC;YACpH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,EAAE,CAAC;YACpF,CAAC;YAED,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAuB,EAAE,MAAgB,CAAC,CAAC;YAC/E,CAAC;YAED,OAAO,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;QAC9D,CAAC,CAAC;QAEF,kEAAkE;QAClE,gCAAgC;QAChC,kEAAkE;QAElE;;WAEG;QACH,MAAM,WAAW,GAAG,CAAC,KAAyC,EAAU,EAAE;YACxE,MAAM,IAAI,GAAG,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC;YAC7C,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,MAAM,CAAC;YACnC,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YACvC,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,YAAY,CAAC;YAC3C,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,MAAM,CAAC;YACnC,IAAI,IAAI,KAAK,qBAAqB;gBAAE,OAAO,kBAAkB,CAAC;YAC9D,IAAI,IAAI,KAAK,oBAAoB;gBAAE,OAAO,oBAAoB,CAAC;YAC/D,IAAI,IAAI,KAAK,sBAAsB;gBAAE,OAAO,sBAAsB,CAAC;YACnE,6CAA6C;YAC7C,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF;;;WAGG;QACH,MAAM,uBAAuB,GAAG,CAAC,KAAyC,EAAU,EAAE;YACpF,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;gBAC/D,OAAO,GAAG,CAAC;YACb,CAAC;YACD,6EAA6E;YAC7E,IAAI,KAAK,CAAC,aAAa,KAAK,oBAAoB,EAAE,CAAC;gBACjD,MAAM,CAAC,OAAO,CAAC,6DAA6D,EAAE;oBAC5E,gBAAgB,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;iBAC1C,CAAC,CAAC;gBACH,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;YACtD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,wBAAwB,GAAG,CAAC,KAAyC,EAAU,EAAE;YACrF,IAAI,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrD,MAAM,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;gBACnE,OAAO,GAAG,CAAC;YACb,CAAC;YACD,MAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;YACxD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,4BAA4B,GAAG,CAAC,KAAyC,EAAU,EAAE;YACzF,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC;gBAChC,MAAM,CAAC,OAAO,CAAC,kEAAkE,CAAC,CAAC;gBACnF,OAAO,GAAG,CAAC;YACb,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC;QAEF;;WAEG;QACH,MAAM,yBAAyB,GAAG,CAAC,KAAyC,EAAU,EAAE;YACtF,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;gBACxE,OAAO,GAAG,CAAC;YACb,CAAC;YACD,OAAO,kBAAkB,CAAC;QAC5B,CAAC,CAAC;QAEF,kEAAkE;QAClE,iBAAiB;QACjB,kEAAkE;QAElE,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,qBAAqB,CAAC;YACpD,gBAAgB;aACf,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC;aACzB,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;aAC3B,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;aAC/B,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC;aACnC,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC;aACrC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;aAC/B,OAAO,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;aAChD,OAAO,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;aAChD,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;YAChC,aAAa;aACZ,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC;aACzB,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;aAC7B,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC;aACjC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC;aACzB,OAAO,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;aACpD,OAAO,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;YAEzD,qCAAqC;aACpC,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE;YACvC,IAAI,EAAE,MAAM;YACZ,gBAAgB,EAAE,kBAAkB;YACpC,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,YAAY;YACxB,IAAI,EAAE,MAAM;YACZ,kBAAkB,EAAE,oBAAoB;YACxC,oBAAoB,EAAE,sBAAsB;SAC7C,CAAC;YAEF,sFAAsF;aACrF,mBAAmB,CAAC,kBAAkB,EAAE,yBAAyB,EAAE;YAClE,gBAAgB,EAAE,kBAAkB;YACpC,CAAC,GAAG,CAAC,EAAE,GAAG;SACX,CAAC;aACD,OAAO,CAAC,kBAAkB,EAAE,SAAS,CAAC;YAEvC,yBAAyB;aACxB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC;aAC1B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC;aAClC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC;YAErC,wDAAwD;aACvD,mBAAmB,CAAC,MAAM,EAAE,uBAAuB,EAAE;YACpD,KAAK,EAAE,OAAO;YACd,UAAU,EAAE,YAAY;YACxB,CAAC,GAAG,CAAC,EAAE,GAAG;SACX,CAAC;YAEF,uDAAuD;aACtD,mBAAmB,CAAC,OAAO,EAAE,wBAAwB,EAAE;YACtD,OAAO,EAAE,SAAS;YAClB,CAAC,GAAG,CAAC,EAAE,GAAG;SACX,CAAC;aACD,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;aAE/B,mBAAmB,CAAC,WAAW,EAAE,4BAA4B,EAAE;YAC9D,UAAU,EAAE,YAAY;YACxB,CAAC,GAAG,CAAC,EAAE,GAAG;SACX,CAAC;YAEF,4DAA4D;YAC5D,oFAAoF;YACpF,mFAAmF;YACnF,gFAAgF;YAChF,sFAAsF;aACrF,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC;aACnC,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC;aAChC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC;aAC7B,mBAAmB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACxC,IAAI,KAAK,CAAC,aAAa,KAAK,oBAAoB;gBAAE,OAAO,GAAG,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAAE,OAAO,GAAG,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC;YACzE,OAAO,WAAW,CAAC;QACrB,CAAC,EAAE;YACD,SAAS,EAAE,WAAW;YACtB,CAAC,GAAG,CAAC,EAAE,GAAG;SACX,CAAC;aACD,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAE7B,OAAO,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["/**\n * Opportunity Graph: Linear Multi-Step Workflow for Opportunity Discovery\n *\n * Architecture: Follows intent graph pattern with Annotation-based state.\n * Flow: Prep → Scope → Discovery → Evaluation → Ranking → Persist → END\n *\n * Key Constraints:\n * - Opportunities only between intents sharing the same index\n * - Both intents must have hyde documents for semantic matching\n * - Non-indexed intents cannot participate in discovery\n *\n * Constructor injects Database, Embedder, and compiled HyDE graph.\n */\n\nimport { StateGraph, START, END, Annotation } from '@langchain/langgraph';\nimport type { Id } from '../shared/interfaces/database.interface.js';\nimport type { DebugMetaAgent } from '../chat/chat-streaming.types.js';\nimport {\n OpportunityGraphState,\n type IndexedIntent,\n type SourceProfileData,\n type TargetNetwork,\n type CandidateMatch,\n type EvaluatedCandidate,\n type EvaluatedOpportunity,\n type EvaluatedOpportunityActor,\n} from './opportunity.state.js';\nimport { resolveInitialStatus } from './opportunity.state.js';\nimport {\n OpportunityEvaluator,\n type CandidateProfile,\n type EvaluatedOpportunityWithActors,\n type EvaluatorEntity,\n type EvaluatorInput,\n} from './opportunity.evaluator.js';\nimport type { OpportunityGraphDatabase } from '../shared/interfaces/database.interface.js';\nimport { IntentIndexer } from '../intent/intent.indexer.js';\nimport { getModelName } from '../shared/agent/model.config.js';\nimport { validateOpportunityActors } from './opportunity.utils.js';\nimport { viewerCentricCardSummary } from './opportunity.presentation.js';\n\n/** Optional evaluator for testing (avoids LLM calls). */\nexport type OpportunityEvaluatorLike = {\n invoke?: (\n sourceProfileContext: string,\n candidates: CandidateProfile[],\n options: { minScore?: number }\n ) => Promise<Array<{\n sourceId: string;\n candidateId: string;\n score: number;\n reasoning: string;\n valencyRole: 'Agent' | 'Patient' | 'Peer';\n }>>;\n invokeEntityBundle?: (input: EvaluatorInput, options: { minScore?: number }) => Promise<Array<{\n reasoning: string;\n score: number;\n actors: Array<{ userId: string; role: 'agent' | 'patient' | 'peer'; intentId?: string | null; evidenceKey?: string | null }>;\n }>>;\n};\nimport type { Embedder, LensEmbedding } from '../shared/interfaces/embedder.interface.js';\nimport type {\n CreateOpportunityData,\n Opportunity,\n OpportunityActor,\n ActiveIntent,\n} from '../shared/interfaces/database.interface.js';\nimport { persistOpportunities } from './opportunity.persist.js';\nimport { INTRODUCER_DISCOVERY_SOURCE } from './opportunity.introducer.js';\nimport { negotiateCandidates, type NegotiationCandidate, type OnNegotiationResolved } from \"../negotiation/negotiation.graph.js\";\nimport { AMBIENT_PARK_WINDOW_MS } from \"../negotiation/negotiation.tools.js\";\nimport {\n buildDiscoverySummary,\n toDiscoveryNegotiation,\n type NegotiationResolution,\n} from \"./negotiation-summary.builder.js\";\nimport type { NegotiationGraphLike } from \"../negotiation/negotiation.state.js\";\nimport type { AgentDispatcher } from \"../shared/interfaces/agent-dispatcher.interface.js\";\nimport { protocolLogger, withCallLogging } from '../shared/observability/protocol.logger.js';\nimport { timed } from '../shared/observability/performance.js';\nimport { renderNetworkContext } from '../shared/network/metadata.renderer.js';\nimport { requestContext } from \"../shared/observability/request-context.js\";\nimport type { OpportunityEvidence } from '../shared/schemas/network-assignment.schema.js';\nimport {\n mergeOpportunityEvidence,\n withCandidateEvidence,\n withMatchedStrategies,\n} from './opportunity.evidence.js';\n\nconst logger = protocolLogger('OpportunityGraph');\n\n/** Time window for persist-node dedup. Parallel jobs arrive within seconds; 10 min catches those while allowing new opportunities for long-connected pairs. */\nconst DEDUP_WINDOW_MS = 10 * 60 * 1000;\n\n/** Default cap for source premises used by premise-to-premise discovery. Prevents BACKEND-5-style fan-out. */\nconst DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT = 40;\n\n/** Per-source cap for candidate premise matches. */\nconst PREMISE_MATCH_LIMIT_PER_SOURCE = 20;\n\n/** Resolve the source premise discovery cap from env, preserving 0 as an explicit disable switch. */\nfunction getSourcePremiseDiscoveryLimit(): number {\n const raw = process.env.DISCOVERY_SOURCE_PREMISE_LIMIT;\n if (raw === undefined || raw.trim() === '') return DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT;\n}\n\nfunction buildEvaluatorEvidenceKey(candidate: CandidateMatch): string {\n return [\n candidate.candidateUserId,\n candidate.networkId,\n candidate.candidateIntentId ?? candidate.candidatePremiseId ?? candidate.sourceContextId ?? 'profile',\n ].join(':');\n}\n\n/** Input shape for the HyDE graph invoke call (query-based embedding). */\nexport interface HydeGeneratorInvokeInput {\n sourceType: 'query';\n sourceText: string;\n forceRegenerate?: boolean;\n profileContext?: string;\n}\n\n/** Optional notifier for opportunity send; when omitted, the real queue is used via dynamic import. */\nexport type QueueOpportunityNotificationFn = (\n opportunityId: string,\n recipientId: string,\n priority: 'immediate' | 'high' | 'low'\n) => Promise<unknown>;\n\n/**\n * Builds a compact text summary of the discoverer's profile and active intents\n * for use as profileContext in HyDE generation.\n * @param profile - The discoverer's profile data (identity, attributes)\n * @param intents - The discoverer's indexed intents (capped at 5)\n * @returns A context string, or undefined if no meaningful data is available\n */\nexport function buildDiscovererContext(\n profile: SourceProfileData | null | undefined,\n intents: IndexedIntent[] | undefined\n): string | undefined {\n const lines: string[] = [];\n\n if (profile) {\n const identity = profile.identity;\n const attrs = profile.attributes;\n if (identity?.name || identity?.bio) {\n lines.push(`Profile: ${[identity.name, identity.bio].filter(Boolean).join(', ')}`);\n }\n if (identity?.location) {\n lines.push(`Location: ${identity.location}`);\n }\n if (attrs?.skills?.length) {\n lines.push(`Skills: ${attrs.skills.join(', ')}`);\n }\n if (attrs?.interests?.length) {\n lines.push(`Interests: ${attrs.interests.join(', ')}`);\n }\n }\n\n if (intents?.length) {\n // indexedIntents preserves DB order from getActiveIntents (newest first),\n // so slice(0, 5) is deterministic without an explicit sort.\n const capped = intents.slice(0, 5);\n lines.push('');\n lines.push('Active intents:');\n for (const intent of capped) {\n lines.push(`- ${intent.payload}`);\n }\n }\n\n return lines.length > 0 ? lines.join('\\n') : undefined;\n}\n\n/**\n * Build a networkContexts map for the evaluator from a set of entities.\n * Fetches network data, checks permissions.contextInjection.discovery,\n * and renders context for eligible networks.\n */\nasync function buildNetworkContexts(\n entities: EvaluatorEntity[],\n database: Pick<OpportunityGraphDatabase, 'getNetwork'>,\n): Promise<Record<string, string>> {\n const networkIds = [...new Set(entities.map((e) => e.networkId))];\n const networks = await Promise.all(networkIds.map((nid) => database.getNetwork(nid).then((n) => ({ nid, n }))));\n const contexts: Record<string, string> = {};\n for (const { nid, n: network } of networks) {\n if (!network) continue;\n const perms = (network.permissions ?? {}) as Record<string, unknown>;\n const injection = perms.contextInjection as { discovery?: boolean } | undefined;\n if (injection?.discovery === false) continue;\n contexts[nid] = renderNetworkContext({\n type: network.type ?? 'community',\n title: network.title,\n prompt: network.prompt,\n metadata: network.metadata ?? {},\n });\n }\n return contexts;\n}\n\n/**\n * Factory class to build and compile the Opportunity Graph.\n * Uses dependency injection for testability.\n */\nexport class OpportunityGraphFactory {\n constructor(\n private database: OpportunityGraphDatabase,\n private embedder: Embedder,\n private hydeGenerator: {\n invoke: (input: HydeGeneratorInvokeInput) => Promise<{\n hydeEmbeddings: Record<string, number[]>;\n lenses?: Array<{ label: string; corpus: 'profiles' | 'intents' | 'premises' }>;\n hydeDocuments?: Record<string, { hydeText?: string; lens?: string }>;\n }>;\n },\n private optionalEvaluator?: OpportunityEvaluatorLike,\n private queueNotification?: QueueOpportunityNotificationFn,\n private negotiationGraph?: NegotiationGraphLike,\n /**\n * Used on the chat path to decide whether to wait for the user's personal\n * agent (long timeout) or fall back to the system agent immediately\n * (short timeout). Without it, the chat path always uses a short timeout.\n */\n private agentDispatcher?: Pick<AgentDispatcher, 'hasPersonalAgent'>,\n /**\n * Callback to enqueue a negotiate_existing job for an opportunity.\n * When provided, negotiate_existing mode uses this to queue follow-up\n * negotiations after introducer approval.\n */\n private queueNegotiateExisting?: (opportunityId: string, userId: string) => Promise<void>,\n ) {}\n\n public createGraph() {\n const evaluatorAgent = this.optionalEvaluator ?? new OpportunityEvaluator();\n\n // ═══════════════════════════════════════════════════════════════\n // NODE DEFINITIONS\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * Wraps a graph node function to emit agent_start/agent_end trace events\n * at its boundaries so the frontend TRACE panel shows real-time progress.\n * @param traceName - Kebab-case agent name (e.g. \"opportunity-prep\")\n * @param nodeFn - The original node function\n * @param summaryFn - Optional function to derive a summary string from the node result\n */\n function withNodeTrace<S, R>(\n traceName: string,\n nodeFn: (state: S) => Promise<R>,\n summaryFn?: (result: R) => string | undefined,\n ): (state: S) => Promise<R> {\n return async (state: S) => {\n const traceEmitter = requestContext.getStore()?.traceEmitter;\n const nodeStart = Date.now();\n traceEmitter?.({ type: \"agent_start\", name: traceName });\n try {\n const result = await nodeFn(state);\n const durationMs = Date.now() - nodeStart;\n const summary = summaryFn?.(result) ?? undefined;\n traceEmitter?.({ type: \"agent_end\", name: traceName, durationMs, summary });\n return result;\n } catch (err) {\n const durationMs = Date.now() - nodeStart;\n const errMsg = err instanceof Error ? err.message : String(err);\n traceEmitter?.({ type: \"agent_end\", name: traceName, durationMs, summary: `error: ${errMsg}` });\n throw err;\n }\n };\n }\n\n /**\n * Node 0: Prep\n * Fetches user's index memberships and validates requirements.\n * Returns empty if user has no index memberships (requirement).\n */\n const prepNode = withNodeTrace(\n \"opportunity-prep\",\n async (state: typeof OpportunityGraphState.State) =>\n timed(\"OpportunityGraph.prep\", async () =>\n withCallLogging(\n logger,\n '[Graph:Prep] prepNode',\n {\n userId: state.userId,\n hasSearchQuery: !!state.searchQuery,\n requestedIndexId: state.networkId ?? undefined,\n },\n async () => {\n // Use getNetworkMemberships (all memberships) for search scope — NOT getUserIndexIds\n // (which filters by autoAssign=true and is intended only for intent assignment).\n const memberships = await this.database.getNetworkMemberships(state.userId);\n const userNetworkIds = memberships.map(m => m.networkId) as Id<'networks'>[];\n if (userNetworkIds.length === 0) {\n logger.verbose('[Graph:Prep] User has no network memberships - cannot find opportunities');\n return {\n userNetworks: [] as Id<'networks'>[],\n sourceProfile: null,\n error: 'You need to join at least one network to find opportunities.',\n };\n }\n const discoveryUserId = state.onBehalfOfUserId ?? state.userId;\n const [intents, profile] = await Promise.all([\n this.database.getActiveIntents(discoveryUserId),\n this.database.getProfile(discoveryUserId),\n ]);\n const indexedIntents: IndexedIntent[] = intents.map((intent: ActiveIntent) => ({\n intentId: intent.id,\n payload: intent.payload,\n summary: intent.summary ?? undefined,\n indexes: [],\n }));\n const sourceProfile = profile\n ? {\n identity: profile.identity ?? undefined,\n narrative: profile.narrative ?? undefined,\n attributes: profile.attributes ?? undefined,\n }\n : null;\n // Source premises are loaded after scope is resolved so premise discovery\n // only uses premises assigned to the target network(s), and only up to\n // DISCOVERY_SOURCE_PREMISE_LIMIT. Loading all premises here caused\n // BACKEND-5: thousands of parallel vector searches for premise-rich users.\n const sourcePremises: Array<{ premiseId: Id<'premises'>; embedding: number[] }> = [];\n const contextToIntentEnabled = process.env.DISCOVERY_CONTEXT_TO_INTENT !== '0';\n const rawContexts = contextToIntentEnabled && typeof this.database.getUserContexts === 'function'\n ? await this.database.getUserContexts(discoveryUserId)\n : [];\n const sourceContexts = rawContexts\n .filter((c: { id: string; networkId: string; embedding: number[] | null }) => c.embedding && c.embedding.length > 0 && userNetworkIds.includes(c.networkId as Id<'networks'>))\n .map((c: { id: string; networkId: string; embedding: number[] | null }) => ({\n contextId: c.id,\n networkId: c.networkId as Id<'networks'>,\n embedding: c.embedding!,\n }));\n return {\n userNetworks: userNetworkIds,\n indexedIntents,\n sourceProfile,\n sourcePremises,\n sourceContexts,\n trace: [{\n node: \"prep\",\n detail: `${userNetworkIds.length} network(s), ${intents.length} intent(s), premise discovery deferred, ${sourceContexts.length} context(s), ${profile ? 'profile loaded' : 'no profile'}`,\n }],\n };\n },\n { context: { userId: state.userId }, logOutput: true }\n ).catch((error) => {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Prep] Failed', { error });\n return {\n error: 'Failed to prepare opportunity search. Please try again.',\n trace: [{\n node: \"prep_fatal\",\n detail: `Prep failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n })\n ),\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const indexes = r?.userNetworks as unknown[];\n const intents = r?.indexedIntents as unknown[];\n return indexes && intents ? `${indexes.length} index(es), ${intents.length} intent(s)` : undefined;\n },\n );\n\n /**\n * Node 1: Scope\n * Determines which indexes to search within.\n * If networkId provided: searches only that index.\n * Otherwise: searches all user's indexes.\n */\n const scopeNode = withNodeTrace(\n \"opportunity-scope\",\n async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.scope\", async () => {\n logger.verbose('[Graph:Scope] Determining search scope', {\n requestedIndexId: state.networkId,\n userNetworksCount: state.userNetworks.length,\n });\n\n try {\n let targetIndexIds: Id<'networks'>[];\n\n if (state.networkId) {\n // Validate user is member or owner of requested network\n const isInScope = state.userNetworks.includes(state.networkId);\n const isOwner = !isInScope && await this.database.isIndexOwner(state.networkId, state.userId);\n if (!isInScope && !isOwner) {\n logger.warn('[Graph:Scope] User not member of requested network', {\n networkId: state.networkId,\n });\n return {\n targetNetworks: [],\n error: 'You are not a member of that network.',\n };\n }\n targetIndexIds = [state.networkId];\n } else if (state.indexScope && state.indexScope.length > 0) {\n // Bounded scope (e.g. a network-scoped agent's reachable indexes):\n // intersect with the user's actual memberships so discovery never\n // reaches networks outside the agent's bound scope.\n const allowed = new Set(state.indexScope);\n targetIndexIds = state.userNetworks.filter((n) => allowed.has(n));\n logger.verbose('[Graph:Scope] Applied indexScope intersection', {\n indexScopeCount: state.indexScope.length,\n userNetworksCount: state.userNetworks.length,\n targetCount: targetIndexIds.length,\n });\n } else {\n // Search all user's indexes\n targetIndexIds = state.userNetworks;\n }\n\n // Fetch index details\n const targetNetworks: TargetNetwork[] = await Promise.all(\n targetIndexIds.map(async (networkId) => {\n const index = await this.database.getNetwork(networkId);\n const memberCount = await this.database.getNetworkMemberCount(networkId);\n return {\n networkId,\n title: index?.title ?? 'Unknown',\n memberCount,\n };\n })\n );\n\n logger.verbose('[Graph:Scope] Scope determined', {\n targetIndexesCount: targetNetworks.length,\n indexes: targetNetworks.map(i => i.title),\n });\n\n // ── Populate index relevancy scores for dedup tie-breaking ──\n let indexRelevancyScores: Record<string, number> = {};\n\n if (state.triggerIntentId) {\n // Background path: look up persisted scores from intent_indexes\n try {\n const scores = await this.database.getIntentIndexScores(state.triggerIntentId);\n for (const { networkId, relevancyScore } of scores) {\n if (relevancyScore != null) {\n indexRelevancyScores[networkId] = relevancyScore;\n }\n }\n } catch (err) {\n logger.warn('[Graph:Scope] Failed to load intent index scores', { triggerIntentId: state.triggerIntentId, error: err });\n }\n } else if (state.searchQuery?.trim()) {\n // Chat path: score query against target indexes in parallel\n try {\n const indexer = new IntentIndexer();\n const scopeAgentTimings: DebugMetaAgent[] = [];\n const scorableIndexes = targetNetworks.filter(ti => ti.title !== 'Unknown');\n const scoringPromises = scorableIndexes.map(async (ti) => {\n const ctx = await this.database.getNetworkMemberContext(ti.networkId, state.userId);\n if (!ctx?.indexPrompt?.trim() && !ctx?.memberPrompt?.trim()) {\n return { networkId: ti.networkId, score: 1.0 };\n }\n const _indexerStart = Date.now();\n const traceEmitter = requestContext.getStore()?.traceEmitter;\n traceEmitter?.({ type: \"agent_start\", name: \"intent-indexer\" });\n let result: Awaited<ReturnType<typeof indexer.invoke>> | null = null;\n try {\n result = await indexer.invoke(\n state.searchQuery!,\n ctx?.indexPrompt ?? null,\n ctx?.memberPrompt ?? null,\n );\n } catch {\n return { networkId: ti.networkId, score: 1.0 };\n } finally {\n const _indexerDuration = Date.now() - _indexerStart;\n traceEmitter?.({ type: \"agent_end\", name: \"intent-indexer\", durationMs: _indexerDuration, summary: `Scored index ${ti.networkId}` });\n scopeAgentTimings.push({ name: 'intent.indexer', durationMs: _indexerDuration });\n }\n if (!result) return { networkId: ti.networkId, score: 1.0 };\n const score = ctx?.indexPrompt && ctx?.memberPrompt\n ? result.indexScore * 0.6 + result.memberScore * 0.4\n : ctx?.indexPrompt ? result.indexScore : result.memberScore;\n return { networkId: ti.networkId, score };\n });\n const results = await Promise.all(scoringPromises);\n for (const { networkId, score } of results) {\n indexRelevancyScores[networkId] = score;\n }\n // Accumulate indexer timings into graph state\n if (scopeAgentTimings.length > 0) {\n return {\n targetNetworks,\n indexRelevancyScores,\n agentTimings: scopeAgentTimings,\n trace: [{\n node: \"scope\",\n detail: `Searching ${targetNetworks.length} index(es): ${targetNetworks.map(i => `${i.title} (${i.memberCount})`).join(', ')}`,\n data: { totalMembers: targetNetworks.reduce((sum, i) => sum + i.memberCount, 0) },\n }],\n };\n }\n } catch (err) {\n logger.warn('[Graph:Scope] Failed to score query against indexes', { error: err });\n }\n }\n\n const totalMembers = targetNetworks.reduce((sum, i) => sum + i.memberCount, 0);\n return {\n targetNetworks,\n indexRelevancyScores,\n trace: [{\n node: \"scope\",\n detail: `Searching ${targetNetworks.length} index(es): ${targetNetworks.map(i => `${i.title} (${i.memberCount})`).join(', ')}`,\n data: { totalMembers },\n }],\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Scope] Failed', { error });\n return {\n targetNetworks: [],\n error: 'Failed to determine search scope.',\n trace: [{\n node: \"scope_fatal\",\n detail: `Scope failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const indexes = r?.targetNetworks as unknown[];\n return indexes ? `${indexes.length} index(es) in scope` : undefined;\n },\n );\n\n /**\n * Node 2: Resolve\n * Resolves trigger intent from triggerIntentId or searchQuery vs indexedIntents;\n * sets discoverySource, resolvedTriggerIntentId, resolvedIntentInIndex for routing (path A/B/C).\n */\n const resolveNode = withNodeTrace(\n \"opportunity-resolve\",\n async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.resolve\", async () => {\n logger.verbose('[Graph:Resolve] Resolving intent and index membership', {\n triggerIntentId: state.triggerIntentId,\n hasSearchQuery: !!state.searchQuery,\n indexedIntentsCount: state.indexedIntents.length,\n });\n\n const targetIndexIds = state.targetNetworks.map((t) => t.networkId);\n\n try {\n let resolvedIntentId: Id<'intents'> | undefined;\n if (state.triggerIntentId) {\n const inNetwork = await this.database.getNetworkIdsForIntent(state.triggerIntentId);\n const inTarget = inNetwork.some((id) => targetIndexIds.includes(id as Id<'networks'>));\n resolvedIntentId = state.triggerIntentId;\n const resolvedIntentInIndex = inTarget;\n const discoverySource = resolvedIntentInIndex ? ('intent' as const) : ('profile' as const);\n return {\n resolvedTriggerIntentId: resolvedIntentId,\n resolvedIntentInIndex,\n discoverySource,\n };\n }\n\n if (state.searchQuery?.trim() && state.indexedIntents.length > 0) {\n const q = state.searchQuery.trim().toLowerCase();\n const matched = state.indexedIntents.find((i) => i.payload?.toLowerCase().includes(q));\n if (matched) {\n resolvedIntentId = matched.intentId;\n const inNetwork = await this.database.getNetworkIdsForIntent(matched.intentId);\n const resolvedIntentInIndex = inNetwork.some((id) => targetIndexIds.includes(id as Id<'networks'>));\n const discoverySource = resolvedIntentInIndex ? ('intent' as const) : ('profile' as const);\n return {\n resolvedTriggerIntentId: resolvedIntentId,\n resolvedIntentInIndex,\n discoverySource,\n };\n }\n logger.warn('[Graph:Resolve] No intent matched search query; leaving resolvedIntentId unset', {\n searchQuery: state.searchQuery,\n indexedIntentsCount: state.indexedIntents.length,\n });\n }\n\n return {\n resolvedTriggerIntentId: undefined,\n resolvedIntentInIndex: false,\n discoverySource: 'profile' as const,\n };\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n logger.error('[Graph:Resolve] Failed', {\n triggerIntentId: state.triggerIntentId,\n searchQuery: state.searchQuery,\n error: err,\n });\n return {\n resolvedTriggerIntentId: undefined,\n resolvedIntentInIndex: false,\n discoverySource: 'profile' as const,\n error: errMsg || 'Resolve failed',\n trace: [{\n node: \"resolve_fatal\",\n detail: `Resolve failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n return r?.discoverySource ? `source: ${r.discoverySource}` : undefined;\n },\n );\n\n /**\n * Node 3: Discovery\n * Generates HyDE embeddings and performs semantic search.\n */\n const discoveryNode = withNodeTrace(\n \"opportunity-discovery\",\n async (state: typeof OpportunityGraphState.State) => {\n const self = this;\n return timed(\"OpportunityGraph.discovery\", async () => {\n const startTime = Date.now();\n const discoveryUserId = state.onBehalfOfUserId ?? state.userId;\n\n /** Filter candidates to targetUserId when set (direct-connection mode). */\n const filterByTarget = (candidates: CandidateMatch[]): CandidateMatch[] => {\n if (!state.targetUserId) return candidates;\n const filtered = candidates.filter(c => c.candidateUserId === state.targetUserId);\n logger.verbose('[Graph:Discovery] targetUserId filter applied', {\n targetUserId: state.targetUserId,\n before: candidates.length,\n after: filtered.length,\n });\n return filtered;\n };\n\n // Shared variable to capture lens input data from runQueryHydeDiscovery or intent path\n let discoveryLensInput: { profileContext: string | undefined; model: string } | undefined;\n // Shared variable to capture HyDE output (lenses + documents) for trace entries\n let discoveryHydeOutput: { lenses: Array<{ label: string; corpus: string }>; hydeDocuments: Record<string, { hydeText?: string }> } | undefined;\n\n logger.verbose('[Graph:Discovery] Starting semantic search', {\n targetIndexesCount: state.targetNetworks.length,\n discoverySource: state.discoverySource,\n searchQueryPreview: state.searchQuery?.trim().slice(0, 60) ?? '(none)',\n });\n\n try {\n if (state.targetNetworks.length === 0) {\n logger.warn('[Graph:Discovery] No target indexes for search');\n return { candidates: [] };\n }\n\n // ── Direct-connection fast path ──\n // When targetUserId is set (user @-mentioned someone), bypass vector search\n // and construct candidates directly from shared indexes.\n if (state.targetUserId) {\n if (state.targetUserId === discoveryUserId) {\n logger.warn('[Graph:Discovery] Direct-connection target matches discoverer; skipping self-match', {\n targetUserId: state.targetUserId,\n });\n return {\n candidates: [],\n trace: [{\n node: \"discovery\",\n detail: \"Direct connection skipped: target user is discoverer\",\n data: { targetUserId: state.targetUserId },\n }],\n };\n }\n logger.verbose('[Graph:Discovery] Direct-connection mode — bypassing vector search', {\n targetUserId: state.targetUserId,\n });\n const targetMemberships = await this.database.getNetworkMemberships(state.targetUserId);\n const targetUserIndexIds = targetMemberships.map(m => m.networkId);\n const sharedIndexIds = state.targetNetworks\n .filter(ti => targetUserIndexIds.includes(ti.networkId))\n .map(ti => ti.networkId);\n\n if (sharedIndexIds.length === 0) {\n logger.warn('[Graph:Discovery] Target user shares no indexes with discoverer', {\n targetUserId: state.targetUserId,\n discovererIndexes: state.targetNetworks.map(ti => ti.networkId),\n });\n return {\n candidates: [],\n trace: [{\n node: \"discovery\",\n detail: `Direct connection: target user shares no indexes`,\n data: { targetUserId: state.targetUserId },\n }],\n };\n }\n\n // Fetch target user's active intents to build intent-level candidates\n const targetIntents = await this.database.getActiveIntents(state.targetUserId);\n const directCandidates: CandidateMatch[] = [];\n\n if (targetIntents.length > 0) {\n // Build one candidate per intent per shared index it belongs to\n for (const intent of targetIntents) {\n const intentNetworkIds = await this.database.getNetworkIdsForIntent(intent.id);\n const overlapping = sharedIndexIds.filter(id => intentNetworkIds.includes(id));\n for (const networkId of overlapping) {\n directCandidates.push(withCandidateEvidence({\n candidateUserId: state.targetUserId,\n candidateIntentId: intent.id as Id<'intents'>,\n networkId,\n similarity: 1.0,\n lens: 'explicit_mention',\n candidatePayload: intent.payload,\n candidateSummary: intent.summary ?? undefined,\n discoverySource: 'query',\n }));\n }\n }\n }\n\n // Always add a profile-level candidate (so evaluation runs even without intents)\n if (directCandidates.length === 0) {\n directCandidates.push(withCandidateEvidence({\n candidateUserId: state.targetUserId,\n networkId: sharedIndexIds[0] as Id<'networks'>,\n similarity: 1.0,\n lens: 'explicit_mention',\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query',\n }));\n }\n\n logger.verbose('[Graph:Discovery] Direct candidates constructed', {\n count: directCandidates.length,\n sharedIndexes: sharedIndexIds.length,\n targetIntents: targetIntents.length,\n });\n\n return {\n candidates: directCandidates,\n trace: [{\n node: \"discovery\",\n detail: `Direct connection → ${directCandidates.length} candidate(s) from ${sharedIndexIds.length} shared index(es)`,\n data: {\n targetUserId: state.targetUserId,\n candidateCount: directCandidates.length,\n sharedIndexes: sharedIndexIds.length,\n durationMs: Date.now() - startTime,\n },\n }],\n };\n }\n\n // Search limits - fixed values for candidate retrieval\n // (The options.limit controls final output, not search pool)\n const limitPerStrategy = 30;\n const perIndexLimit = 80;\n // Similarity threshold for recall (0.30 = 30% similarity)\n const minScore = 0.3;\n\n if (state.discoverySource === 'profile') {\n // Profile-context discovery: HyDE (when search query exists) + premise-to-premise.\n if (state.searchQuery?.trim()) {\n logger.verbose('[Graph:Discovery] Profile source with searchQuery → running query HyDE + premise paths', {\n searchQuery: state.searchQuery.trim().substring(0, 80),\n });\n const queryCandidates = await runQueryHydeDiscovery();\n logger.verbose('[Graph:Discovery] Query HyDE path complete', { candidatesFound: queryCandidates.length });\n\n // Build trace entries for this path\n const traceEntries: Array<{ node: string; detail?: string; data?: Record<string, unknown> }> = [];\n\n // Lens input trace (captured from runQueryHydeDiscovery)\n if (discoveryLensInput) {\n traceEntries.push({\n node: \"lens_input\",\n detail: \"Profile context for lens inference\",\n data: discoveryLensInput,\n });\n }\n\n // Lens output and HyDE document traces (captured from runQueryHydeDiscovery)\n if (discoveryHydeOutput) {\n if (discoveryHydeOutput.lenses.length > 0) {\n traceEntries.push({\n node: \"lens_output\",\n detail: `Inferred ${discoveryHydeOutput.lenses.length} lens(es): ${discoveryHydeOutput.lenses.map(l => l.label).join(', ')}`,\n data: { lenses: discoveryHydeOutput.lenses, model: getModelName(\"lensInferrer\") },\n });\n }\n for (const [lens, doc] of Object.entries(discoveryHydeOutput.hydeDocuments)) {\n if (doc?.hydeText) {\n traceEntries.push({\n node: \"hyde_query\",\n detail: `[${lens}] \"${doc.hydeText.slice(0, 120)}${doc.hydeText.length > 120 ? '...' : ''}\"`,\n data: { lens, hydeTextPreview: doc.hydeText.slice(0, 300) + (doc.hydeText.length > 300 ? '...' : '') },\n });\n }\n }\n }\n\n // Compute per-lens stats from deduped candidates\n const lensStats: Record<string, { count: number; avgSimilarity: number }> = {};\n for (const c of queryCandidates) {\n const s = c.lens || 'unknown';\n if (!lensStats[s]) lensStats[s] = { count: 0, avgSimilarity: 0 };\n lensStats[s].count++;\n lensStats[s].avgSimilarity += c.similarity;\n }\n for (const s of Object.values(lensStats)) {\n s.avgSimilarity = s.count > 0 ? Math.round((s.avgSimilarity / s.count) * 1000) / 1000 : 0;\n }\n\n traceEntries.push({\n node: \"discovery\",\n detail: `HyDE search → ${queryCandidates.length} candidate(s) from query path`,\n data: {\n candidateCount: queryCandidates.length,\n byLens: lensStats,\n searchQuery: state.searchQuery?.trim().slice(0, 80),\n durationMs: Date.now() - startTime,\n model: getModelName(\"hydeGenerator\"),\n },\n });\n\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n const withPremisesAndContext = mergeStrategyCandidates(queryCandidates, premiseCands, contextCands);\n if (premiseCands.length > 0) {\n traceEntries.push({ node: \"strategy\", detail: `premise-to-premise → ${premiseCands.length} candidate(s)` });\n }\n if (contextCands.length > 0) {\n traceEntries.push({ node: \"strategy\", detail: `context-to-intent → ${contextCands.length} candidate(s)` });\n }\n return { candidates: filterByTarget(withPremisesAndContext), trace: traceEntries };\n }\n\n // No search query — premise-to-premise + context-to-intent discovery\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n if (premiseCands.length > 0 || contextCands.length > 0) {\n const merged = mergeStrategyCandidates(premiseCands, contextCands);\n const traceEntries: Array<{ node: string; detail?: string; data?: Record<string, unknown> }> = [];\n if (premiseCands.length > 0) {\n traceEntries.push({ node: \"strategy\", detail: `premise-to-premise → ${premiseCands.length} candidate(s)` });\n }\n if (contextCands.length > 0) {\n traceEntries.push({ node: \"strategy\", detail: `context-to-intent → ${contextCands.length} candidate(s)` });\n }\n traceEntries.push({\n node: \"discovery\",\n detail: `${[premiseCands.length > 0 && 'premise-to-premise', contextCands.length > 0 && 'context-to-intent'].filter(Boolean).length} strategies → ${premiseCands.length + contextCands.length} raw, ${merged.length} after dedup`,\n });\n return { candidates: filterByTarget(merged), trace: traceEntries };\n }\n return { candidates: [] };\n }\n\n async function runQueryHydeDiscovery(): Promise<CandidateMatch[]> {\n const searchText = state.searchQuery?.trim() ?? '';\n if (!searchText) return [];\n logger.verbose('[Graph:Discovery] runQueryHydeDiscovery start', { searchText: searchText.slice(0, 80) });\n const discovererContext = buildDiscovererContext(state.sourceProfile, state.indexedIntents);\n discoveryLensInput = {\n profileContext: discovererContext,\n model: getModelName(\"lensInferrer\"),\n };\n const hydeResult = await self.hydeGenerator.invoke({\n sourceType: 'query',\n sourceText: searchText,\n forceRegenerate: false,\n profileContext: discovererContext,\n });\n const hydeEmbeddings = hydeResult.hydeEmbeddings as Record<string, number[]>;\n const lenses = hydeResult.lenses ?? [];\n discoveryHydeOutput = {\n lenses: lenses as Array<{ label: string; corpus: string }>,\n hydeDocuments: (hydeResult.hydeDocuments ?? {}) as Record<string, { hydeText?: string }>,\n };\n const embeddingKeys = hydeEmbeddings ? Object.keys(hydeEmbeddings) : [];\n logger.verbose('[Graph:Discovery] HyDE generator result', {\n lensCount: embeddingKeys.length,\n lenses: embeddingKeys,\n });\n if (!hydeEmbeddings || Object.keys(hydeEmbeddings).length === 0) return [];\n const lensMap = new Map(lenses.map(l => [l.label, l]));\n const lensEmbeddings: LensEmbedding[] = [];\n for (const [label, emb] of Object.entries(hydeEmbeddings)) {\n if (emb?.length) {\n const lens = lensMap.get(label);\n lensEmbeddings.push({ lens: label, corpus: lens?.corpus ?? 'profiles', embedding: emb });\n }\n }\n const all: CandidateMatch[] = [];\n await Promise.all(\n state.targetNetworks.map(async (targetIndex) => {\n const results = await self.embedder.searchWithHydeEmbeddings(lensEmbeddings, {\n indexScope: [targetIndex.networkId],\n excludeUserId: discoveryUserId,\n limitPerStrategy,\n limit: perIndexLimit,\n minScore,\n });\n for (const r of results.filter((x) => x.type === 'intent')) {\n all.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n candidateIntentId: r.id as Id<'intents'>,\n networkId: targetIndex.networkId,\n similarity: r.score,\n lens: r.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query' as const,\n }));\n }\n for (const r of results.filter((x) => x.type === 'premise')) {\n all.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n candidatePremiseId: r.id as Id<'premises'>,\n networkId: targetIndex.networkId,\n similarity: r.score,\n lens: r.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query' as const,\n }));\n }\n })\n );\n const intentCount = all.filter((c) => c.candidateIntentId).length;\n const premiseCount = all.filter((c) => c.candidatePremiseId).length;\n logger.verbose('[Graph:Discovery] searchWithHydeEmbeddings raw results', {\n total: all.length,\n fromIntent: intentCount,\n fromPremise: premiseCount,\n });\n const byKey = new Map<string, CandidateMatch>();\n for (const c of all) {\n // Dedup by candidateUserId + entity (intent or premise), NOT by indexId.\n // Including indexId caused the same user to appear once per index they belong to.\n const entityKey = c.candidateIntentId ? `intent:${c.candidateIntentId}` : `premise:${c.candidatePremiseId}`;\n const key = `${c.candidateUserId}:${entityKey}`;\n if (!byKey.has(key) || c.similarity > (byKey.get(key)?.similarity ?? 0)) {\n byKey.set(key, c);\n }\n }\n return Array.from(byKey.values());\n }\n\n /**\n * Premise-to-premise discovery (path D).\n * Searches for other users' premises similar to the discoverer's premises,\n * scoped to target networks. Additive — merges into existing candidates.\n */\n async function runPremiseDiscovery(): Promise<CandidateMatch[]> {\n const targetNetworkIds = state.targetNetworks.map(t => t.networkId);\n if (targetNetworkIds.length === 0) return [];\n\n const sourceLimit = getSourcePremiseDiscoveryLimit();\n if (sourceLimit === 0) {\n logger.verbose('[Graph:Discovery] runPremiseDiscovery disabled by DISCOVERY_SOURCE_PREMISE_LIMIT=0');\n return [];\n }\n\n const sourcePremisesFromDb = self.database.getPremisesForUserInNetworks\n ? await self.database.getPremisesForUserInNetworks(discoveryUserId, targetNetworkIds, 'ACTIVE', sourceLimit)\n : await self.database.getPremisesForUser(discoveryUserId, 'ACTIVE');\n const sourcePremises = (sourcePremisesFromDb.length > 0\n ? sourcePremisesFromDb\n .filter(p => Array.isArray(p.embedding) && p.embedding.length > 0)\n .slice(0, sourceLimit)\n .map(p => ({ premiseId: p.id as Id<'premises'>, embedding: p.embedding! }))\n : (state.sourcePremises ?? []).slice(0, sourceLimit)\n );\n\n if (sourcePremises.length === 0) return [];\n\n logger.verbose('[Graph:Discovery] runPremiseDiscovery start', {\n premiseCount: sourcePremises.length,\n sourceLimit,\n targetNetworks: targetNetworkIds.length,\n batched: !!self.database.searchPremisesBySimilarityBatch,\n });\n\n const rawResults = self.database.searchPremisesBySimilarityBatch\n ? await self.database.searchPremisesBySimilarityBatch({\n sources: sourcePremises,\n networkIds: targetNetworkIds,\n excludeUserId: discoveryUserId,\n limitPerSource: PREMISE_MATCH_LIMIT_PER_SOURCE,\n })\n : (await Promise.all(\n sourcePremises.map(async (sp) => {\n const results = await self.database.searchPremisesBySimilarity({\n embedding: sp.embedding,\n networkIds: targetNetworkIds,\n excludeUserId: discoveryUserId,\n limit: PREMISE_MATCH_LIMIT_PER_SOURCE,\n });\n return results.map((r) => ({ ...r, sourcePremiseId: sp.premiseId }));\n })\n )).flat();\n\n const premiseCandidates: CandidateMatch[] = [];\n for (const r of rawResults) {\n premiseCandidates.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n sourcePremiseId: r.sourcePremiseId as Id<'premises'> | undefined,\n candidatePremiseId: r.premiseId as Id<'premises'>,\n networkId: r.networkId as Id<'networks'>,\n similarity: typeof r.similarity === 'number' ? r.similarity : parseFloat(String(r.similarity)),\n lens: 'premise_match',\n candidatePayload: r.assertionText ?? '',\n discoverySource: 'premise-similarity',\n }));\n }\n\n // Dedup by userId + premiseId + networkId (a premise can appear in multiple networks)\n const byKey = new Map<string, CandidateMatch>();\n for (const c of premiseCandidates) {\n const key = `${c.candidateUserId}:${c.candidatePremiseId ?? 'none'}:${c.networkId}`;\n if (!byKey.has(key) || c.similarity > (byKey.get(key)?.similarity ?? 0)) {\n byKey.set(key, c);\n }\n }\n const deduped = Array.from(byKey.values());\n logger.verbose('[Graph:Discovery] runPremiseDiscovery complete', {\n sourcePremiseCount: sourcePremises.length,\n rawCount: premiseCandidates.length,\n dedupedCount: deduped.length,\n });\n return deduped;\n }\n\n /**\n * Context-to-intent discovery: searches intents using context HyDE embeddings.\n * When HyDE documents exist for a context, uses optimised hypothetical-document\n * embeddings via searchWithHydeEmbeddings. Falls back to raw context embedding\n * via searchIntentsByContextEmbedding when no HyDE docs are available.\n */\n async function runContextToIntentDiscovery(): Promise<CandidateMatch[]> {\n if (!state.sourceContexts?.length) return [];\n const contextToIntentEnabled = process.env.DISCOVERY_CONTEXT_TO_INTENT !== '0';\n if (!contextToIntentEnabled) return [];\n\n const targetNetworkIds = state.targetNetworks.map(t => t.networkId);\n if (targetNetworkIds.length === 0) return [];\n\n logger.verbose('[Graph:Discovery] runContextToIntentDiscovery start', {\n contextCount: state.sourceContexts.length,\n targetNetworks: targetNetworkIds.length,\n });\n\n const contextCandidates: CandidateMatch[] = [];\n\n for (const ctx of state.sourceContexts.filter(c => targetNetworkIds.includes(c.networkId))) {\n // Attempt HyDE-enhanced search first\n const hydeDocs = await self.database.getHydeDocumentsForSource('context', ctx.contextId);\n const lensEmbeddings: LensEmbedding[] = hydeDocs\n .filter(d => d.hydeEmbedding?.length > 0)\n .map(d => ({\n lens: d.strategy,\n corpus: (d.targetCorpus === 'intents' ? 'intents' : d.targetCorpus === 'premises' ? 'premises' : 'intents') as 'intents' | 'premises' | 'profiles',\n embedding: d.hydeEmbedding,\n }));\n\n if (lensEmbeddings.length > 0) {\n // HyDE-enhanced search: same path as query HyDE, scoped to this context's network\n const results = await self.embedder.searchWithHydeEmbeddings(lensEmbeddings, {\n indexScope: [ctx.networkId],\n excludeUserId: discoveryUserId,\n limitPerStrategy: limitPerStrategy,\n limit: 20,\n minScore,\n });\n for (const r of results.filter(r => r.type === 'intent')) {\n contextCandidates.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n candidateIntentId: r.id as Id<'intents'>,\n sourceContextId: ctx.contextId,\n networkId: ctx.networkId,\n similarity: r.score,\n lens: r.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'context-to-intent',\n }));\n }\n } else {\n // Fallback: raw context embedding search (no HyDE docs yet)\n const results = await self.database.searchIntentsByContextEmbedding({\n embedding: ctx.embedding,\n networkIds: [ctx.networkId],\n excludeUserId: discoveryUserId,\n limit: 20,\n minScore: minScore,\n });\n for (const r of results) {\n contextCandidates.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n candidateIntentId: r.intentId as Id<'intents'>,\n sourceContextId: ctx.contextId,\n networkId: r.networkId as Id<'networks'>,\n similarity: typeof r.similarity === 'number' ? r.similarity : parseFloat(String(r.similarity)),\n lens: 'context_match',\n candidatePayload: r.payload ?? '',\n candidateSummary: r.summary ?? undefined,\n discoverySource: 'context-to-intent',\n }));\n }\n }\n }\n\n const byKey = new Map<string, CandidateMatch>();\n for (const c of contextCandidates) {\n const key = `${c.candidateUserId}:${c.candidateIntentId ?? 'none'}:${c.networkId}`;\n if (!byKey.has(key) || c.similarity > (byKey.get(key)?.similarity ?? 0)) {\n byKey.set(key, c);\n }\n }\n const deduped = Array.from(byKey.values());\n logger.verbose('[Graph:Discovery] runContextToIntentDiscovery complete', {\n rawCount: contextCandidates.length,\n dedupedCount: deduped.length,\n });\n return deduped;\n }\n\n /**\n * Merge candidates from multiple strategies. Deduplicates by userId + networkId + entityId,\n * keeps the highest similarity, tracks which strategies found each candidate,\n * and applies a multi-strategy boost (+0.05 per additional strategy, boost capped at 0.15,\n * final similarity capped at 1.0).\n */\n function mergeStrategyCandidates(...groups: CandidateMatch[][]): CandidateMatch[] {\n const merged = new Map<string, CandidateMatch & { _strategies: Set<string> }>();\n for (const group of groups) {\n for (const c of group) {\n const entityId = c.candidateIntentId ?? c.candidatePremiseId ?? 'none';\n const key = `${c.candidateUserId}:${c.networkId}:${entityId}`;\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, { ...c, _strategies: new Set([c.discoverySource ?? 'unknown']) });\n } else {\n existing._strategies.add(c.discoverySource ?? 'unknown');\n const mergedEvidence = mergeOpportunityEvidence(existing.evidence, c.evidence);\n if (c.similarity > existing.similarity) {\n Object.assign(existing, { ...c, evidence: mergedEvidence });\n } else {\n existing.evidence = mergedEvidence;\n }\n }\n }\n }\n return Array.from(merged.values()).map(({ _strategies, ...c }) => {\n const matchedStrategies = Array.from(_strategies);\n const boost = Math.min((_strategies.size - 1) * 0.05, 0.15);\n return {\n ...c,\n similarity: Math.min(c.similarity + boost, 1.0),\n matchedStrategies,\n evidence: withMatchedStrategies(mergeOpportunityEvidence(c.evidence), matchedStrategies),\n };\n });\n }\n\n const resolvedIntent = state.resolvedTriggerIntentId\n ? state.indexedIntents.find((i) => i.intentId === state.resolvedTriggerIntentId)\n : state.indexedIntents[0];\n const searchText = state.searchQuery ?? resolvedIntent?.payload ?? '';\n if (!searchText) {\n logger.warn('[Graph:Discovery] No search text available for intent path');\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n const merged = mergeStrategyCandidates(premiseCands, contextCands);\n if (merged.length > 0) {\n return {\n candidates: filterByTarget(merged),\n trace: [{ node: \"discovery\", detail: `No search text; premise → ${premiseCands.length}, context → ${contextCands.length}, merged → ${merged.length} candidate(s)` }],\n };\n }\n return { candidates: [] };\n }\n\n const discovererContext = buildDiscovererContext(state.sourceProfile, state.indexedIntents);\n discoveryLensInput = {\n profileContext: discovererContext,\n model: getModelName(\"lensInferrer\"),\n };\n const hydeResult = await this.hydeGenerator.invoke({\n sourceType: 'query',\n sourceText: searchText,\n forceRegenerate: false,\n profileContext: discovererContext,\n });\n const hydeEmbeddings = hydeResult.hydeEmbeddings as Record<string, number[]>;\n const lenses = hydeResult.lenses ?? [];\n if (!hydeEmbeddings || Object.keys(hydeEmbeddings).length === 0) {\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n const merged = mergeStrategyCandidates(premiseCands, contextCands);\n if (merged.length > 0) {\n return {\n hydeEmbeddings: {} as Record<string, number[]>,\n candidates: filterByTarget(merged),\n trace: [{ node: \"discovery\", detail: `No HyDE embeddings; premise → ${premiseCands.length}, context → ${contextCands.length}, merged → ${merged.length} candidate(s)` }],\n };\n }\n return { hydeEmbeddings: {} as Record<string, number[]>, candidates: [] };\n }\n const lensMap = new Map(lenses.map(l => [l.label, l]));\n const lensEmbeddings: LensEmbedding[] = [];\n for (const [label, emb] of Object.entries(hydeEmbeddings)) {\n if (emb?.length) {\n const lens = lensMap.get(label);\n lensEmbeddings.push({ lens: label, corpus: lens?.corpus ?? 'profiles', embedding: emb });\n }\n }\n const allCandidates: CandidateMatch[] = [];\n await Promise.all(\n state.targetNetworks.map(async (targetIndex) => {\n const results = await this.embedder.searchWithHydeEmbeddings(lensEmbeddings, {\n indexScope: [targetIndex.networkId],\n excludeUserId: discoveryUserId,\n limitPerStrategy,\n limit: perIndexLimit,\n minScore,\n });\n for (const result of results.filter((r) => r.type === 'intent')) {\n allCandidates.push(withCandidateEvidence({\n candidateUserId: result.userId as Id<'users'>,\n candidateIntentId: result.id as Id<'intents'>,\n networkId: targetIndex.networkId,\n similarity: result.score,\n lens: result.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query' as const,\n }));\n }\n for (const result of results.filter((r) => r.type === 'premise')) {\n allCandidates.push(withCandidateEvidence({\n candidateUserId: result.userId as Id<'users'>,\n candidatePremiseId: result.id as Id<'premises'>,\n networkId: targetIndex.networkId,\n similarity: result.score,\n lens: result.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query' as const,\n }));\n }\n })\n );\n const byUserAndIndex = new Map<string, CandidateMatch>();\n for (const c of allCandidates) {\n const entityKey = c.candidateIntentId ? `intent:${c.candidateIntentId}` : `premise:${c.candidatePremiseId}`;\n const key = `${c.candidateUserId}:${c.networkId}:${entityKey}`;\n if (!byUserAndIndex.has(key) || c.similarity > (byUserAndIndex.get(key)?.similarity ?? 0)) {\n byUserAndIndex.set(key, c);\n }\n }\n const candidates = Array.from(byUserAndIndex.values());\n logger.verbose('[Graph:Discovery] Intent-path discovery complete', { candidatesFound: candidates.length });\n const usedLenses = Object.keys(hydeEmbeddings);\n\n // Build trace with individual candidate similarity scores\n const traceEntries: Array<{ node: string; detail?: string; data?: Record<string, unknown> }> = [];\n\n // Lens input trace\n if (discoveryLensInput) {\n traceEntries.push({\n node: \"lens_input\",\n detail: \"Profile context for lens inference\",\n data: discoveryLensInput,\n });\n }\n\n // Lens output trace\n if (lenses.length > 0) {\n traceEntries.push({\n node: \"lens_output\",\n detail: `Inferred ${lenses.length} lens(es): ${lenses.map(l => l.label).join(', ')}`,\n data: { lenses, model: getModelName(\"lensInferrer\") },\n });\n }\n\n // Compute per-lens stats from deduped candidates\n const lensStats: Record<string, { count: number; avgSimilarity: number }> = {};\n for (const c of candidates) {\n const s = c.lens || 'unknown';\n if (!lensStats[s]) lensStats[s] = { count: 0, avgSimilarity: 0 };\n lensStats[s].count++;\n lensStats[s].avgSimilarity += c.similarity;\n }\n for (const s of Object.values(lensStats)) {\n s.avgSimilarity = s.count > 0 ? Math.round((s.avgSimilarity / s.count) * 1000) / 1000 : 0;\n }\n\n traceEntries.push({\n node: \"discovery\",\n detail: `Query: \"${searchText.slice(0, 50)}${searchText.length > 50 ? '...' : ''}\" → ${candidates.length} candidate(s)`,\n data: {\n query: searchText.slice(0, 100),\n lenses: usedLenses,\n candidateCount: candidates.length,\n byLens: lensStats,\n durationMs: Date.now() - startTime,\n model: getModelName(\"hydeGenerator\"),\n },\n });\n\n // Show the HyDE-generated hypothetical documents used for search\n const hydeDocuments = hydeResult.hydeDocuments;\n if (hydeDocuments) {\n for (const [lens, doc] of Object.entries(hydeDocuments)) {\n if (doc?.hydeText) {\n traceEntries.push({\n node: \"hyde_query\",\n detail: `[${lens}] \"${doc.hydeText.slice(0, 120)}${doc.hydeText.length > 120 ? '...' : ''}\"`,\n data: {\n lens,\n hydeTextPreview: doc.hydeText.slice(0, 160) + (doc.hydeText.length > 160 ? '...' : ''),\n },\n });\n }\n }\n }\n\n // Add top candidates with similarity scores\n const sortedCandidates = [...candidates].sort((a, b) => b.similarity - a.similarity).slice(0, 10);\n for (const c of sortedCandidates) {\n traceEntries.push({\n node: \"match\",\n detail: `Similarity ${Math.round(c.similarity * 100)}% via ${c.lens}`,\n data: {\n userId: c.candidateUserId,\n similarity: Math.round(c.similarity * 100),\n lens: c.lens,\n hasIntent: !!c.candidateIntentId,\n },\n });\n }\n\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n const allStrategies = mergeStrategyCandidates(candidates, premiseCands, contextCands);\n if (premiseCands.length > 0 || contextCands.length > 0) {\n traceEntries.push({\n node: \"discovery\",\n detail: `+ Premise → ${premiseCands.length}, Context → ${contextCands.length}, merged to ${allStrategies.length} candidate(s)`,\n });\n }\n return {\n hydeEmbeddings: hydeEmbeddings as Record<string, number[]>,\n candidates: filterByTarget(allStrategies),\n trace: traceEntries,\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Discovery] Failed', { error });\n return {\n candidates: [],\n error: 'Failed to search for candidates.',\n trace: [{\n node: \"discovery_fatal\",\n detail: `Discovery failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const candidates = r?.candidates as unknown[];\n return candidates ? `Found ${candidates.length} candidate(s)` : undefined;\n },\n );\n\n /**\n * Node 3: Evaluation (Entity bundle)\n * Builds entity bundle from source + candidates, invokes entity-bundle evaluator, maps to EvaluatedOpportunity with networkId from entities.\n */\n const evaluationNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.evaluation\", async () => {\n const startTime = Date.now();\n logger.verbose('[Graph:Evaluation] Starting evaluation', {\n candidatesCount: state.candidates.length,\n });\n\n if (state.candidates.length === 0) {\n logger.verbose('[Graph:Evaluation] No candidates to evaluate');\n return { evaluatedOpportunities: [], agentTimings: [] };\n }\n\n // Batch candidates to avoid timeout - evaluate top 25 per batch, store remaining\n const EVAL_BATCH_SIZE = 25;\n const sortedCandidates = [...state.candidates]\n .sort((a, b) => b.similarity - a.similarity);\n\n // Dedup by userId — when same similarity, prefer index with highest relevancyScore\n const bestByUser = new Map<string, CandidateMatch>();\n for (const c of sortedCandidates) {\n const existing = bestByUser.get(c.candidateUserId);\n if (!existing) {\n bestByUser.set(c.candidateUserId, c);\n } else if (c.similarity > existing.similarity) {\n bestByUser.set(c.candidateUserId, c);\n } else if (c.similarity === existing.similarity) {\n // Tie-break: prefer index with higher relevancy score\n const cScore = state.indexRelevancyScores[c.networkId] ?? 0;\n const existingScore = state.indexRelevancyScores[existing.networkId] ?? 0;\n if (cScore > existingScore) {\n bestByUser.set(c.candidateUserId, c);\n }\n }\n }\n const dedupedCandidates = Array.from(bestByUser.values());\n // Re-sort by similarity descending (Map iteration order doesn't guarantee sort)\n dedupedCandidates.sort((a, b) => b.similarity - a.similarity);\n\n if (dedupedCandidates.length < sortedCandidates.length) {\n logger.info(\"[Graph:Evaluation] Deduped candidates by userId\", {\n before: sortedCandidates.length,\n after: dedupedCandidates.length,\n removed: sortedCandidates.length - dedupedCandidates.length,\n });\n }\n\n const batchToEvaluate = dedupedCandidates.slice(0, EVAL_BATCH_SIZE);\n const remaining = dedupedCandidates.slice(EVAL_BATCH_SIZE);\n\n // Early termination: if search was query-driven and no query-sourced candidates remain,\n // clear remaining to prevent pointless pagination through non-query leftovers\n const isQueryDriven = !!state.searchQuery?.trim();\n const queryRemaining = remaining.filter(\n (c) => c.discoverySource === 'query' || c.discoverySource == null,\n );\n const effectiveRemaining =\n isQueryDriven && queryRemaining.length === 0 ? [] : remaining;\n\n if (isQueryDriven && remaining.length > 0 && queryRemaining.length === 0) {\n logger.info(\n \"[Graph:Evaluation] Early termination: no query-sourced candidates remain\",\n {\n droppedCandidates: remaining.length,\n },\n );\n }\n\n if (effectiveRemaining.length > 0) {\n logger.verbose('[Graph:Evaluation] Batched candidates for evaluation', {\n evaluating: batchToEvaluate.length,\n remaining: effectiveRemaining.length,\n total: sortedCandidates.length,\n });\n }\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n\n try {\n const discoveryUserId = state.onBehalfOfUserId ?? state.userId;\n const sourceProfile = await this.database.getProfile(discoveryUserId);\n const sourceEntity: EvaluatorEntity = {\n userId: discoveryUserId,\n profile: {\n name: sourceProfile?.identity?.name,\n bio: sourceProfile?.identity?.bio,\n location: sourceProfile?.identity?.location,\n interests: sourceProfile?.attributes?.interests,\n skills: sourceProfile?.attributes?.skills,\n context: sourceProfile?.narrative?.context,\n },\n intents: state.indexedIntents.slice(0, 5).map((i) => ({\n intentId: i.intentId,\n payload: i.payload,\n summary: i.summary,\n })),\n networkId: '' as Id<'networks'>, // Placeholder — overwritten per-pairing below\n evidenceKey: `${discoveryUserId}::source`,\n ragScore: undefined,\n matchedVia: undefined,\n };\n\n const candidateEntities: EvaluatorEntity[] = await Promise.all(\n batchToEvaluate.map(async (c) => {\n const profile = await this.database.getProfile(c.candidateUserId);\n let intentPayload = c.candidatePayload;\n let intentSummary = c.candidateSummary;\n if (c.candidateIntentId != null && (!intentPayload || intentPayload === '')) {\n const intent = await this.database.getIntent(c.candidateIntentId);\n if (intent) {\n intentPayload = intent.payload;\n intentSummary = intent.summary ?? undefined;\n }\n }\n const evidenceKey = buildEvaluatorEvidenceKey(c);\n return {\n userId: c.candidateUserId,\n profile: {\n name: profile?.identity?.name,\n bio: profile?.identity?.bio,\n location: profile?.identity?.location,\n interests: profile?.attributes?.interests,\n skills: profile?.attributes?.skills,\n context: profile?.narrative?.context,\n },\n intents:\n c.candidateIntentId != null\n ? [{ intentId: c.candidateIntentId, payload: intentPayload ?? '', summary: intentSummary }]\n : undefined,\n networkId: c.networkId,\n evidenceKey,\n ragScore: c.similarity * 100,\n matchedVia: c.lens,\n evidence: c.evidence,\n };\n })\n );\n\n const userIdToIndexId = new Map<string, Id<'networks'>>();\n const evidenceByEntityKey = new Map<string, OpportunityEvidence[]>();\n const entityKeysByUserId = new Map<string, string[]>();\n for (const e of candidateEntities) {\n if (!userIdToIndexId.has(e.userId)) userIdToIndexId.set(e.userId, e.networkId as Id<'networks'>);\n if (e.evidenceKey) {\n evidenceByEntityKey.set(\n e.evidenceKey,\n mergeOpportunityEvidence(evidenceByEntityKey.get(e.evidenceKey), e.evidence),\n );\n entityKeysByUserId.set(e.userId, [...(entityKeysByUserId.get(e.userId) ?? []), e.evidenceKey]);\n }\n }\n\n function evidenceForActor(actor: { userId: string; intentId?: string | null; evidenceKey?: string | null }): OpportunityEvidence[] | undefined {\n if (actor.evidenceKey) return evidenceByEntityKey.get(actor.evidenceKey);\n const keys = entityKeysByUserId.get(actor.userId) ?? [];\n const intentKey = actor.intentId ? keys.find((key) => key.endsWith(`:${actor.intentId}`)) : undefined;\n if (intentKey) return evidenceByEntityKey.get(intentKey);\n // Avoid leaking unrelated resource evidence when the evaluator collapsed multiple\n // candidates for the same user into a profile-only actor.\n if (keys.length === 1) return evidenceByEntityKey.get(keys[0]);\n return undefined;\n }\n\n // Lower default threshold to 50 for better recall\n const minScore = state.options.minScore ?? 50;\n\n const evaluator = typeof (evaluatorAgent as OpportunityEvaluator).invokeEntityBundle === 'function'\n ? (evaluatorAgent as OpportunityEvaluator)\n : new OpportunityEvaluator();\n\n const runParallel = process.env.RUN_OPPORTUNITY_EVAL_IN_PARALLEL === 'true';\n const networkContexts = await buildNetworkContexts([sourceEntity, ...candidateEntities], this.database);\n\n // Declare trace entries early so both parallel and serial paths can push error entries\n const traceEntries: Array<{ node: string; detail?: string; data?: Record<string, unknown> }> = [];\n const parallelErrors: Array<{ candidateUserId: string; candidateName: string; error: string; durationMs: number }> = [];\n\n let pairwiseOpportunities: Array<{ reasoning: string; score: number; actors: Array<{ userId: string; role: 'agent' | 'patient' | 'peer'; intentId?: string | null; evidenceKey?: string | null }> }>;\n\n if (runParallel) {\n // Experimental: one LLM call per candidate, all fired in parallel\n logger.verbose('[Graph:Evaluation] Running parallel evaluation', { candidates: candidateEntities.length });\n const parallelResults = await Promise.all(\n candidateEntities.map((candidateEntity) => {\n const input: EvaluatorInput = {\n discovererId: discoveryUserId,\n entities: [sourceEntity, candidateEntity],\n existingOpportunities: state.options.existingOpportunities,\n ...(state.searchQuery?.trim() ? { discoveryQuery: state.searchQuery.trim() } : {}),\n networkContexts,\n };\n const _evalStart = Date.now();\n const _traceEmitter = requestContext.getStore()?.traceEmitter;\n _traceEmitter?.({ type: \"agent_start\", name: \"opportunity-evaluator\" });\n const _candidateName = candidateEntity.profile?.name ?? \"Unknown\";\n return evaluator.invokeEntityBundle(input, { minScore, returnAll: true })\n .then((res) => {\n const _evalDuration = Date.now() - _evalStart;\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _evalDuration });\n const _topScore = res.length > 0 ? Math.max(...res.map(r => r.score)) : -1;\n const _summary = _topScore < 0 ? `${_candidateName}: no match` : `${_candidateName}: ${_topScore}`;\n _traceEmitter?.({ type: \"agent_end\", name: \"opportunity-evaluator\", durationMs: _evalDuration, summary: _summary });\n return res;\n })\n .catch((err) => {\n const _evalDuration = Date.now() - _evalStart;\n const _errMsg = err instanceof Error ? err.message : String(err);\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _evalDuration });\n _traceEmitter?.({ type: \"agent_end\", name: \"opportunity-evaluator\", durationMs: _evalDuration, summary: `${_candidateName}: error — ${_errMsg}` });\n logger.warn('[Graph:Evaluation] Parallel eval failed for candidate', {\n candidateUserId: candidateEntity.userId,\n error: err,\n });\n parallelErrors.push({\n candidateUserId: candidateEntity.userId,\n candidateName: _candidateName,\n error: _errMsg,\n durationMs: _evalDuration,\n });\n return [] as Array<{ reasoning: string; score: number; actors: Array<{ userId: string; role: 'agent' | 'patient' | 'peer'; intentId?: string | null; evidenceKey?: string | null }> }>;\n });\n })\n );\n // Each call is already pairwise (source + 1 candidate) — flatten directly\n pairwiseOpportunities = parallelResults.flat();\n\n // Record trace entries for candidates that failed during parallel evaluation\n if (parallelErrors.length > 0) {\n traceEntries.push({\n node: \"evaluation_errors\",\n detail: `${parallelErrors.length}/${candidateEntities.length} candidate evaluation(s) failed`,\n data: {\n failedCount: parallelErrors.length,\n totalCandidates: candidateEntities.length,\n errors: parallelErrors.map(e => ({\n candidateUserId: e.candidateUserId,\n candidateName: e.candidateName,\n error: e.error,\n durationMs: e.durationMs,\n })),\n },\n });\n }\n } else {\n // Default: single bundled LLM call with all candidates\n const entities: EvaluatorEntity[] = [sourceEntity, ...candidateEntities];\n const input: EvaluatorInput = {\n discovererId: discoveryUserId,\n entities,\n existingOpportunities: state.options.existingOpportunities,\n ...(state.searchQuery?.trim() ? { discoveryQuery: state.searchQuery.trim() } : {}),\n networkContexts,\n };\n // Get ALL scored results for tracing (returnAll: true), filter for persistence later\n const _evalStart = Date.now();\n const _traceEmitterSerial = requestContext.getStore()?.traceEmitter;\n _traceEmitterSerial?.({ type: \"agent_start\", name: \"opportunity-evaluator\" });\n let opportunitiesWithActors: EvaluatedOpportunityWithActors[];\n try {\n opportunitiesWithActors = await evaluator.invokeEntityBundle(input, { minScore, returnAll: true });\n const _evalDuration = Date.now() - _evalStart;\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _evalDuration });\n _traceEmitterSerial?.({ type: \"agent_end\", name: \"opportunity-evaluator\", durationMs: _evalDuration, summary: `Evaluated ${candidateEntities.length} candidate(s)` });\n } catch (serialErr) {\n const _evalDuration = Date.now() - _evalStart;\n const _errMsg = serialErr instanceof Error ? serialErr.message : String(serialErr);\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _evalDuration });\n _traceEmitterSerial?.({ type: \"agent_end\", name: \"opportunity-evaluator\", durationMs: _evalDuration, summary: `error — ${_errMsg}` });\n throw serialErr; // Re-throw for the outer catch to handle\n }\n\n // Split multi-actor evaluator results into pairwise (viewer + candidate).\n // Each persisted discovery opportunity should have exactly 2 actors.\n // When splitting, build per-candidate reasoning from entity data because\n // the shared reasoning typically describes only one candidate.\n pairwiseOpportunities = [];\n for (const op of opportunitiesWithActors) {\n const pairwiseSourceId = state.onBehalfOfUserId ?? state.userId;\n const nonViewerActors = op.actors.filter(a => a.userId !== pairwiseSourceId);\n if (nonViewerActors.length <= 1) {\n pairwiseOpportunities.push(op);\n } else {\n logger.warn('[Graph:Evaluation] Splitting multi-actor opportunity; LLM returned bundled actors instead of one-per-candidate', {\n actorCount: nonViewerActors.length,\n userIds: nonViewerActors.map(a => a.userId),\n });\n const viewerActor = op.actors.find(a => a.userId === pairwiseSourceId);\n for (const candidate of nonViewerActors) {\n const entity = candidateEntities.find(e => e.userId === candidate.userId);\n const candidateName = entity?.profile?.name ?? '';\n const reasoningLower = op.reasoning.toLowerCase();\n const mentionsCandidate =\n candidateName !== '' &&\n reasoningLower.includes(candidateName.toLowerCase());\n const mentionsOtherCandidate = nonViewerActors\n .filter((actor) => actor.userId !== candidate.userId)\n .map((actor) =>\n candidateEntities.find((e) => e.userId === actor.userId)?.profile?.name?.toLowerCase()\n )\n .some((name) => name != null && reasoningLower.includes(name));\n let reasoning: string;\n if (mentionsCandidate && !mentionsOtherCandidate) {\n reasoning = op.reasoning;\n } else if (entity?.profile) {\n const p = entity.profile;\n const parts = [p.name, p.bio].filter(Boolean);\n if (p.skills?.length) parts.push(`Skills: ${p.skills.join(', ')}`);\n if (p.interests?.length) parts.push(`Interests: ${p.interests.join(', ')}`);\n reasoning = parts.join('. ') || op.reasoning;\n } else {\n reasoning = op.reasoning;\n }\n pairwiseOpportunities.push({\n reasoning,\n score: op.score,\n actors: [\n viewerActor ?? { userId: pairwiseSourceId, role: 'patient' as const, intentId: null },\n candidate,\n ],\n });\n }\n }\n }\n }\n\n const evaluatedOpportunities: EvaluatedOpportunity[] = pairwiseOpportunities.map((op) => ({\n reasoning: op.reasoning,\n score: op.score,\n evidence: mergeOpportunityEvidence(...op.actors.map(evidenceForActor)),\n actors: op.actors.map((a) => {\n const isSource = a.userId === discoveryUserId;\n if (isSource) {\n // Source actor inherits the counterpart's networkId (shared match context)\n const counterpart = op.actors.find((other) => other.userId !== a.userId);\n const counterpartIndexId = counterpart\n ? userIdToIndexId.get(counterpart.userId) ?? (candidateEntities.find((e) => e.userId === counterpart.userId)?.networkId as Id<'networks'>)\n : undefined;\n return {\n userId: a.userId as Id<'users'>,\n role: a.role,\n intentId: a.intentId as Id<'intents'> | undefined,\n networkId: counterpartIndexId ?? userIdToIndexId.get(a.userId) ?? ('' as Id<'networks'>),\n };\n }\n return {\n userId: a.userId as Id<'users'>,\n role: a.role,\n intentId: a.intentId as Id<'intents'> | undefined,\n networkId: userIdToIndexId.get(a.userId) ?? (candidateEntities.find((e) => e.userId === a.userId)?.networkId as Id<'networks'>),\n };\n }),\n }));\n\n const passed = evaluatedOpportunities.filter((o) => o.score >= minScore);\n logger.verbose('[Graph:Evaluation] Evaluation complete', {\n evaluatedCount: evaluatedOpportunities.length,\n passed: passed.length,\n });\n\n // Build detailed trace entries for each evaluated candidate\n\n // Threshold filter trace: how many candidates in this batch were above/below similarity threshold\n const aboveThreshold = batchToEvaluate.filter(c => c.similarity >= 0.40).length;\n const belowThreshold = batchToEvaluate.length - aboveThreshold;\n traceEntries.push({\n node: \"threshold_filter\",\n detail: `${aboveThreshold} above 0.40, ${belowThreshold} below (batch of ${batchToEvaluate.length})`,\n data: {\n aboveThreshold,\n belowThreshold,\n minScore: 0.40,\n batchSize: batchToEvaluate.length,\n },\n });\n\n // Create a map of evaluated candidates by userId for quick lookup.\n // Use discoveryUserId (which accounts for onBehalfOfUserId in introducer flow)\n // rather than state.userId (which is the introducer, not present in pairwise actors).\n const evaluatedByUserId = new Map<string, { score: number; reasoning: string }>();\n for (const opp of evaluatedOpportunities) {\n const candidateActor = opp.actors.find(a => a.userId !== discoveryUserId);\n if (candidateActor) {\n evaluatedByUserId.set(candidateActor.userId, { score: opp.score, reasoning: opp.reasoning });\n }\n }\n\n // Summary entry\n traceEntries.push({\n node: \"evaluation\",\n detail: `Evaluated ${candidateEntities.length} candidate(s) → ${passed.length} passed (min score ${minScore})`,\n data: {\n inputCandidates: batchToEvaluate.length,\n returnedFromEvaluator: evaluatedOpportunities.length,\n passedCount: passed.length,\n minScore,\n remaining: effectiveRemaining.length,\n batchNumber: 1,\n durationMs: Date.now() - startTime,\n model: getModelName(\"opportunityEvaluator\"),\n },\n });\n\n // Individual candidate entries - show ALL candidates that went to evaluator\n for (const entity of candidateEntities) {\n const candidateName = entity.profile?.name || entity.userId.slice(0, 8);\n const candidateBio = entity.profile?.bio;\n const evaluated = evaluatedByUserId.get(entity.userId);\n const score = evaluated?.score;\n const reasoning = evaluated?.reasoning;\n const didPass = score !== undefined && score >= minScore;\n const status = score !== undefined \n ? (didPass ? '✓ passed' : `✗ score ${score}`) \n : '✗ not scored';\n \n traceEntries.push({\n node: \"candidate\",\n detail: `${candidateName}: ${status}`,\n data: {\n userId: entity.userId,\n name: candidateName,\n bio: candidateBio,\n score: score,\n passed: didPass,\n reasoning: reasoning || 'No evaluation returned for this candidate',\n matchedVia: entity.matchedVia,\n ragScore: entity.ragScore,\n model: getModelName(\"opportunityEvaluator\"),\n intents: entity.intents?.map((i: { intentId?: string; payload?: string; summary?: string }) => ({\n intentId: i.intentId,\n summary: (i.summary || i.payload || '').slice(0, 100),\n })),\n profile: entity.profile ? {\n name: entity.profile.name,\n location: entity.profile.location,\n } : undefined,\n },\n });\n }\n\n // Only pass opportunities that passed the threshold to downstream nodes\n const passedOpportunities = evaluatedOpportunities.filter((o) => o.score >= minScore);\n\n return {\n evaluatedOpportunities: passedOpportunities,\n remainingCandidates: effectiveRemaining,\n trace: traceEntries,\n agentTimings: agentTimingsAccum,\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Evaluation] Failed', { error });\n return {\n evaluatedOpportunities: [],\n error: 'Failed to evaluate candidates.',\n trace: [{\n node: \"evaluation_fatal\",\n detail: `Evaluation failed: ${errMsg}`,\n data: {\n error: errMsg,\n candidateCount: state.candidates?.length ?? 0,\n durationMs: Date.now() - startTime,\n },\n }],\n agentTimings: agentTimingsAccum,\n };\n }\n });\n };\n\n /**\n * Node 3b: Negotiate (post-persist)\n * Runs bilateral negotiation per persisted opportunity, passing opportunityId so the\n * negotiation graph's finalize node updates each opportunity's status:\n * accept → 'pending' (sender notification follows the pending → notification path)\n * reject → 'rejected'\n * timeout/turn_cap → 'stalled'\n * Status updates land in the DB; in-memory state.opportunities is not mutated.\n */\n const NEGOTIATE_TIMER_SENTINEL = Symbol('negotiate-timer-sentinel');\n const negotiateNode = async (state: typeof OpportunityGraphState.State) => {\n if (!this.negotiationGraph) return {};\n if (!state.opportunities || state.opportunities.length === 0) return {};\n\n const traceEmitter = requestContext.getStore()?.traceEmitter;\n const graphStart = Date.now();\n traceEmitter?.({ type: \"graph_start\", name: \"Negotiation graph\" });\n\n try {\n // Use the same discoveryUserId pattern as evaluationNode\n const discoveryUserId = (state.onBehalfOfUserId ?? state.userId) as string;\n\n const sourceAccount = await this.database.getUser(discoveryUserId).catch(() => null);\n\n const sourceUser = {\n id: discoveryUserId,\n intents: state.indexedIntents?.slice(0, 5).map(i => ({\n id: i.intentId as string,\n title: i.summary ?? '',\n description: i.payload ?? '',\n confidence: 1,\n })) ?? [],\n profile: {\n name: state.sourceProfile?.identity?.name ?? sourceAccount?.name,\n bio: state.sourceProfile?.identity?.bio ?? sourceAccount?.intro ?? undefined,\n location: state.sourceProfile?.identity?.location ?? sourceAccount?.location ?? undefined,\n skills: state.sourceProfile?.attributes?.skills,\n interests: state.sourceProfile?.attributes?.interests,\n },\n };\n\n // Build candidates from persisted opportunities. Each opportunity carries its DB id\n // so the negotiation graph's finalize node can update its status from the outcome.\n logger.verbose('[Graph:Negotiate] Building candidates from opportunities', {\n opportunityCount: state.opportunities.length,\n discoveryUserId,\n });\n\n const candidateEntries = state.opportunities\n .map(opp => {\n // Skip opportunities where any introducer exists but has not yet approved.\n const introducerActors = (opp.actors as OpportunityActor[])\n .filter(a => a.role === 'introducer');\n if (introducerActors.length > 0 && !introducerActors.every(a => a.approved === true)) {\n logger.verbose('[Graph:Negotiate] Skipping opportunity: introducer not approved', {\n opportunityId: opp.id,\n introducerCount: introducerActors.length,\n approvedCount: introducerActors.filter(a => a.approved === true).length,\n });\n return null;\n }\n\n const candidateActor = (opp.actors as Array<{ userId: string; role?: string; networkId?: string; intentId?: string }>)\n .find(a => a.userId !== discoveryUserId);\n if (!candidateActor) {\n logger.verbose('[Graph:Negotiate] Skipping opportunity: no candidateActor found', {\n opportunityId: opp.id,\n discoveryUserId,\n actors: (opp.actors as OpportunityActor[])?.map(a => ({ userId: a.userId, role: a.role })) ?? [],\n });\n return null;\n }\n return { opp, candidateActor };\n })\n .filter((e): e is NonNullable<typeof e> => e !== null);\n\n logger.verbose('[Graph:Negotiate] Candidate filtering complete', {\n inputOpportunities: state.opportunities.length,\n outputCandidates: candidateEntries.length,\n });\n\n const candidates: NegotiationCandidate[] = await Promise.all(\n candidateEntries.map(async ({ opp, candidateActor }) => {\n const userId = candidateActor.userId as string;\n const [profile, user, activeIntents, intent] = await Promise.all([\n this.database.getProfile(userId).catch(() => null),\n this.database.getUser(userId).catch(() => null),\n this.database.getActiveIntents(userId).catch(() => []),\n candidateActor.intentId\n ? this.database.getIntent(candidateActor.intentId as string).catch(() => null)\n : null,\n ]);\n\n const toNegIntent = (ai: { id?: string | null; summary?: string | null; payload?: string | null }) => ({\n id: (ai.id ?? candidateActor.intentId) as string,\n title: ai.summary ?? '',\n description: ai.payload ?? '',\n confidence: 1,\n });\n const triggerInActive = activeIntents.some(ai => ai.id === candidateActor.intentId);\n const triggerFallback = !triggerInActive && intent ? [toNegIntent(intent)] : [];\n const candidateIntents = [\n ...triggerFallback,\n ...activeIntents.filter(ai => ai.id === candidateActor.intentId).map(toNegIntent),\n ...activeIntents.filter(ai => ai.id !== candidateActor.intentId).map(toNegIntent),\n ].slice(0, 5);\n\n return {\n userId,\n opportunityId: opp.id as string,\n reasoning: (opp.interpretation as { reasoning?: string } | null)?.reasoning ?? '',\n valencyRole: candidateActor.role ?? 'peer',\n networkId: candidateActor.networkId as string,\n ...(state.searchQuery?.trim() && { discoveryQuery: state.searchQuery.trim() }),\n candidateUser: {\n id: userId,\n intents: candidateIntents,\n profile: {\n name: profile?.identity?.name ?? user?.name,\n bio: profile?.identity?.bio ?? user?.intro ?? undefined,\n location: profile?.identity?.location ?? user?.location ?? undefined,\n skills: profile?.attributes?.skills,\n interests: profile?.attributes?.interests,\n },\n },\n };\n }),\n );\n\n const isChatPath = !!state.options?.conversationId;\n const maxTurns = isChatPath\n ? Number(process.env.NEGOTIATION_MAX_TURNS_CHAT) || 4\n : Number(process.env.NEGOTIATION_MAX_TURNS_AMBIENT) || 6;\n\n // Fetch per-candidate index context (group by networkId to avoid duplicate lookups)\n const uniqueIndexIds = [...new Set(candidates.map(c => c.networkId).filter((id): id is string => !!id))];\n const indexContextMap = new Map<string, string>();\n await Promise.all(\n uniqueIndexIds.map(async (networkId) => {\n const ctx = await this.database.getNetworkMemberContext(networkId, discoveryUserId).catch(() => null);\n const prompt = [ctx?.indexPrompt, ctx?.memberPrompt]\n .filter((v): v is string => !!v?.trim())\n .join('\\n\\n');\n if (prompt) indexContextMap.set(networkId, prompt);\n }),\n );\n\n // Decide turn timeout.\n // - Background/queue path (no conversationId): always the park-window\n // budget (AMBIENT_PARK_WINDOW_MS, 5 min). Turns park in\n // `waiting_for_agent` and are picked up via polling; the dispatcher\n // additionally short-circuits to the system agent when no personal\n // agent has a fresh heartbeat (see AgentDispatcherImpl).\n // - Chat path with a personal agent authorized: use the same park-window\n // so the dispatcher parks the turn and the user's personal agent can\n // pick it up via polling.\n // - Chat path with no personal agent: use a short timeout (30s) so the\n // system `Index Negotiator` kicks in without stalling the chat.\n // Check the personal agent per unique candidate network so cross-network\n // chat runs don't get a single authorized agent deciding the timeout for\n // every candidate. Only use the long (polling) timeout when a personal\n // agent is authorized on ALL candidate networks; otherwise fall back to\n // the short timeout so chats don't stall on a network where only the\n // system negotiator is allowed.\n const hasPersonalAgent = isChatPath && this.agentDispatcher\n ? (uniqueIndexIds.length > 0\n ? (await Promise.all(\n uniqueIndexIds.map((networkId) =>\n this.agentDispatcher!.hasPersonalAgent(\n discoveryUserId,\n { action: 'manage:negotiations', scopeType: 'network', scopeId: networkId },\n ).catch(() => false),\n ),\n )).every(Boolean)\n : false)\n : false;\n // Orchestrator (chat-driven a2h) fan-out uses a tight 60s park window —\n // the user is watching the stream, so we cannot afford the 5-min ambient\n // budget. Ambient keeps its heartbeat-aware long/short split.\n const ORCHESTRATOR_PARK_WINDOW_MS = 60_000;\n const isOrchestrator = state.trigger === 'orchestrator';\n const useLongTimeout = !isChatPath || hasPersonalAgent;\n const timeoutMs = isOrchestrator\n ? ORCHESTRATOR_PARK_WINDOW_MS\n : useLongTimeout ? AMBIENT_PARK_WINDOW_MS : 30_000;\n\n logger.info('negotiateNode timeout decision', {\n discoveryUserId,\n trigger: state.trigger,\n isChatPath,\n isOrchestrator,\n hasDispatcher: !!this.agentDispatcher,\n hasPersonalAgent,\n useLongTimeout,\n timeoutMs,\n candidateCount: candidates.length,\n });\n\n // Per-candidate hook — always-on. Accumulates negotiation resolutions\n // for discovery question generation. Additionally, for the orchestrator\n // trigger: flips the opp from 'pending' to 'draft' and pushes an\n // `opportunity_draft_ready` event so the frontend can render it\n // inline as soon as it resolves, rather than waiting for the full\n // fan-out. Abort (e.g. user closed the chat) suppresses both the\n // status flip and the event — the in-flight negotiation finishes\n // naturally but its card never reaches the user.\n // Build a stable order index so that resolutions accumulated via the\n // per-candidate async hook can be re-sorted to candidate-list order\n // before being handed to buildQuestionPrompt. Without this the LLM\n // sees negotiations in completion-time order (non-deterministic).\n const candidateOrderById = new Map<string, number>();\n candidates.forEach((c, i) => candidateOrderById.set(c.userId, i));\n\n const resolutions: Array<NegotiationResolution & { __order: number }> = [];\n\n const onCandidateResolved: OnNegotiationResolved = async ({ candidate, accepted, turns, outcome }) => {\n resolutions.push({\n __order: candidateOrderById.get(candidate.userId) ?? Number.MAX_SAFE_INTEGER,\n candidateUserId: candidate.userId,\n counterpartyHint: (() => {\n const bio = candidate.candidateUser.profile?.bio?.trim();\n if (bio) return bio;\n return (candidate.candidateUser.profile?.interests ?? []).join(\", \");\n })(),\n indexContext: candidate.networkId\n ? indexContextMap.get(candidate.networkId) ?? \"\"\n : \"\",\n turns,\n outcome,\n });\n\n if (state.trigger !== 'orchestrator') return;\n // ─── orchestrator streaming body ───\n const abortSignal = requestContext.getStore()?.abortSignal;\n if (abortSignal?.aborted) return;\n if (!accepted || !candidate.opportunityId) return;\n\n // Only emit after a successful status flip — the frontend keys\n // cards off `opportunity.status === 'draft'`, so emitting a row\n // with its pre-flip status would render inconsistently. If the\n // flip fails we log and drop the event; the negotiation result\n // is still captured in acceptedResults for the final summary.\n const updated = await this.database\n .updateOpportunityStatus(candidate.opportunityId, 'draft')\n .catch((err) => {\n logger.warn('[Graph:Negotiate] failed to flip opp to draft; suppressing draft-ready event', {\n opportunityId: candidate.opportunityId,\n error: err,\n });\n return null;\n });\n if (!updated || abortSignal?.aborted) return;\n\n const counterpartName = candidate.candidateUser.profile?.name ?? '';\n const viewerName = sourceUser.profile.name;\n const rawReasoning = updated.interpretation?.reasoning ?? '';\n const personalizedSummary = viewerCentricCardSummary(\n rawReasoning,\n counterpartName,\n undefined,\n viewerName,\n );\n\n traceEmitter?.({\n type: 'opportunity_draft_ready',\n opportunityId: candidate.opportunityId,\n opportunity: updated,\n personalizedSummary,\n counterparty: {\n userId: candidate.candidateUser.id,\n ...(candidate.candidateUser.profile?.name\n ? { name: candidate.candidateUser.profile.name }\n : {}),\n },\n });\n };\n\n const negotiationWork = negotiateCandidates(\n this.negotiationGraph, sourceUser, candidates,\n { networkId: '', prompt: '' }, // base context, overridden per-candidate below\n { maxTurns, traceEmitter: traceEmitter ?? undefined,\n indexContextOverrides: indexContextMap,\n timeoutMs,\n trigger: state.trigger === 'orchestrator' ? 'orchestrator' : 'ambient',\n onCandidateResolved },\n );\n\n // MCP-only: race the whole negotiate phase against a budget. When the\n // timer wins we return early with a `timed_out` trace; the unresolved\n // promise keeps running in the Bun event loop and each candidate's\n // finalize node updates its opp status in the DB. We deliberately do\n // NOT await it, NOT abort it, and NOT mutate state.opportunities —\n // the MCP tool handler refreshes statuses from the DB before\n // responding. Bounded blast radius: at most ~20 s of background work\n // per request; orphans heal via maintenance scripts or IND-279 when\n // it lands.\n const budgetMs = state.options.negotiateTimeoutMs;\n let acceptedResults: Awaited<typeof negotiationWork>;\n if (budgetMs !== undefined) {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerWork = new Promise<typeof NEGOTIATE_TIMER_SENTINEL>((resolve) => {\n timerId = setTimeout(() => resolve(NEGOTIATE_TIMER_SENTINEL), budgetMs);\n });\n // try/finally ensures the timer is cleared on every exit path —\n // sentinel-win, work-win, AND `negotiationWork` rejection. Without\n // this, a rejected negotiation would leave the timer pending and\n // keep the event loop alive until `budgetMs` elapses.\n let raced: typeof NEGOTIATE_TIMER_SENTINEL | Awaited<typeof negotiationWork>;\n try {\n raced = await Promise.race([negotiationWork, timerWork]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n if (raced === NEGOTIATE_TIMER_SENTINEL) {\n // Floating promise is intentional — see comment above.\n void negotiationWork.catch((err) => {\n logger.warn('[Graph:Negotiate] background negotiation failed after timer fired', { error: err });\n });\n logger.warn('[Graph:Negotiate] timed out — returning partial results to caller', {\n discoveryUserId,\n candidateCount: candidates.length,\n negotiateTimeoutMs: budgetMs,\n });\n traceEmitter?.({ type: \"graph_end\", name: \"Negotiation graph\", durationMs: Date.now() - graphStart });\n const orderedResolutionsPartial = [...resolutions]\n .sort((a, b) => a.__order - b.__order)\n .map(({ __order: _o, ...r }) => r as NegotiationResolution);\n const discoveryNegotiationsPartial = orderedResolutionsPartial.map(toDiscoveryNegotiation);\n const discoverySummaryPartial = buildDiscoverySummary(orderedResolutionsPartial);\n return {\n trace: [{\n node: 'negotiate',\n detail: 'timed_out',\n data: {\n negotiateTimeoutMs: budgetMs,\n candidateCount: candidates.length,\n durationMs: Date.now() - graphStart,\n },\n }],\n discoveryNegotiations: discoveryNegotiationsPartial,\n discoverySummary: discoverySummaryPartial,\n };\n }\n acceptedResults = raced;\n } else {\n acceptedResults = await negotiationWork;\n }\n\n // No filtering: every candidate's outcome (accept/reject/stalled) was applied to its\n // opportunity row by the negotiation graph's finalize node via the opportunityId we\n // passed. state.opportunities stays as it was at persist time; DB has the new statuses.\n const acceptedUserIds = new Set(acceptedResults.map(r => r.userId));\n const negotiationDurationMs = Date.now() - graphStart;\n\n const candidateTraceEntries = candidates.map(c => {\n const accepted = acceptedUserIds.has(c.userId);\n const result = accepted ? acceptedResults.find(r => r.userId === c.userId) : null;\n const name = c.candidateUser.profile?.name ?? c.userId;\n const outcome = accepted ? 'accepted' : 'rejected_or_stalled';\n return {\n node: 'negotiate_candidate',\n detail: `${name}: ${outcome}`,\n data: {\n userId: c.userId,\n opportunityId: c.opportunityId,\n name,\n outcome,\n turns: result?.turnCount ?? 0,\n },\n };\n });\n\n const acceptedCount = acceptedResults.length;\n const otherCount = candidates.length - acceptedCount;\n const negotiateTrace = [\n {\n node: 'negotiate',\n detail: `${candidates.length} candidate(s) -> ${acceptedCount} accepted, ${otherCount} rejected/stalled`,\n data: {\n durationMs: negotiationDurationMs,\n candidateCount: candidates.length,\n acceptedCount,\n otherCount,\n },\n },\n ...candidateTraceEntries,\n ];\n\n traceEmitter?.({ type: \"graph_end\", name: \"Negotiation graph\", durationMs: Date.now() - graphStart });\n const orderedResolutions = [...resolutions]\n .sort((a, b) => a.__order - b.__order)\n .map(({ __order: _o, ...r }) => r as NegotiationResolution);\n const discoveryNegotiations = orderedResolutions.map(toDiscoveryNegotiation);\n const discoverySummary = buildDiscoverySummary(orderedResolutions);\n return {\n trace: negotiateTrace,\n discoveryNegotiations,\n discoverySummary,\n };\n } catch (err) {\n logger.error(\"[Graph:Negotiate] Negotiation stage failed\", { error: err });\n traceEmitter?.({ type: \"graph_end\", name: \"Negotiation graph\", durationMs: Date.now() - graphStart });\n return {\n trace: [{\n node: 'negotiate',\n detail: 'Negotiation failed',\n data: { durationMs: Date.now() - graphStart, error: true },\n }],\n discoveryNegotiations: [],\n discoverySummary: buildDiscoverySummary([]),\n };\n }\n };\n\n /**\n * Node 4: Ranking\n * Sorts evaluated opportunities by score, applies limit, dedupes by actor-set hash.\n */\n const rankingNode = withNodeTrace(\n \"opportunity-ranking\",\n async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.ranking\", async () => {\n logger.verbose('[Graph:Ranking] Starting ranking', {\n evaluatedCount: state.evaluatedOpportunities.length,\n });\n\n try {\n const sorted = [...state.evaluatedOpportunities].sort((a, b) => b.score - a.score);\n const limit = state.options.limit ?? 20;\n const ranked = sorted.slice(0, limit);\n\n const actorSetKey = (opp: EvaluatedOpportunity) =>\n opp.actors\n .map((a) => `${a.userId}:${a.networkId}`)\n .sort()\n .join('|');\n const seen = new Set<string>();\n const deduplicated = ranked.filter((opp) => {\n const key = actorSetKey(opp);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n logger.verbose('[Graph:Ranking] Ranking complete', {\n sorted: sorted.length,\n afterLimit: ranked.length,\n afterDedup: deduplicated.length,\n });\n return { evaluatedOpportunities: deduplicated };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Ranking] Failed', { error });\n return {\n evaluatedOpportunities: [],\n error: 'Failed to rank opportunities.',\n trace: [{\n node: \"ranking_fatal\",\n detail: `Ranking failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const opps = r?.evaluatedOpportunities as unknown[];\n return opps ? `Ranked ${opps.length} opportunity(ies)` : undefined;\n },\n );\n\n /**\n * Node: intro_validation (create_introduction path)\n * Validates index scope, membership for introducer and all party users, and no existing opportunity.\n */\n const introValidationNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.introValidation\", async () => {\n logger.verbose('[Graph:IntroValidation] Starting', {\n userId: state.userId,\n networkId: state.networkId,\n entitiesCount: state.introductionEntities?.length ?? 0,\n });\n\n try {\n const entities = state.introductionEntities ?? [];\n const primaryNetworkId = (state.networkId ?? entities[0]?.networkId) as Id<'networks'> | undefined;\n const partyUserIds = [...new Set(entities.map((e) => e.userId).filter((id) => id !== state.userId))];\n\n if (!primaryNetworkId || partyUserIds.length < 1) {\n return {\n error: 'Introduction requires networkId and at least two entities (introducer + one counterpart).',\n };\n }\n\n if (state.requiredNetworkId && primaryNetworkId !== state.requiredNetworkId) {\n return {\n error: 'This chat is scoped to a different community. You can only introduce members of the current community.',\n };\n }\n\n const [introducerIsMember, introducerIsOwner] = await Promise.all([\n this.database.isNetworkMember(primaryNetworkId, state.userId),\n this.database.isIndexOwner(primaryNetworkId, state.userId),\n ]);\n if (!introducerIsMember && !introducerIsOwner) {\n return {\n error: 'One or more users are not members of the specified community. You can only introduce members who share a network.',\n };\n }\n const partyInScope = await Promise.all(\n partyUserIds.map(async (userId) => {\n const [isMember, isOwner] = await Promise.all([\n this.database.isNetworkMember(primaryNetworkId, userId),\n this.database.isIndexOwner(primaryNetworkId, userId),\n ]);\n return isMember || isOwner;\n }),\n );\n const allPartyMembers = partyInScope.every(Boolean);\n if (!allPartyMembers) {\n return {\n error: 'One or more users are not members of the specified community. You can only introduce members who share a network.',\n };\n }\n\n const exists = await this.database.opportunityExistsBetweenActors(partyUserIds, primaryNetworkId);\n if (exists) {\n return { error: 'An opportunity already exists between these people.' };\n }\n\n logger.verbose('[Graph:IntroValidation] Validation passed');\n return {};\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n logger.error('[Graph:IntroValidation] Failed', {\n userId: state.userId,\n networkId: state.networkId,\n error: err,\n });\n return {\n error: 'Introduction validation failed.',\n trace: [{\n node: \"intro_validation_fatal\",\n detail: `IntroValidation failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n };\n\n /**\n * Build fallback reasoning and actors when evaluator returns empty or throws.\n */\n function buildIntroFallback(\n entities: EvaluatorEntity[],\n state: typeof OpportunityGraphState.State,\n primaryNetworkId: Id<'networks'>,\n introducerName?: string\n ): { reasoning: string; score: number; actors: EvaluatedOpportunityActor[] } {\n const reasoning =\n `${introducerName ?? 'A member'} believes these people should connect.` +\n (state.introductionHint ? ` Context: ${state.introductionHint}` : '');\n const score = 70;\n const partyUserIds = entities.map((e) => e.userId).filter((id) => id !== state.userId);\n const actors: EvaluatedOpportunityActor[] = partyUserIds.map((uid) => ({\n userId: uid as Id<'users'>,\n role: 'peer' as const,\n networkId: primaryNetworkId,\n }));\n return { reasoning, score, actors };\n }\n\n /**\n * Node: intro_evaluation (create_introduction path)\n * Runs entity-bundle evaluator and sets evaluatedOpportunities (one) + introductionContext.\n */\n const introEvaluationNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.introEvaluation\", async () => {\n logger.verbose('[Graph:IntroEvaluation] Starting', { userId: state.userId });\n\n if (state.error) {\n return { evaluatedOpportunities: [], agentTimings: [] };\n }\n\n const entities = state.introductionEntities ?? [];\n const primaryNetworkId = (state.networkId ?? entities[0]?.networkId) as Id<'networks'> | undefined;\n if (!primaryNetworkId || entities.length < 2) {\n return { evaluatedOpportunities: [], error: 'Missing entities or network for introduction.', agentTimings: [] };\n }\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n let introducerName: string | undefined;\n let reasoning: string;\n let score: number;\n let actors: EvaluatedOpportunityActor[] = [];\n\n const _traceEmitterIntro = requestContext.getStore()?.traceEmitter;\n let _introEvalStarted = false;\n let _evalStart = Date.now();\n try {\n const introducerUser = await this.database.getUser(state.userId);\n introducerName = introducerUser?.name ?? undefined;\n const networkContexts = await buildNetworkContexts(entities, this.database);\n const input: EvaluatorInput = {\n discovererId: state.userId,\n entities,\n introductionMode: true,\n introducerName,\n introductionHint: state.introductionHint ?? undefined,\n networkContexts,\n };\n\n _evalStart = Date.now();\n _traceEmitterIntro?.({ type: \"agent_start\", name: \"intro-evaluator\" });\n _introEvalStarted = true;\n const evaluated = await (evaluatorAgent as OpportunityEvaluator).invokeEntityBundle(input, { minScore: 0 });\n const _introDuration = Date.now() - _evalStart;\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _introDuration });\n _traceEmitterIntro?.({ type: \"agent_end\", name: \"intro-evaluator\", durationMs: _introDuration, summary: \"Evaluated introduction\" });\n if (evaluated.length > 0) {\n const best = evaluated[0];\n reasoning = best.reasoning;\n score = best.score;\n actors = best.actors.map((a) => ({\n userId: a.userId as Id<'users'>,\n role: a.role,\n intentId: a.intentId ?? undefined,\n networkId: primaryNetworkId,\n }));\n } else {\n const fallback = buildIntroFallback(entities, state, primaryNetworkId, introducerName);\n reasoning = fallback.reasoning;\n score = fallback.score;\n actors = fallback.actors;\n }\n } catch (evalErr) {\n const errMsg = evalErr instanceof Error ? evalErr.message : String(evalErr);\n // Close the intro-evaluator span if it was started before the error\n if (_introEvalStarted) {\n const _introErrDuration = Date.now() - _evalStart;\n _traceEmitterIntro?.({ type: \"agent_end\", name: \"intro-evaluator\", durationMs: _introErrDuration, summary: `error — ${errMsg}` });\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _introErrDuration });\n }\n logger.warn('[Graph:IntroEvaluation] Evaluator or getUser failed, using fallback', { error: evalErr });\n const fallback = buildIntroFallback(entities, state, primaryNetworkId, introducerName);\n reasoning = fallback.reasoning;\n score = fallback.score;\n actors = fallback.actors;\n return {\n evaluatedOpportunities: [{ actors, score, reasoning }],\n introductionContext: { createdByName: introducerName },\n options: { ...state.options, initialStatus: state.options.initialStatus ?? 'latent' },\n agentTimings: agentTimingsAccum,\n trace: [{\n node: \"intro_evaluation_fatal\",\n detail: `IntroEvaluation failed (using fallback): ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n\n const evaluatedOpportunity: EvaluatedOpportunity = {\n actors,\n score,\n reasoning,\n };\n\n return {\n evaluatedOpportunities: [evaluatedOpportunity],\n introductionContext: { createdByName: introducerName },\n options: { ...state.options, initialStatus: state.options.initialStatus ?? 'latent' },\n agentTimings: agentTimingsAccum,\n };\n });\n };\n\n /**\n * Node 5: Persist\n * Creates opportunities from evaluator-proposed actors (networkId, userId, role, optional intent).\n */\n const persistNode = withNodeTrace(\n \"opportunity-persist\",\n async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.persist\", async () => {\n const startTime = Date.now();\n const initialStatus = resolveInitialStatus(state.trigger, state.options.initialStatus);\n logger.verbose('[Graph:Persist] Starting persistence (dedup-v2)', {\n opportunitiesToCreate: state.evaluatedOpportunities.length,\n trigger: state.trigger,\n initialStatus,\n });\n\n if (state.evaluatedOpportunities.length === 0) {\n logger.verbose('[Graph:Persist] No opportunities to persist');\n return { opportunities: [] };\n }\n\n try {\n const itemsToPersist: CreateOpportunityData[] = [];\n const reactivatedOpportunities: Opportunity[] = [];\n const existingBetweenActors: Array<{\n candidateUserId: Id<'users'>;\n networkId: Id<'networks'>;\n existingOpportunityId?: Id<'opportunities'>;\n existingStatus?: string;\n }> = [];\n const now = new Date().toISOString();\n // Only skip 'draft' (chat-only) opportunities during dedup.\n // 'latent' must NOT be skipped — background discovery creates latent opportunities,\n // and excluding them causes the same user pair to get duplicate opportunities\n // when multiple intents trigger separate discovery jobs (IND-166).\n const DEDUP_SKIP_STATUSES: Array<'draft'> = ['draft'];\n\n const introducerUserForOnBehalf = state.onBehalfOfUserId\n ? await this.database.getUser(state.userId)\n : null;\n\n // Orchestrator-only: collect already-accepted pairs so Task 7's\n // discover_opportunities tool can tell the LLM \"these pairs are\n // already connected, surface the existing chat rather than\n // creating a new draft\". Runs in parallel across unique\n // counterparties (a single evaluator pass can return multiple\n // opps per counterparty; we only hit the DB once per pair).\n // Failures are swallowed — the per-pair query is best-effort.\n const dedupAlreadyAccepted: Array<{ opportunityId: string; counterpartyUserId: string }> = [];\n if (state.trigger === 'orchestrator') {\n // Use the same viewer-resolution as evaluation/negotiate/persist\n // on-behalf branches so an introducer-driven orchestrator run\n // queries accepted opps between the *target* user and the\n // counterparty, not between the introducer and the counterparty.\n const dedupUserId = (state.onBehalfOfUserId ?? state.userId) as string;\n const uniqueCounterparts = new Set<string>();\n for (const evaluated of state.evaluatedOpportunities) {\n const candidateUserId = evaluated.actors.find(a => a.userId !== dedupUserId)?.userId;\n if (candidateUserId) uniqueCounterparts.add(candidateUserId);\n }\n const lookups = await Promise.all(\n [...uniqueCounterparts].map(async (counterpartyUserId) => {\n const accepted = await this.database\n .findOpportunitiesByActors([dedupUserId, counterpartyUserId], { includeIntroducers: true, statuses: ['accepted'] })\n .catch((err: unknown) => {\n logger.warn('[Graph:Persist] findOpportunitiesByActors (sibling-accept) failed', {\n userId: dedupUserId,\n counterpartyUserId,\n error: err,\n });\n return [] as Awaited<ReturnType<typeof this.database.findOpportunitiesByActors>>;\n });\n return accepted.map((opp: { id: string }) => ({ opportunityId: opp.id, counterpartyUserId }));\n }),\n );\n dedupAlreadyAccepted.push(...lookups.flat());\n }\n\n for (const evaluated of state.evaluatedOpportunities) {\n const indexIdForActors = state.networkId ?? evaluated.actors[0]?.networkId;\n let actors: OpportunityActor[];\n let data: CreateOpportunityData;\n\n logger.verbose('[Graph:Persist:PathSelect]', {\n isIntroduction: !!state.introductionContext,\n stateUserId: state.userId,\n stateIndexId: state.networkId,\n evaluatedActorUserIds: evaluated.actors.map(a => a.userId),\n });\n\n if (state.introductionContext) {\n if (indexIdForActors === undefined) {\n logger.warn('[Graph:Persist] Introduction path missing networkId; skipping opportunity', {\n userId: state.userId,\n actorsCount: evaluated.actors.length,\n });\n continue;\n }\n // Introduction path: manual detection, introducer actor, curator_judgment signal.\n const evaluatorActors: OpportunityActor[] = evaluated.actors.map((a: EvaluatedOpportunityActor) => ({\n networkId: a.networkId ?? indexIdForActors,\n userId: a.userId,\n role: a.role,\n ...(a.intentId ? { intent: a.intentId } : {}),\n }));\n const viewerAlreadyInActors = evaluatorActors.some(a => a.userId === state.userId);\n actors = viewerAlreadyInActors\n ? evaluatorActors\n : [\n ...evaluatorActors,\n { networkId: indexIdForActors, userId: state.userId, role: 'introducer' as const, approved: false },\n ];\n data = {\n detection: {\n source: 'manual',\n createdBy: state.userId,\n createdByName: state.introductionContext.createdByName,\n timestamp: now,\n },\n actors,\n interpretation: {\n category: 'collaboration',\n reasoning: evaluated.reasoning,\n confidence: evaluated.score / 100,\n signals: [\n {\n type: 'curator_judgment',\n weight: 1,\n detail: `Introduction by ${state.introductionContext.createdByName ?? 'a member'} via chat`,\n },\n ],\n },\n context: {\n networkId: state.networkId ?? indexIdForActors,\n ...(state.options.conversationId ? { conversationId: state.options.conversationId } : {}),\n },\n confidence: String(evaluated.score / 100),\n status: initialStatus,\n };\n } else if (state.onBehalfOfUserId) {\n if (indexIdForActors === undefined) {\n logger.warn('[Graph:Persist] Introducer discovery path missing networkId; skipping opportunity', {\n userId: state.userId,\n actorsCount: evaluated.actors.length,\n });\n continue;\n }\n // Introducer discovery path: introducer is state.userId, target is onBehalfOfUserId.\n const evaluatorActors: OpportunityActor[] = evaluated.actors.map((a: EvaluatedOpportunityActor) => ({\n networkId: a.networkId ?? indexIdForActors,\n userId: a.userId,\n role: a.role,\n ...(a.intentId ? { intent: a.intentId } : {}),\n }));\n const viewerAlreadyInActors = evaluatorActors.some(a => a.userId === state.userId);\n actors = viewerAlreadyInActors\n ? evaluatorActors\n : [\n ...evaluatorActors,\n { networkId: indexIdForActors!, userId: state.userId, role: 'introducer' as const, approved: false },\n ];\n\n const candidateUserId = evaluated.actors.find((a) => a.userId !== state.onBehalfOfUserId)?.userId;\n const overlapping = candidateUserId\n ? await this.database.findOpportunitiesByActors(\n [state.onBehalfOfUserId as Id<'users'>, candidateUserId as Id<'users'>],\n { excludeStatuses: DEDUP_SKIP_STATUSES },\n )\n : [];\n if (overlapping.length > 0) {\n const existing = overlapping[0];\n const isRecent = new Date(existing.createdAt).getTime() > Date.now() - DEDUP_WINDOW_MS;\n const sameIntroducer = existing.actors?.some(\n (actor) => actor.role === 'introducer' && actor.userId === state.userId,\n );\n\n if (existing.status === 'expired' || existing.status === 'stalled') {\n // Reactivate expired or stalled opportunities (only if same introducer for expired).\n // A different introducer creating for an expired pair falls through to new creation —\n // the prior expiry belongs to the original introducer, not this one.\n // Stalled opportunities are reactivated regardless of age: a stalled negotiation\n // is still in-flight for this pair, so we resume it rather than create a parallel one.\n if (existing.status === 'stalled' || sameIntroducer) {\n // Introduction path always targets 'draft' (chat-only surface) rather than using\n // initialStatus, because introductions are always chat-initiated, not background-discovered.\n const reactivated = await this.database.updateOpportunityStatus(existing.id, 'draft');\n if (reactivated) {\n logger.verbose('[Graph:Persist] Reactivated opportunity (introduction path)', {\n opportunityId: existing.id,\n candidateUserId,\n previousStatus: existing.status,\n });\n reactivatedOpportunities.push(reactivated);\n }\n continue;\n }\n } else if (existing.status === 'negotiating') {\n // Orphan heal (introduction path): same logic as discovery path\n const priorTask = await this.database.getNegotiationTaskForOpportunity(existing.id);\n if (priorTask) {\n const activeStates = ['submitted', 'working', 'input_required', 'waiting_for_agent', 'claimed'];\n const isFresh = (Date.now() - new Date(priorTask.updatedAt).getTime()) < 5 * 60 * 1000;\n if (activeStates.includes(priorTask.state) && isFresh) {\n existingBetweenActors.push({\n candidateUserId: candidateUserId as Id<'users'>,\n networkId: (state.networkId ?? indexIdForActors ?? '') as Id<'networks'>,\n existingOpportunityId: existing.id as Id<'opportunities'>,\n existingStatus: existing.status,\n });\n logger.verbose('[Graph:Persist] Skipping negotiating opportunity with active task (introduction path)', {\n opportunityId: existing.id,\n candidateUserId,\n taskState: priorTask.state,\n });\n continue;\n }\n }\n const reactivated = await this.database.updateOpportunityStatus(existing.id, 'draft');\n if (reactivated) {\n logger.info('[Graph:Persist] Resuming orphaned negotiating opportunity (introduction path)', {\n opportunityId: existing.id,\n candidateUserId,\n priorTaskState: priorTask?.state,\n });\n reactivatedOpportunities.push(reactivated);\n }\n continue;\n } else if (existing.status === 'latent') {\n // Upgrade latent to draft for introduction path\n const upgraded = await this.database.updateOpportunityStatus(existing.id, 'draft');\n if (upgraded) {\n logger.verbose('[Graph:Persist] Upgraded latent opportunity to draft (introduction path)', {\n opportunityId: existing.id,\n candidateUserId,\n });\n reactivatedOpportunities.push(upgraded);\n }\n continue;\n } else if (isRecent && candidateUserId) {\n // Time-gated skip: only skip if opportunity was created within DEDUP_WINDOW_MS\n existingBetweenActors.push({\n candidateUserId: candidateUserId as Id<'users'>,\n networkId: (state.networkId ?? indexIdForActors ?? '') as Id<'networks'>,\n existingOpportunityId: existing.id as Id<'opportunities'>,\n existingStatus: existing.status,\n });\n logger.verbose('[Graph:Persist] Skipping recent duplicate (introduction path)', {\n candidateUserId,\n existingStatus: existing.status,\n existingOpportunityId: existing.id,\n });\n continue;\n }\n // Else: existing opportunity is old enough, allow new opportunity creation\n logger.verbose('[Graph:Persist] Allowing new opportunity; existing is outside dedup window (introduction path)', {\n candidateUserId,\n existingStatus: existing.status,\n existingOpportunityId: existing.id,\n });\n }\n\n data = {\n detection: {\n source: INTRODUCER_DISCOVERY_SOURCE,\n createdBy: state.userId,\n createdByName: introducerUserForOnBehalf?.name ?? undefined,\n timestamp: now,\n },\n actors,\n interpretation: {\n category: 'collaboration',\n reasoning: evaluated.reasoning,\n confidence: evaluated.score / 100,\n signals: [{\n type: 'curator_judgment',\n weight: 1,\n detail: `Introducer discovery for ${introducerUserForOnBehalf?.name ?? 'a member'} via background maintenance`,\n }],\n },\n context: {\n networkId: state.networkId ?? indexIdForActors,\n ...(state.options.conversationId ? { conversationId: state.options.conversationId } : {}),\n },\n confidence: String(evaluated.score / 100),\n status: initialStatus,\n };\n } else {\n // Discovery path: opportunity_graph source, no introducer, lifecycle guard for agent/patient.\n\n // Build premise lookup from discovery candidates for premise tracking.\n // When multiple premise candidates exist for the same user, keep the highest-similarity one.\n const premiseLookup = new Map<string, { premiseId: string; similarity: number }>();\n for (const c of state.candidates ?? []) {\n if (c.candidatePremiseId) {\n const existing = premiseLookup.get(c.candidateUserId);\n if (!existing || c.similarity > existing.similarity) {\n premiseLookup.set(c.candidateUserId, { premiseId: c.candidatePremiseId, similarity: c.similarity });\n }\n }\n }\n\n const evaluatorActors: OpportunityActor[] = evaluated.actors.map((a: EvaluatedOpportunityActor) => ({\n networkId: a.networkId ?? indexIdForActors,\n userId: a.userId,\n role: a.role,\n ...(a.intentId ? { intent: a.intentId } : {}),\n ...(premiseLookup.has(a.userId) ? { premise: premiseLookup.get(a.userId)!.premiseId as Id<'premises'> } : {}),\n }));\n actors = evaluatorActors;\n\n const hasIntroducerActor = actors.some(a => a.role === 'introducer');\n if (!hasIntroducerActor) {\n const discovererIdx = actors.findIndex(a => a.userId === state.userId);\n if (discovererIdx >= 0 && actors[discovererIdx].role === 'agent') {\n const counterpartIdx = actors.findIndex(\n (a, i) => i !== discovererIdx && a.role === 'patient'\n );\n actors[discovererIdx] = { ...actors[discovererIdx], role: 'patient' };\n if (counterpartIdx >= 0) {\n actors[counterpartIdx] = { ...actors[counterpartIdx], role: 'agent' };\n }\n logger.verbose('[Graph:Persist] Swapped discoverer from agent to patient for lifecycle visibility', {\n discovererId: state.userId,\n });\n }\n }\n\n // Index-agnostic dedup: find ANY existing opportunity between these users,\n // regardless of which index it was created in or whether context.networkId is set.\n const candidateUserId = evaluated.actors.find((a) => a.userId !== state.userId)?.userId;\n logger.verbose('[Graph:Persist:Dedup] Checking overlapping opportunities', {\n stateUserId: state.userId,\n candidateUserId: candidateUserId ?? 'NONE',\n evaluatedActors: evaluated.actors.map(a => ({ userId: a.userId, role: a.role })),\n });\n const overlapping = candidateUserId\n ? await this.database.findOpportunitiesByActors(\n [state.userId as Id<'users'>, candidateUserId as Id<'users'>],\n { excludeStatuses: DEDUP_SKIP_STATUSES },\n )\n : [];\n logger.verbose('[Graph:Persist:Dedup] findOpportunitiesByActors result', {\n count: overlapping.length,\n results: overlapping.map(o => ({ id: o.id, status: o.status, actors: o.actors?.map((a: OpportunityActor) => ({ userId: a.userId, role: a.role })) })),\n });\n\n if (overlapping.length > 0) {\n const existing = overlapping[0];\n const existingIndexId = (existing.context?.networkId ?? state.networkId ?? state.userNetworks?.[0] ?? '') as Id<'networks'>;\n const isRecent = new Date(existing.createdAt).getTime() > Date.now() - DEDUP_WINDOW_MS;\n\n if (existing.status === 'expired' || existing.status === 'stalled') {\n // Reactivate expired or stalled opportunities.\n // Stalled opportunities are reactivated regardless of age: a stalled negotiation\n // is still in-flight for this pair, so we resume it rather than create a parallel one.\n const reactivated = await this.database.updateOpportunityStatus(existing.id, initialStatus);\n if (reactivated) {\n logger.verbose('[Graph:Persist] Reactivated opportunity', {\n opportunityId: existing.id,\n candidateUserId,\n previousStatus: existing.status,\n newStatus: initialStatus,\n });\n reactivatedOpportunities.push(reactivated);\n }\n continue;\n } else if (existing.status === 'negotiating') {\n // Orphan heal: if a prior opportunity is stuck in 'negotiating' with a stale task,\n // reactivate it so the new discovery run can reuse it instead of creating a duplicate.\n const priorTask = await this.database.getNegotiationTaskForOpportunity(existing.id);\n if (priorTask) {\n const activeStates = ['submitted', 'working', 'input_required', 'waiting_for_agent', 'claimed'];\n const isFresh = (Date.now() - new Date(priorTask.updatedAt).getTime()) < 5 * 60 * 1000;\n if (activeStates.includes(priorTask.state) && isFresh) {\n // Still active — skip (lock gate in init node will handle)\n existingBetweenActors.push({\n candidateUserId: candidateUserId as Id<'users'>,\n networkId: existingIndexId,\n existingOpportunityId: existing.id as Id<'opportunities'>,\n existingStatus: existing.status,\n });\n logger.verbose('[Graph:Persist] Skipping negotiating opportunity with active task', {\n opportunityId: existing.id,\n candidateUserId,\n taskState: priorTask.state,\n });\n continue;\n }\n }\n // Task is stale or missing — reactivate the orphaned negotiating opportunity\n const reactivated = await this.database.updateOpportunityStatus(existing.id, initialStatus);\n if (reactivated) {\n logger.info('[Graph:Persist] Resuming orphaned negotiating opportunity', {\n opportunityId: existing.id,\n candidateUserId,\n priorTaskState: priorTask?.state,\n });\n reactivatedOpportunities.push(reactivated);\n }\n continue;\n } else if (existing.status === 'latent' && initialStatus !== 'latent') {\n // Upgrade latent (background-discovered) to the higher-priority status (e.g. pending)\n const upgraded = await this.database.updateOpportunityStatus(existing.id, initialStatus);\n if (upgraded) {\n logger.verbose('[Graph:Persist] Upgraded latent opportunity to higher-priority status', {\n opportunityId: existing.id,\n candidateUserId,\n previousStatus: 'latent',\n newStatus: initialStatus,\n });\n reactivatedOpportunities.push(upgraded);\n }\n continue;\n } else if (isRecent && candidateUserId) {\n // Time-gated skip: only skip if opportunity was created within DEDUP_WINDOW_MS\n // This prevents parallel job duplicates while allowing new discoveries for long-connected pairs\n existingBetweenActors.push({\n candidateUserId: candidateUserId as Id<'users'>,\n networkId: existingIndexId,\n existingOpportunityId: existing.id as Id<'opportunities'>,\n existingStatus: existing.status,\n });\n logger.verbose('[Graph:Persist] Skipping recent duplicate; opportunity created within dedup window', {\n candidateUserId,\n existingStatus: existing.status,\n existingOpportunityId: existing.id,\n createdAt: existing.createdAt,\n });\n continue;\n }\n // Else: existing opportunity is old enough (>10 min), allow new opportunity creation\n logger.verbose('[Graph:Persist] Allowing new opportunity; existing is outside dedup window', {\n candidateUserId,\n existingStatus: existing.status,\n existingOpportunityId: existing.id,\n createdAt: existing.createdAt,\n });\n }\n\n data = {\n detection: {\n source: 'opportunity_graph',\n createdBy: 'agent-opportunity-finder',\n ...(state.discoverySource === 'intent' && state.resolvedTriggerIntentId\n ? { triggeredBy: state.resolvedTriggerIntentId }\n : {}),\n timestamp: now,\n },\n actors,\n interpretation: {\n category: 'collaboration',\n reasoning: evaluated.reasoning,\n confidence: evaluated.score / 100,\n signals: [\n {\n type: evaluated.actors.some((a) => a.intentId) ? 'intent_match' : 'profile_match',\n weight: evaluated.score / 100,\n detail: 'Entity-bundle evaluator',\n },\n ],\n },\n context: {\n ...(state.networkId ? { networkId: state.networkId } : {}),\n ...(state.options.conversationId ? { conversationId: state.options.conversationId } : {}),\n },\n confidence: String(evaluated.score / 100),\n status: initialStatus,\n metadata: {\n evidence: evaluated.evidence ?? [],\n },\n };\n }\n\n try {\n validateOpportunityActors(data.actors);\n } catch (err) {\n logger.warn('[Graph:Persist] Skipping opportunity with invalid actors', {\n error: err instanceof Error ? err.message : String(err),\n opportunityReasoning: evaluated.reasoning?.slice(0, 80),\n });\n continue;\n }\n\n itemsToPersist.push(data);\n }\n\n const { created: createdList } = await persistOpportunities({\n database: this.database,\n embedder: this.embedder,\n items: itemsToPersist,\n });\n\n const allOpportunities = [...reactivatedOpportunities, ...createdList];\n\n logger.verbose('[Graph:Persist] Persistence complete', {\n created: createdList.length,\n reactivated: reactivatedOpportunities.length,\n existingBetweenActorsCount: existingBetweenActors.length,\n status: initialStatus,\n });\n return {\n opportunities: allOpportunities,\n existingBetweenActors,\n dedupAlreadyAccepted,\n trace: [{\n node: \"persist\",\n detail: `Created ${createdList.length}, reactivated ${reactivatedOpportunities.length}, ${existingBetweenActors.length} existing skipped, ${dedupAlreadyAccepted.length} already-accepted pair(s)`,\n data: {\n created: createdList.length,\n reactivated: reactivatedOpportunities.length,\n existingSkipped: existingBetweenActors.length,\n alreadyAccepted: dedupAlreadyAccepted.length,\n totalOutput: allOpportunities.length,\n durationMs: Date.now() - startTime,\n },\n }],\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Persist] Failed', { error });\n return {\n opportunities: [],\n existingBetweenActors: [],\n error: 'Failed to persist opportunities.',\n trace: [{\n node: \"persist_fatal\",\n detail: `Persist failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const opps = r?.opportunities as unknown[];\n return opps ? `Persisted ${opps.length} opportunity(ies)` : undefined;\n },\n );\n\n // ═══════════════════════════════════════════════════════════════\n // CRUD NODES (read, update, delete, send)\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * Read Node: List opportunities for the user, optionally filtered by networkId.\n * Fast path — no LLM calls.\n */\n const readNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.read\", async () => {\n logger.verbose('[Graph:Read] Listing opportunities', {\n userId: state.userId,\n networkId: state.networkId,\n });\n\n try {\n let indexIdFilter: string | undefined;\n if (state.networkId) {\n const [isMember, isOwner] = await Promise.all([\n this.database.isNetworkMember(state.networkId, state.userId),\n this.database.isIndexOwner(state.networkId, state.userId),\n ]);\n if (!isMember && !isOwner) {\n return {\n readResult: { count: 0, opportunities: [], message: 'Network not found or you are not a member.' },\n };\n }\n indexIdFilter = state.networkId;\n }\n\n const rawList = await this.database.getOpportunitiesForUser(state.userId, {\n limit: 30,\n ...(indexIdFilter ? { networkId: indexIdFilter } : {}),\n });\n const list = rawList.filter((opp) => opp.status !== 'expired');\n\n if (list.length === 0) {\n return {\n readResult: {\n count: 0,\n message: 'You have no opportunities yet. Use discover_opportunities to search for connections.',\n opportunities: [],\n },\n };\n }\n\n // Dedupe by counterpart set (same people = one row) so chat does not show \"You and X\" per index\n const counterpartKey = (opp: (typeof list)[number]) =>\n opp.actors\n .filter((a: OpportunityActor) => a.userId !== state.userId && a.role !== 'introducer')\n .map((a: OpportunityActor) => a.userId)\n .sort()\n .join(',');\n const byKey = new Map<string, (typeof list)[number]>();\n for (const opp of list) {\n const key = counterpartKey(opp);\n const existing = byKey.get(key);\n const conf = Number(opp.interpretation?.confidence ?? opp.confidence ?? 0);\n const existingConf = existing ? Number(existing.interpretation?.confidence ?? existing.confidence ?? 0) : 0;\n const oppTime = opp.updatedAt instanceof Date ? opp.updatedAt.getTime() : new Date(opp.updatedAt).getTime();\n const existingTime = existing\n ? (existing.updatedAt instanceof Date ? existing.updatedAt.getTime() : new Date(existing.updatedAt).getTime())\n : 0;\n if (!existing || conf > existingConf || (conf === existingConf && oppTime > existingTime)) {\n byKey.set(key, opp);\n }\n }\n const dedupedList = [...byKey.values()];\n\n const sourceLabel: Record<string, string> = {\n chat: 'Suggested in chat',\n opportunity_graph: 'System match',\n manual: 'Manual',\n cron: 'Scheduled',\n member_added: 'Member added',\n introducer_discovery: 'Suggested by contact',\n };\n\n const enriched = await Promise.all(\n dedupedList.map(async (opp) => {\n // \"Other parties\" = all actors who are not the current user (exclude introducer for suggestedBy).\n // Opportunity graph persists roles as 'agent'|'patient'|'peer'; manual/createManual use 'party'.\n const otherParties = opp.actors.filter((a: OpportunityActor) => a.userId !== state.userId && a.role !== 'introducer');\n const introducer = opp.actors.find((a: OpportunityActor) => a.role === 'introducer');\n const partyIds = otherParties.map((a: OpportunityActor) => a.userId);\n const idsToResolve = introducer ? [...partyIds, introducer.userId] : partyIds;\n // Use the counterpart's (non-viewer) networkId — it reflects where the match was found.\n // actors[0] is typically the viewer with an arbitrary first-target-index value.\n const counterpartActor = opp.actors.find((a: OpportunityActor) => a.userId !== state.userId);\n const actorIndexId = counterpartActor?.networkId ?? opp.actors[0]?.networkId;\n const [indexRecord, ...profileAndUserPairs] = await Promise.all([\n actorIndexId ? this.database.getNetwork(actorIndexId) : Promise.resolve(null),\n ...idsToResolve.map(async (uid: string) => {\n const [profile, user] = await Promise.all([\n this.database.getProfile(uid),\n this.database.getUser(uid),\n ]);\n return (profile?.identity?.name ?? user?.name ?? 'Unknown') as string;\n }),\n ]);\n const connectedWith = profileAndUserPairs.slice(0, partyIds.length);\n const suggestedBy = introducer ? profileAndUserPairs[partyIds.length] ?? null : null;\n const category = opp.interpretation?.category ?? 'connection';\n const confidence = opp.interpretation?.confidence ?? (opp.confidence ? Number(opp.confidence) : null);\n const source = opp.detection?.source ? (sourceLabel[opp.detection.source] ?? opp.detection.source) : null;\n return {\n id: opp.id,\n indexName: indexRecord?.title ?? (actorIndexId ?? ''),\n connectedWith,\n suggestedBy,\n reasoning: opp.interpretation?.reasoning ?? 'Connection opportunity',\n status: opp.status,\n category,\n confidence: confidence != null ? confidence : null,\n source,\n };\n })\n );\n\n return {\n readResult: {\n count: enriched.length,\n message: `You have ${enriched.length} opportunity(ies).`,\n opportunities: enriched,\n },\n };\n } catch (err) {\n logger.error('[Graph:Read] Failed', { error: err });\n return {\n readResult: { count: 0, opportunities: [], message: 'Failed to list opportunities.' },\n };\n }\n });\n };\n\n /**\n * Update Node: Change opportunity status (accept, reject, etc.).\n * For 'accepted', enforces the self-accept guard: the caller's actor entry\n * must not already have `actedAt` set — i.e. the caller has not yet been\n * the one to advance this opportunity's state. Stamps `actedAt` on accept\n * atomically with the status change via `stampOpportunityActorAction`.\n */\n const updateNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.update\", async () => {\n logger.verbose('[Graph:Update] Updating opportunity status', {\n userId: state.userId,\n opportunityId: state.opportunityId,\n newStatus: state.newStatus,\n });\n\n try {\n if (!state.opportunityId) {\n return { mutationResult: { success: false, error: 'opportunityId is required.' } };\n }\n if (!state.newStatus || !['accepted', 'rejected', 'expired'].includes(state.newStatus)) {\n return { mutationResult: { success: false, error: 'newStatus must be one of: accepted, rejected, expired.' } };\n }\n\n const opp = await this.database.getOpportunity(state.opportunityId);\n if (!opp) {\n return { mutationResult: { success: false, error: 'Opportunity not found.' } };\n }\n const callerActor = opp.actors.find((a: OpportunityActor) => a.userId === state.userId);\n if (!callerActor) {\n return { mutationResult: { success: false, error: 'You are not part of this opportunity.' } };\n }\n\n // Self-accept guard: only applies to the 'accepted' transition. Reject/expire\n // remain available to all actors regardless of prior actedAt.\n if (state.newStatus === 'accepted' && callerActor.actedAt) {\n return {\n mutationResult: {\n success: false,\n error: 'You have already acted on this opportunity. The other party must accept.',\n },\n };\n }\n\n let conversationId: string | undefined;\n if (state.newStatus === 'accepted') {\n const counterpart = opp.actors.find(\n (a: OpportunityActor) => a.userId !== state.userId && a.role !== 'introducer'\n );\n if (counterpart) {\n const dm = await this.database.getOrCreateDM(state.userId, counterpart.userId);\n conversationId = dm.id;\n }\n }\n\n if (state.newStatus === 'accepted') {\n await this.database.stampOpportunityActorAction(\n state.opportunityId,\n state.userId,\n 'accepted',\n state.userId,\n );\n } else {\n // Reject/expire do not stamp actedAt on the caller; they are\n // terminal flips, not commit signals. Keep the legacy path.\n await this.database.updateOpportunityStatus(\n state.opportunityId,\n state.newStatus as 'rejected' | 'expired',\n );\n }\n\n return {\n mutationResult: {\n success: true,\n opportunityId: state.opportunityId,\n message: `Opportunity status updated to ${state.newStatus}.`,\n ...(conversationId && { conversationId }),\n },\n };\n } catch (err) {\n logger.error('[Graph:Update] Failed', { error: err });\n return { mutationResult: { success: false, error: 'Failed to update opportunity.' } };\n }\n });\n };\n\n /**\n * Delete Node: Expire/archive an opportunity.\n */\n const deleteNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.delete\", async () => {\n logger.verbose('[Graph:Delete] Expiring opportunity', {\n userId: state.userId,\n opportunityId: state.opportunityId,\n });\n\n try {\n if (!state.opportunityId) {\n return { mutationResult: { success: false, error: 'opportunityId is required.' } };\n }\n\n const opp = await this.database.getOpportunity(state.opportunityId);\n if (!opp) {\n return { mutationResult: { success: false, error: 'Opportunity not found.' } };\n }\n const isActor = opp.actors.some((a: OpportunityActor) => a.userId === state.userId);\n if (!isActor) {\n return { mutationResult: { success: false, error: 'You are not part of this opportunity.' } };\n }\n\n await this.database.updateOpportunityStatus(state.opportunityId, 'expired');\n\n return {\n mutationResult: {\n success: true,\n opportunityId: state.opportunityId,\n message: 'Opportunity archived (expired).',\n },\n };\n } catch (err) {\n logger.error('[Graph:Delete] Failed', { error: err });\n return { mutationResult: { success: false, error: 'Failed to delete opportunity.' } };\n }\n });\n };\n\n /**\n * Send Node: Promote latent or draft opportunity to pending + queue notification.\n */\n const sendNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.send\", async () => {\n logger.verbose('[Graph:Send] Sending opportunity', {\n userId: state.userId,\n opportunityId: state.opportunityId,\n });\n\n try {\n if (!state.opportunityId) {\n return { mutationResult: { success: false, error: 'opportunityId is required.' } };\n }\n\n const opp = await this.database.getOpportunity(state.opportunityId);\n if (!opp) {\n return { mutationResult: { success: false, error: 'Opportunity not found.' } };\n }\n const canSendStatus = opp.status === 'latent' || opp.status === 'draft';\n if (!canSendStatus) {\n return {\n mutationResult: {\n success: false,\n error: `Opportunity is already ${opp.status}; only latent or draft opportunities can be sent.`,\n },\n };\n }\n const senderActor = opp.actors.find((a: OpportunityActor) => a.userId === state.userId);\n const hasIntroducer = opp.actors.some((a: OpportunityActor) => a.role === 'introducer');\n const canSend =\n senderActor?.role === 'introducer' ||\n senderActor?.role === 'peer' ||\n (senderActor?.role === 'patient' && !hasIntroducer) ||\n (senderActor?.role === 'party' && !hasIntroducer);\n if (!senderActor) {\n return { mutationResult: { success: false, error: 'You are not part of this opportunity.' } };\n }\n if (!canSend) {\n return { mutationResult: { success: false, error: 'You cannot send this opportunity.' } };\n }\n\n await this.database.stampOpportunityActorAction(\n state.opportunityId,\n state.userId,\n 'pending',\n );\n\n // Notify only the role that becomes visible at the next tier\n let recipients: OpportunityActor[];\n if (senderActor.role === 'introducer') {\n recipients = opp.actors.filter((a: OpportunityActor) => a.role === 'patient' || a.role === 'party');\n } else if (senderActor.role === 'peer') {\n recipients = opp.actors.filter((a: OpportunityActor) => a.role === 'peer' && a.userId !== state.userId);\n } else {\n recipients = opp.actors.filter((a: OpportunityActor) => a.role === 'agent');\n }\n\n // queueNotification is injected via constructor; if not provided, notifications are skipped.\n const notifier: QueueOpportunityNotificationFn | undefined = this.queueNotification;\n if (notifier) {\n for (const recipient of recipients) {\n await notifier(opp.id, recipient.userId, 'high');\n }\n }\n\n const recipientIds = recipients.map((a: OpportunityActor) => a.userId);\n return {\n mutationResult: {\n success: true,\n opportunityId: opp.id,\n notified: recipientIds,\n message: 'Opportunity sent. The other person has been notified.',\n },\n };\n } catch (err) {\n logger.error('[Graph:Send] Failed', { error: err });\n return { mutationResult: { success: false, error: 'Failed to send opportunity.' } };\n }\n });\n };\n\n /**\n * Negotiate Existing Node: Load an existing opportunity by ID and run bilateral negotiation.\n * Used after introducer approval to trigger the normal negotiation flow for a latent opportunity.\n */\n const negotiateExistingNode = async (state: typeof OpportunityGraphState.State) => {\n if (!state.opportunityId) return {};\n if (!this.negotiationGraph) {\n logger.warn('[Graph:NegotiateExisting] No negotiationGraph wired; skipping', {\n opportunityId: state.opportunityId,\n });\n return {};\n }\n\n try {\n const opp = await this.database.getOpportunity(state.opportunityId as string);\n if (!opp) {\n logger.warn('[Graph:NegotiateExisting] Opportunity not found', { opportunityId: state.opportunityId });\n return {};\n }\n\n const actors = opp.actors as OpportunityActor[];\n const nonIntroducerActors = actors.filter(a => a.role !== 'introducer');\n\n // Find the sourceActor: non-introducer with role patient or party, fallback to first non-introducer\n const sourceActor = nonIntroducerActors.find(a => a.role === 'patient' || a.role === 'party')\n ?? nonIntroducerActors[0];\n if (!sourceActor) {\n logger.warn('[Graph:NegotiateExisting] No source actor found', { opportunityId: state.opportunityId });\n return {};\n }\n\n // Find the candidateActor: non-introducer that is NOT the sourceActor\n const candidateActor = nonIntroducerActors.find(a => a.userId !== sourceActor.userId);\n if (!candidateActor) {\n logger.warn('[Graph:NegotiateExisting] No candidate actor found', { opportunityId: state.opportunityId });\n return {};\n }\n\n // Load user data for both actors in parallel\n const [sourceUserAccount, sourceProfile, sourceIntents, candidateAccount, candidateProfile, candidateIntents] =\n await Promise.all([\n this.database.getUser(sourceActor.userId).catch(() => null),\n this.database.getProfile(sourceActor.userId).catch(() => null),\n this.database.getActiveIntents(sourceActor.userId).catch(() => [] as ActiveIntent[]),\n this.database.getUser(candidateActor.userId).catch(() => null),\n this.database.getProfile(candidateActor.userId).catch(() => null),\n this.database.getActiveIntents(candidateActor.userId).catch(() => [] as ActiveIntent[]),\n ]);\n\n const toNegIntent = (ai: ActiveIntent) => ({\n id: ai.id as string,\n title: ai.summary ?? '',\n description: ai.payload ?? '',\n confidence: 1,\n });\n\n const sourceUser = {\n id: sourceActor.userId,\n intents: sourceIntents.slice(0, 5).map(toNegIntent),\n profile: {\n name: sourceProfile?.identity?.name ?? sourceUserAccount?.name,\n bio: sourceProfile?.identity?.bio ?? sourceUserAccount?.intro ?? undefined,\n location: sourceProfile?.identity?.location ?? sourceUserAccount?.location ?? undefined,\n skills: sourceProfile?.attributes?.skills,\n interests: sourceProfile?.attributes?.interests,\n },\n };\n\n const candidateIntentsForNeg = candidateIntents.slice(0, 5).map(toNegIntent);\n\n const candidate: NegotiationCandidate = {\n userId: candidateActor.userId,\n opportunityId: opp.id as string,\n reasoning: (opp.interpretation as { reasoning?: string } | null)?.reasoning ?? '',\n valencyRole: candidateActor.role ?? 'peer',\n networkId: (candidateActor as { networkId?: string }).networkId as string,\n candidateUser: {\n id: candidateActor.userId,\n intents: candidateIntentsForNeg,\n profile: {\n name: candidateProfile?.identity?.name ?? candidateAccount?.name,\n bio: candidateProfile?.identity?.bio ?? candidateAccount?.intro ?? undefined,\n location: candidateProfile?.identity?.location ?? candidateAccount?.location ?? undefined,\n skills: candidateProfile?.attributes?.skills,\n interests: candidateProfile?.attributes?.interests,\n },\n },\n };\n\n // Load index context for the candidate's network\n const indexContextMap = new Map<string, string>();\n if (candidate.networkId) {\n const ctx = await this.database.getNetworkMemberContext(candidate.networkId, sourceActor.userId).catch(() => null);\n const prompt = [ctx?.indexPrompt, ctx?.memberPrompt]\n .filter((v): v is string => !!v?.trim())\n .join('\\n\\n');\n if (prompt) indexContextMap.set(candidate.networkId, prompt);\n }\n\n const acceptedResults = await negotiateCandidates(\n this.negotiationGraph, sourceUser, [candidate],\n { networkId: '', prompt: '' },\n {\n maxTurns: Number(process.env.NEGOTIATION_MAX_TURNS_AMBIENT) || 6,\n indexContextOverrides: indexContextMap,\n timeoutMs: AMBIENT_PARK_WINDOW_MS,\n trigger: 'ambient',\n },\n );\n\n // Send notifications to non-introducer actors if negotiation was accepted\n if (acceptedResults.length > 0 && this.queueNotification) {\n for (const actor of nonIntroducerActors) {\n await this.queueNotification(opp.id, actor.userId, 'high').catch((err) => {\n logger.warn('[Graph:NegotiateExisting] Failed to queue notification', { actorId: actor.userId, error: err });\n });\n }\n }\n\n logger.info('[Graph:NegotiateExisting] Negotiation complete', {\n opportunityId: opp.id,\n accepted: acceptedResults.length > 0,\n });\n } catch (err) {\n logger.error('[Graph:NegotiateExisting] Failed', { opportunityId: state.opportunityId, error: err });\n return { error: `Failed to load opportunity: ${err instanceof Error ? err.message : String(err)}` };\n }\n\n return {};\n };\n\n /**\n * Node: Approve Introduction\n * Called by the introducer to approve a latent introducer-pattern opportunity.\n * Sets approved=true on the introducer actor (status stays latent), then\n * enqueues a negotiate_existing job so the parties negotiate normally.\n */\n const approveIntroductionNode = async (state: typeof OpportunityGraphState.State) => {\n const { opportunityId, userId } = state;\n if (!opportunityId) {\n return { mutationResult: { success: false, error: 'opportunityId required for approve_introduction' } };\n }\n\n let opp;\n try {\n opp = await this.database.getOpportunity(opportunityId as string);\n } catch (err) {\n return { mutationResult: { success: false, error: `Failed to load opportunity: ${err instanceof Error ? err.message : String(err)}` } };\n }\n if (!opp) {\n return { mutationResult: { success: false, error: 'Opportunity not found' } };\n }\n\n const introducerActor = (opp.actors as OpportunityActor[])\n .find(a => a.role === 'introducer' && a.userId === userId);\n if (!introducerActor) {\n return { mutationResult: { success: false, error: 'You are not the introducer for this opportunity' } };\n }\n if (introducerActor.approved === true) {\n return { mutationResult: { success: false, error: 'Introduction already approved' } };\n }\n\n const updated = await this.database.updateOpportunityActorApproval(opportunityId as string, userId as string, true);\n if (!updated) {\n return { mutationResult: { success: false, error: 'Failed to update approval' } };\n }\n\n if (this.queueNegotiateExisting) {\n await this.queueNegotiateExisting(opportunityId as string, userId as string);\n }\n\n return { mutationResult: { success: true, opportunityId } };\n };\n\n // ═══════════════════════════════════════════════════════════════\n // CONDITIONAL ROUTING FUNCTIONS\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * Router: Decides which path based on operationMode.\n */\n const routeByMode = (state: typeof OpportunityGraphState.State): string => {\n const mode = state.operationMode ?? 'create';\n if (mode === 'read') return 'read';\n if (mode === 'update') return 'update';\n if (mode === 'delete') return 'delete_opp';\n if (mode === 'send') return 'send';\n if (mode === 'create_introduction') return 'intro_validation';\n if (mode === 'negotiate_existing') return 'negotiate_existing';\n if (mode === 'approve_introduction') return 'approve_introduction';\n // 'create' is the default discovery pipeline\n return 'prep';\n };\n\n /**\n * After prep: check if user has indexed intents.\n * Early exit if none (cannot find opportunities).\n */\n const shouldContinueAfterPrep = (state: typeof OpportunityGraphState.State): string => {\n if (state.error) {\n logger.verbose('[Graph:Routing] Error in prep - ending early');\n return END;\n }\n // Continuation mode: skip scope/resolve/discovery, go straight to evaluation\n if (state.operationMode === 'continue_discovery') {\n logger.verbose('[Graph:Routing] Continue discovery → skipping to evaluation', {\n candidatesLoaded: state.candidates.length,\n });\n return 'evaluation';\n }\n logger.verbose('[Graph:Routing] Continuing to scope');\n return 'scope';\n };\n\n /**\n * After scope: check if we have target indexes.\n */\n const shouldContinueAfterScope = (state: typeof OpportunityGraphState.State): string => {\n if (state.error || state.targetNetworks.length === 0) {\n logger.verbose('[Graph:Routing] No target indexes - ending early');\n return END;\n }\n logger.verbose('[Graph:Routing] Continuing to resolve');\n return 'resolve';\n };\n\n /**\n * After discovery: if create-intent signal was set, end so tool can return it; else continue to evaluation.\n */\n const shouldContinueAfterDiscovery = (state: typeof OpportunityGraphState.State): string => {\n if (state.createIntentSuggested) {\n logger.verbose('[Graph:Routing] Create-intent suggested - ending for tool signal');\n return END;\n }\n return 'evaluation';\n };\n\n /**\n * After intro_validation: if validation set state.error, end early; else continue to intro_evaluation.\n */\n const routeAfterIntroValidation = (state: typeof OpportunityGraphState.State): string => {\n if (state.error) {\n logger.verbose('[Graph:Routing] Intro validation error - ending early');\n return END;\n }\n return 'intro_evaluation';\n };\n\n // ═══════════════════════════════════════════════════════════════\n // GRAPH ASSEMBLY\n // ═══════════════════════════════════════════════════════════════\n\n const workflow = new StateGraph(OpportunityGraphState)\n // Add all nodes\n .addNode('prep', prepNode)\n .addNode('scope', scopeNode)\n .addNode('resolve', resolveNode)\n .addNode('discovery', discoveryNode)\n .addNode('evaluation', evaluationNode)\n .addNode('ranking', rankingNode)\n .addNode('intro_validation', introValidationNode)\n .addNode('intro_evaluation', introEvaluationNode)\n .addNode('persist', persistNode)\n // CRUD nodes\n .addNode('read', readNode)\n .addNode('update', updateNode)\n .addNode('delete_opp', deleteNode)\n .addNode('send', sendNode)\n .addNode('negotiate_existing', negotiateExistingNode)\n .addNode('approve_introduction', approveIntroductionNode)\n\n // Route by operation mode from START\n .addConditionalEdges(START, routeByMode, {\n prep: 'prep',\n intro_validation: 'intro_validation',\n read: 'read',\n update: 'update',\n delete_opp: 'delete_opp',\n send: 'send',\n negotiate_existing: 'negotiate_existing',\n approve_introduction: 'approve_introduction',\n })\n\n // Introduction path: validation -> evaluation -> persist (or END on validation error)\n .addConditionalEdges('intro_validation', routeAfterIntroValidation, {\n intro_evaluation: 'intro_evaluation',\n [END]: END,\n })\n .addEdge('intro_evaluation', 'persist')\n\n // CRUD fast paths -> END\n .addEdge('read', END)\n .addEdge('update', END)\n .addEdge('delete_opp', END)\n .addEdge('send', END)\n .addEdge('negotiate_existing', END)\n .addEdge('approve_introduction', END)\n\n // Conditional routing: early exit if no indexed intents\n .addConditionalEdges('prep', shouldContinueAfterPrep, {\n scope: 'scope',\n evaluation: 'evaluation',\n [END]: END,\n })\n\n // Conditional routing: early exit if no target indexes\n .addConditionalEdges('scope', shouldContinueAfterScope, {\n resolve: 'resolve',\n [END]: END,\n })\n .addEdge('resolve', 'discovery')\n\n .addConditionalEdges('discovery', shouldContinueAfterDiscovery, {\n evaluation: 'evaluation',\n [END]: END,\n })\n\n // Discovery → Ranking → Persist → Negotiate (post-persist).\n // Negotiation runs against persisted opportunities so each negotiation receives the\n // opportunity's id and its outcome flips status (pending|stalled|rejected) via the\n // negotiation graph's finalize node. Skipped for continue_discovery and when no\n // negotiation graph or no opportunities were persisted (negotiateNode returns early).\n .addNode('negotiate', negotiateNode)\n .addEdge('evaluation', 'ranking')\n .addEdge('ranking', 'persist')\n .addConditionalEdges('persist', (state) => {\n if (state.operationMode === 'continue_discovery') return END;\n if (!this.negotiationGraph) return END;\n if (!state.opportunities || state.opportunities.length === 0) return END;\n return 'negotiate';\n }, {\n negotiate: 'negotiate',\n [END]: END,\n })\n .addEdge('negotiate', END);\n\n return workflow.compile();\n }\n}\n"]}
1
+ {"version":3,"file":"opportunity.graph.js","sourceRoot":"/","sources":["opportunity/opportunity.graph.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Opportunity Graph: Linear Multi-Step Workflow for Opportunity Discovery\n *\n * Architecture: Follows intent graph pattern with Annotation-based state.\n * Flow: Prep → Scope → Discovery → Evaluation → Ranking → Persist → END\n *\n * Key Constraints:\n * - Opportunities only between intents sharing the same index\n * - Both intents must have hyde documents for semantic matching\n * - Non-indexed intents cannot participate in discovery\n *\n * Constructor injects Database, Embedder, and compiled HyDE graph.\n */\n\nimport { StateGraph, START, END, Annotation } from '@langchain/langgraph';\nimport type { Id } from '../shared/interfaces/database.interface.js';\nimport type { DebugMetaAgent } from '../chat/chat-streaming.types.js';\nimport { OpportunityGraphState, type IndexedIntent, type SourceProfileData, type TargetNetwork, type CandidateMatch, type EvaluatedCandidate, type EvaluatedOpportunity, type EvaluatedOpportunityActor } from './opportunity.state.js';\nimport { resolveInitialStatus } from './opportunity.state.js';\nimport { OpportunityEvaluator, type CandidateProfile, type EvaluatedOpportunityWithActors, type EvaluatorEntity, type EvaluatorInput } from './opportunity.evaluator.js';\nimport type { OpportunityGraphDatabase } from '../shared/interfaces/database.interface.js';\nimport { IntentIndexer } from '../intent/intent.indexer.js';\nimport { getModelName } from '../shared/agent/model.config.js';\nimport { validateOpportunityActors } from './opportunity.utils.js';\nimport { viewerCentricCardSummary } from './opportunity.presentation.js';\n\n/** Optional evaluator for testing (avoids LLM calls). */\nexport type OpportunityEvaluatorLike = {\n invoke?: (\n sourceProfileContext: string,\n candidates: CandidateProfile[],\n options: { minScore?: number }\n ) => Promise<Array<{\n sourceId: string;\n candidateId: string;\n score: number;\n reasoning: string;\n valencyRole: 'Agent' | 'Patient' | 'Peer';\n }>>;\n invokeEntityBundle?: (input: EvaluatorInput, options: { minScore?: number }) => Promise<Array<{\n reasoning: string;\n score: number;\n actors: Array<{ userId: string; role: 'agent' | 'patient' | 'peer'; intentId?: string | null; evidenceKey?: string | null }>;\n }>>;\n};\nimport type { Embedder, LensEmbedding } from '../shared/interfaces/embedder.interface.js';\nimport type { CreateOpportunityData, Opportunity, OpportunityActor, ActiveIntent } from '../shared/interfaces/database.interface.js';\nimport { persistOpportunities } from './opportunity.persist.js';\nimport { INTRODUCER_DISCOVERY_SOURCE } from './opportunity.introducer.js';\nimport { negotiateCandidates, type NegotiationCandidate, type OnNegotiationResolved } from \"../negotiation/negotiation.graph.js\";\nimport { AMBIENT_PARK_WINDOW_MS } from \"../negotiation/negotiation.tools.js\";\nimport { buildDiscoverySummary, toDiscoveryNegotiation, type NegotiationResolution } from \"./negotiation-summary.builder.js\";\nimport type { NegotiationGraphLike } from \"../negotiation/negotiation.state.js\";\nimport type { AgentDispatcher } from \"../shared/interfaces/agent-dispatcher.interface.js\";\nimport { protocolLogger, withCallLogging } from '../shared/observability/protocol.logger.js';\nimport { timed } from '../shared/observability/performance.js';\nimport { renderNetworkContext } from '../shared/network/metadata.renderer.js';\nimport { requestContext } from \"../shared/observability/request-context.js\";\nimport type { OpportunityEvidence } from '../shared/schemas/network-assignment.schema.js';\nimport { mergeOpportunityEvidence, withCandidateEvidence, withMatchedStrategies } from './opportunity.evidence.js';\n\nconst logger = protocolLogger('OpportunityGraph');\n\n/** Time window for persist-node dedup. Parallel jobs arrive within seconds; 10 min catches those while allowing new opportunities for long-connected pairs. */\nconst DEDUP_WINDOW_MS = 10 * 60 * 1000;\n\n/** Default cap for source premises used by premise-to-premise discovery. Prevents BACKEND-5-style fan-out. */\nconst DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT = 40;\n\n/** Per-source cap for candidate premise matches. */\nconst PREMISE_MATCH_LIMIT_PER_SOURCE = 20;\n\n/** Resolve the source premise discovery cap from env, preserving 0 as an explicit disable switch. */\nfunction getSourcePremiseDiscoveryLimit(): number {\n const raw = process.env.DISCOVERY_SOURCE_PREMISE_LIMIT;\n if (raw === undefined || raw.trim() === '') return DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : DEFAULT_SOURCE_PREMISE_DISCOVERY_LIMIT;\n}\n\nfunction buildEvaluatorEvidenceKey(candidate: CandidateMatch): string {\n return [\n candidate.candidateUserId,\n candidate.networkId,\n candidate.candidateIntentId ?? candidate.candidatePremiseId ?? candidate.sourceContextId ?? 'profile',\n ].join(':');\n}\n\n/** Input shape for the HyDE graph invoke call (query-based embedding). */\nexport interface HydeGeneratorInvokeInput {\n sourceType: 'query';\n sourceText: string;\n forceRegenerate?: boolean;\n profileContext?: string;\n}\n\n/** Optional notifier for opportunity send; when omitted, the real queue is used via dynamic import. */\nexport type QueueOpportunityNotificationFn = (\n opportunityId: string,\n recipientId: string,\n priority: 'immediate' | 'high' | 'low'\n) => Promise<unknown>;\n\n/**\n * Builds a compact text summary of the discoverer's profile and active intents\n * for use as profileContext in HyDE generation.\n * @param profile - The discoverer's profile data (identity, attributes)\n * @param intents - The discoverer's indexed intents (capped at 5)\n * @returns A context string, or undefined if no meaningful data is available\n */\nexport function buildDiscovererContext(\n profile: SourceProfileData | null | undefined,\n intents: IndexedIntent[] | undefined\n): string | undefined {\n const lines: string[] = [];\n\n if (profile) {\n const identity = profile.identity;\n const attrs = profile.attributes;\n if (identity?.name || identity?.bio) {\n lines.push(`Profile: ${[identity.name, identity.bio].filter(Boolean).join(', ')}`);\n }\n if (identity?.location) {\n lines.push(`Location: ${identity.location}`);\n }\n if (attrs?.skills?.length) {\n lines.push(`Skills: ${attrs.skills.join(', ')}`);\n }\n if (attrs?.interests?.length) {\n lines.push(`Interests: ${attrs.interests.join(', ')}`);\n }\n }\n\n if (intents?.length) {\n // indexedIntents preserves DB order from getActiveIntents (newest first),\n // so slice(0, 5) is deterministic without an explicit sort.\n const capped = intents.slice(0, 5);\n lines.push('');\n lines.push('Active intents:');\n for (const intent of capped) {\n lines.push(`- ${intent.payload}`);\n }\n }\n\n return lines.length > 0 ? lines.join('\\n') : undefined;\n}\n\n/**\n * Build a networkContexts map for the evaluator from a set of entities.\n * Fetches network data, checks permissions.contextInjection.discovery,\n * and renders context for eligible networks.\n */\nasync function buildNetworkContexts(\n entities: EvaluatorEntity[],\n database: Pick<OpportunityGraphDatabase, 'getNetwork'>,\n): Promise<Record<string, string>> {\n const networkIds = [...new Set(entities.map((e) => e.networkId))];\n const networks = await Promise.all(networkIds.map((nid) => database.getNetwork(nid).then((n) => ({ nid, n }))));\n const contexts: Record<string, string> = {};\n for (const { nid, n: network } of networks) {\n if (!network) continue;\n const perms = (network.permissions ?? {}) as Record<string, unknown>;\n const injection = perms.contextInjection as { discovery?: boolean } | undefined;\n if (injection?.discovery === false) continue;\n contexts[nid] = renderNetworkContext({\n type: network.type ?? 'community',\n title: network.title,\n prompt: network.prompt,\n metadata: network.metadata ?? {},\n });\n }\n return contexts;\n}\n\n/**\n * Factory class to build and compile the Opportunity Graph.\n * Uses dependency injection for testability.\n */\nexport class OpportunityGraphFactory {\n constructor(\n private database: OpportunityGraphDatabase,\n private embedder: Embedder,\n private hydeGenerator: {\n invoke: (input: HydeGeneratorInvokeInput) => Promise<{\n hydeEmbeddings: Record<string, number[]>;\n lenses?: Array<{ label: string; corpus: 'profiles' | 'intents' | 'premises' }>;\n hydeDocuments?: Record<string, { hydeText?: string; lens?: string }>;\n }>;\n },\n private optionalEvaluator?: OpportunityEvaluatorLike,\n private queueNotification?: QueueOpportunityNotificationFn,\n private negotiationGraph?: NegotiationGraphLike,\n /**\n * Used on the chat path to decide whether to wait for the user's personal\n * agent (long timeout) or fall back to the system agent immediately\n * (short timeout). Without it, the chat path always uses a short timeout.\n */\n private agentDispatcher?: Pick<AgentDispatcher, 'hasPersonalAgent'>,\n /**\n * Callback to enqueue a negotiate_existing job for an opportunity.\n * When provided, negotiate_existing mode uses this to queue follow-up\n * negotiations after introducer approval.\n */\n private queueNegotiateExisting?: (opportunityId: string, userId: string) => Promise<void>,\n ) {}\n\n public createGraph() {\n const evaluatorAgent = this.optionalEvaluator ?? new OpportunityEvaluator();\n\n // ═══════════════════════════════════════════════════════════════\n // NODE DEFINITIONS\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * Wraps a graph node function to emit agent_start/agent_end trace events\n * at its boundaries so the frontend TRACE panel shows real-time progress.\n * @param traceName - Kebab-case agent name (e.g. \"opportunity-prep\")\n * @param nodeFn - The original node function\n * @param summaryFn - Optional function to derive a summary string from the node result\n */\n function withNodeTrace<S, R>(\n traceName: string,\n nodeFn: (state: S) => Promise<R>,\n summaryFn?: (result: R) => string | undefined,\n ): (state: S) => Promise<R> {\n return async (state: S) => {\n const traceEmitter = requestContext.getStore()?.traceEmitter;\n const nodeStart = Date.now();\n traceEmitter?.({ type: \"agent_start\", name: traceName });\n try {\n const result = await nodeFn(state);\n const durationMs = Date.now() - nodeStart;\n const summary = summaryFn?.(result) ?? undefined;\n traceEmitter?.({ type: \"agent_end\", name: traceName, durationMs, summary });\n return result;\n } catch (err) {\n const durationMs = Date.now() - nodeStart;\n const errMsg = err instanceof Error ? err.message : String(err);\n traceEmitter?.({ type: \"agent_end\", name: traceName, durationMs, summary: `error: ${errMsg}` });\n throw err;\n }\n };\n }\n\n /**\n * Node 0: Prep\n * Fetches user's index memberships and validates requirements.\n * Returns empty if user has no index memberships (requirement).\n */\n const prepNode = withNodeTrace(\n \"opportunity-prep\",\n async (state: typeof OpportunityGraphState.State) =>\n timed(\"OpportunityGraph.prep\", async () =>\n withCallLogging(\n logger,\n '[Graph:Prep] prepNode',\n {\n userId: state.userId,\n hasSearchQuery: !!state.searchQuery,\n requestedIndexId: state.networkId ?? undefined,\n },\n async () => {\n // Use getNetworkMemberships (all memberships) for search scope — NOT getUserIndexIds\n // (which filters by autoAssign=true and is intended only for intent assignment).\n const memberships = await this.database.getNetworkMemberships(state.userId);\n const userNetworkIds = memberships.map(m => m.networkId) as Id<'networks'>[];\n if (userNetworkIds.length === 0) {\n logger.verbose('[Graph:Prep] User has no network memberships - cannot find opportunities');\n return {\n userNetworks: [] as Id<'networks'>[],\n sourceProfile: null,\n error: 'You need to join at least one network to find opportunities.',\n };\n }\n const discoveryUserId = state.onBehalfOfUserId ?? state.userId;\n const [intents, profile] = await Promise.all([\n this.database.getActiveIntents(discoveryUserId),\n this.database.getProfile(discoveryUserId),\n ]);\n const indexedIntents: IndexedIntent[] = intents.map((intent: ActiveIntent) => ({\n intentId: intent.id,\n payload: intent.payload,\n summary: intent.summary ?? undefined,\n indexes: [],\n }));\n const sourceProfile = profile\n ? {\n identity: profile.identity ?? undefined,\n narrative: profile.narrative ?? undefined,\n attributes: profile.attributes ?? undefined,\n }\n : null;\n // Source premises are loaded after scope is resolved so premise discovery\n // only uses premises assigned to the target network(s), and only up to\n // DISCOVERY_SOURCE_PREMISE_LIMIT. Loading all premises here caused\n // BACKEND-5: thousands of parallel vector searches for premise-rich users.\n const sourcePremises: Array<{ premiseId: Id<'premises'>; embedding: number[] }> = [];\n const contextToIntentEnabled = process.env.DISCOVERY_CONTEXT_TO_INTENT !== '0';\n const rawContexts = contextToIntentEnabled && typeof this.database.getUserContexts === 'function'\n ? await this.database.getUserContexts(discoveryUserId)\n : [];\n const sourceContexts = rawContexts\n .filter((c: { id: string; networkId: string; embedding: number[] | null }) => c.embedding && c.embedding.length > 0 && userNetworkIds.includes(c.networkId as Id<'networks'>))\n .map((c: { id: string; networkId: string; embedding: number[] | null }) => ({\n contextId: c.id,\n networkId: c.networkId as Id<'networks'>,\n embedding: c.embedding!,\n }));\n return {\n userNetworks: userNetworkIds,\n indexedIntents,\n sourceProfile,\n sourcePremises,\n sourceContexts,\n trace: [{\n node: \"prep\",\n detail: `${userNetworkIds.length} network(s), ${intents.length} intent(s), premise discovery deferred, ${sourceContexts.length} context(s), ${profile ? 'profile loaded' : 'no profile'}`,\n }],\n };\n },\n { context: { userId: state.userId }, logOutput: true }\n ).catch((error) => {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Prep] Failed', { error });\n return {\n error: 'Failed to prepare opportunity search. Please try again.',\n trace: [{\n node: \"prep_fatal\",\n detail: `Prep failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n })\n ),\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const indexes = r?.userNetworks as unknown[];\n const intents = r?.indexedIntents as unknown[];\n return indexes && intents ? `${indexes.length} index(es), ${intents.length} intent(s)` : undefined;\n },\n );\n\n /**\n * Node 1: Scope\n * Determines which indexes to search within.\n * If networkId provided: searches only that index.\n * Otherwise: searches all user's indexes.\n */\n const scopeNode = withNodeTrace(\n \"opportunity-scope\",\n async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.scope\", async () => {\n logger.verbose('[Graph:Scope] Determining search scope', {\n requestedIndexId: state.networkId,\n userNetworksCount: state.userNetworks.length,\n });\n\n try {\n let targetIndexIds: Id<'networks'>[];\n\n if (state.networkId) {\n // Validate user is member or owner of requested network\n const isInScope = state.userNetworks.includes(state.networkId);\n const isOwner = !isInScope && await this.database.isIndexOwner(state.networkId, state.userId);\n if (!isInScope && !isOwner) {\n logger.warn('[Graph:Scope] User not member of requested network', {\n networkId: state.networkId,\n });\n return {\n targetNetworks: [],\n error: 'You are not a member of that network.',\n };\n }\n targetIndexIds = [state.networkId];\n } else if (state.indexScope && state.indexScope.length > 0) {\n // Bounded scope (e.g. a network-scoped agent's reachable indexes):\n // intersect with the user's actual memberships so discovery never\n // reaches networks outside the agent's bound scope.\n const allowed = new Set(state.indexScope);\n targetIndexIds = state.userNetworks.filter((n) => allowed.has(n));\n logger.verbose('[Graph:Scope] Applied indexScope intersection', {\n indexScopeCount: state.indexScope.length,\n userNetworksCount: state.userNetworks.length,\n targetCount: targetIndexIds.length,\n });\n } else {\n // Search all user's indexes\n targetIndexIds = state.userNetworks;\n }\n\n // Fetch index details\n const targetNetworks: TargetNetwork[] = await Promise.all(\n targetIndexIds.map(async (networkId) => {\n const index = await this.database.getNetwork(networkId);\n const memberCount = await this.database.getNetworkMemberCount(networkId);\n return {\n networkId,\n title: index?.title ?? 'Unknown',\n memberCount,\n };\n })\n );\n\n logger.verbose('[Graph:Scope] Scope determined', {\n targetIndexesCount: targetNetworks.length,\n indexes: targetNetworks.map(i => i.title),\n });\n\n // ── Populate index relevancy scores for dedup tie-breaking ──\n const indexRelevancyScores: Record<string, number> = {};\n\n if (state.triggerIntentId) {\n // Background path: look up persisted scores from intent_indexes\n try {\n const scores = await this.database.getIntentIndexScores(state.triggerIntentId);\n for (const { networkId, relevancyScore } of scores) {\n if (relevancyScore != null) {\n indexRelevancyScores[networkId] = relevancyScore;\n }\n }\n } catch (err) {\n logger.warn('[Graph:Scope] Failed to load intent index scores', { triggerIntentId: state.triggerIntentId, error: err });\n }\n } else if (state.searchQuery?.trim()) {\n // Chat path: score query against target indexes in parallel\n try {\n const indexer = new IntentIndexer();\n const scopeAgentTimings: DebugMetaAgent[] = [];\n const scorableIndexes = targetNetworks.filter(ti => ti.title !== 'Unknown');\n const scoringPromises = scorableIndexes.map(async (ti) => {\n const ctx = await this.database.getNetworkMemberContext(ti.networkId, state.userId);\n if (!ctx?.indexPrompt?.trim() && !ctx?.memberPrompt?.trim()) {\n return { networkId: ti.networkId, score: 1.0 };\n }\n const _indexerStart = Date.now();\n const traceEmitter = requestContext.getStore()?.traceEmitter;\n traceEmitter?.({ type: \"agent_start\", name: \"intent-indexer\" });\n let result: Awaited<ReturnType<typeof indexer.invoke>> | null = null;\n try {\n result = await indexer.invoke(\n state.searchQuery!,\n ctx?.indexPrompt ?? null,\n ctx?.memberPrompt ?? null,\n );\n } catch {\n return { networkId: ti.networkId, score: 1.0 };\n } finally {\n const _indexerDuration = Date.now() - _indexerStart;\n traceEmitter?.({ type: \"agent_end\", name: \"intent-indexer\", durationMs: _indexerDuration, summary: `Scored index ${ti.networkId}` });\n scopeAgentTimings.push({ name: 'intent.indexer', durationMs: _indexerDuration });\n }\n if (!result) return { networkId: ti.networkId, score: 1.0 };\n const score = ctx?.indexPrompt && ctx?.memberPrompt\n ? result.indexScore * 0.6 + result.memberScore * 0.4\n : ctx?.indexPrompt ? result.indexScore : result.memberScore;\n return { networkId: ti.networkId, score };\n });\n const results = await Promise.all(scoringPromises);\n for (const { networkId, score } of results) {\n indexRelevancyScores[networkId] = score;\n }\n // Accumulate indexer timings into graph state\n if (scopeAgentTimings.length > 0) {\n return {\n targetNetworks,\n indexRelevancyScores,\n agentTimings: scopeAgentTimings,\n trace: [{\n node: \"scope\",\n detail: `Searching ${targetNetworks.length} index(es): ${targetNetworks.map(i => `${i.title} (${i.memberCount})`).join(', ')}`,\n data: { totalMembers: targetNetworks.reduce((sum, i) => sum + i.memberCount, 0) },\n }],\n };\n }\n } catch (err) {\n logger.warn('[Graph:Scope] Failed to score query against indexes', { error: err });\n }\n }\n\n const totalMembers = targetNetworks.reduce((sum, i) => sum + i.memberCount, 0);\n return {\n targetNetworks,\n indexRelevancyScores,\n trace: [{\n node: \"scope\",\n detail: `Searching ${targetNetworks.length} index(es): ${targetNetworks.map(i => `${i.title} (${i.memberCount})`).join(', ')}`,\n data: { totalMembers },\n }],\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Scope] Failed', { error });\n return {\n targetNetworks: [],\n error: 'Failed to determine search scope.',\n trace: [{\n node: \"scope_fatal\",\n detail: `Scope failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const indexes = r?.targetNetworks as unknown[];\n return indexes ? `${indexes.length} index(es) in scope` : undefined;\n },\n );\n\n /**\n * Node 2: Resolve\n * Resolves trigger intent from triggerIntentId or searchQuery vs indexedIntents;\n * sets discoverySource, resolvedTriggerIntentId, resolvedIntentInIndex for routing (path A/B/C).\n */\n const resolveNode = withNodeTrace(\n \"opportunity-resolve\",\n async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.resolve\", async () => {\n logger.verbose('[Graph:Resolve] Resolving intent and index membership', {\n triggerIntentId: state.triggerIntentId,\n hasSearchQuery: !!state.searchQuery,\n indexedIntentsCount: state.indexedIntents.length,\n });\n\n const targetIndexIds = state.targetNetworks.map((t) => t.networkId);\n\n try {\n let resolvedIntentId: Id<'intents'> | undefined;\n if (state.triggerIntentId) {\n const inNetwork = await this.database.getNetworkIdsForIntent(state.triggerIntentId);\n const inTarget = inNetwork.some((id) => targetIndexIds.includes(id as Id<'networks'>));\n resolvedIntentId = state.triggerIntentId;\n const resolvedIntentInIndex = inTarget;\n const discoverySource = resolvedIntentInIndex ? ('intent' as const) : ('profile' as const);\n return {\n resolvedTriggerIntentId: resolvedIntentId,\n resolvedIntentInIndex,\n discoverySource,\n };\n }\n\n if (state.searchQuery?.trim() && state.indexedIntents.length > 0) {\n const q = state.searchQuery.trim().toLowerCase();\n const matched = state.indexedIntents.find((i) => i.payload?.toLowerCase().includes(q));\n if (matched) {\n resolvedIntentId = matched.intentId;\n const inNetwork = await this.database.getNetworkIdsForIntent(matched.intentId);\n const resolvedIntentInIndex = inNetwork.some((id) => targetIndexIds.includes(id as Id<'networks'>));\n const discoverySource = resolvedIntentInIndex ? ('intent' as const) : ('profile' as const);\n return {\n resolvedTriggerIntentId: resolvedIntentId,\n resolvedIntentInIndex,\n discoverySource,\n };\n }\n logger.warn('[Graph:Resolve] No intent matched search query; leaving resolvedIntentId unset', {\n searchQuery: state.searchQuery,\n indexedIntentsCount: state.indexedIntents.length,\n });\n }\n\n return {\n resolvedTriggerIntentId: undefined,\n resolvedIntentInIndex: false,\n discoverySource: 'profile' as const,\n };\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n logger.error('[Graph:Resolve] Failed', {\n triggerIntentId: state.triggerIntentId,\n searchQuery: state.searchQuery,\n error: err,\n });\n return {\n resolvedTriggerIntentId: undefined,\n resolvedIntentInIndex: false,\n discoverySource: 'profile' as const,\n error: errMsg || 'Resolve failed',\n trace: [{\n node: \"resolve_fatal\",\n detail: `Resolve failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n return r?.discoverySource ? `source: ${r.discoverySource}` : undefined;\n },\n );\n\n /**\n * Node 3: Discovery\n * Generates HyDE embeddings and performs semantic search.\n */\n const discoveryNode = withNodeTrace(\n \"opportunity-discovery\",\n async (state: typeof OpportunityGraphState.State) => {\n const self = this;\n return timed(\"OpportunityGraph.discovery\", async () => {\n const startTime = Date.now();\n const discoveryUserId = state.onBehalfOfUserId ?? state.userId;\n\n /** Filter candidates to targetUserId when set (direct-connection mode). */\n const filterByTarget = (candidates: CandidateMatch[]): CandidateMatch[] => {\n if (!state.targetUserId) return candidates;\n const filtered = candidates.filter(c => c.candidateUserId === state.targetUserId);\n logger.verbose('[Graph:Discovery] targetUserId filter applied', {\n targetUserId: state.targetUserId,\n before: candidates.length,\n after: filtered.length,\n });\n return filtered;\n };\n\n // Shared variable to capture lens input data from runQueryHydeDiscovery or intent path\n let discoveryLensInput: { profileContext: string | undefined; model: string } | undefined;\n // Shared variable to capture HyDE output (lenses + documents) for trace entries\n let discoveryHydeOutput: { lenses: Array<{ label: string; corpus: string }>; hydeDocuments: Record<string, { hydeText?: string }> } | undefined;\n\n logger.verbose('[Graph:Discovery] Starting semantic search', {\n targetIndexesCount: state.targetNetworks.length,\n discoverySource: state.discoverySource,\n searchQueryPreview: state.searchQuery?.trim().slice(0, 60) ?? '(none)',\n });\n\n try {\n if (state.targetNetworks.length === 0) {\n logger.warn('[Graph:Discovery] No target indexes for search');\n return { candidates: [] };\n }\n\n // ── Direct-connection fast path ──\n // When targetUserId is set (user @-mentioned someone), bypass vector search\n // and construct candidates directly from shared indexes.\n if (state.targetUserId) {\n if (state.targetUserId === discoveryUserId) {\n logger.warn('[Graph:Discovery] Direct-connection target matches discoverer; skipping self-match', {\n targetUserId: state.targetUserId,\n });\n return {\n candidates: [],\n trace: [{\n node: \"discovery\",\n detail: \"Direct connection skipped: target user is discoverer\",\n data: { targetUserId: state.targetUserId },\n }],\n };\n }\n logger.verbose('[Graph:Discovery] Direct-connection mode — bypassing vector search', {\n targetUserId: state.targetUserId,\n });\n const targetMemberships = await this.database.getNetworkMemberships(state.targetUserId);\n const targetUserIndexIds = targetMemberships.map(m => m.networkId);\n const sharedIndexIds = state.targetNetworks\n .filter(ti => targetUserIndexIds.includes(ti.networkId))\n .map(ti => ti.networkId);\n\n if (sharedIndexIds.length === 0) {\n logger.warn('[Graph:Discovery] Target user shares no indexes with discoverer', {\n targetUserId: state.targetUserId,\n discovererIndexes: state.targetNetworks.map(ti => ti.networkId),\n });\n return {\n candidates: [],\n trace: [{\n node: \"discovery\",\n detail: `Direct connection: target user shares no indexes`,\n data: { targetUserId: state.targetUserId },\n }],\n };\n }\n\n // Fetch target user's active intents to build intent-level candidates\n const targetIntents = await this.database.getActiveIntents(state.targetUserId);\n const directCandidates: CandidateMatch[] = [];\n\n if (targetIntents.length > 0) {\n // Build one candidate per intent per shared index it belongs to\n for (const intent of targetIntents) {\n const intentNetworkIds = await this.database.getNetworkIdsForIntent(intent.id);\n const overlapping = sharedIndexIds.filter(id => intentNetworkIds.includes(id));\n for (const networkId of overlapping) {\n directCandidates.push(withCandidateEvidence({\n candidateUserId: state.targetUserId,\n candidateIntentId: intent.id as Id<'intents'>,\n networkId,\n similarity: 1.0,\n lens: 'explicit_mention',\n candidatePayload: intent.payload,\n candidateSummary: intent.summary ?? undefined,\n discoverySource: 'query',\n }));\n }\n }\n }\n\n // Always add a profile-level candidate (so evaluation runs even without intents)\n if (directCandidates.length === 0) {\n directCandidates.push(withCandidateEvidence({\n candidateUserId: state.targetUserId,\n networkId: sharedIndexIds[0] as Id<'networks'>,\n similarity: 1.0,\n lens: 'explicit_mention',\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query',\n }));\n }\n\n logger.verbose('[Graph:Discovery] Direct candidates constructed', {\n count: directCandidates.length,\n sharedIndexes: sharedIndexIds.length,\n targetIntents: targetIntents.length,\n });\n\n return {\n candidates: directCandidates,\n trace: [{\n node: \"discovery\",\n detail: `Direct connection → ${directCandidates.length} candidate(s) from ${sharedIndexIds.length} shared index(es)`,\n data: {\n targetUserId: state.targetUserId,\n candidateCount: directCandidates.length,\n sharedIndexes: sharedIndexIds.length,\n durationMs: Date.now() - startTime,\n },\n }],\n };\n }\n\n // Search limits - fixed values for candidate retrieval\n // (The options.limit controls final output, not search pool)\n const limitPerStrategy = 30;\n const perIndexLimit = 80;\n // Similarity threshold for recall (0.30 = 30% similarity)\n const minScore = 0.3;\n\n if (state.discoverySource === 'profile') {\n // Profile-context discovery: HyDE (when search query exists) + premise-to-premise.\n if (state.searchQuery?.trim()) {\n logger.verbose('[Graph:Discovery] Profile source with searchQuery → running query HyDE + premise paths', {\n searchQuery: state.searchQuery.trim().substring(0, 80),\n });\n const queryCandidates = await runQueryHydeDiscovery();\n logger.verbose('[Graph:Discovery] Query HyDE path complete', { candidatesFound: queryCandidates.length });\n\n // Build trace entries for this path\n const traceEntries: Array<{ node: string; detail?: string; data?: Record<string, unknown> }> = [];\n\n // Lens input trace (captured from runQueryHydeDiscovery)\n if (discoveryLensInput) {\n traceEntries.push({\n node: \"lens_input\",\n detail: \"Profile context for lens inference\",\n data: discoveryLensInput,\n });\n }\n\n // Lens output and HyDE document traces (captured from runQueryHydeDiscovery)\n if (discoveryHydeOutput) {\n if (discoveryHydeOutput.lenses.length > 0) {\n traceEntries.push({\n node: \"lens_output\",\n detail: `Inferred ${discoveryHydeOutput.lenses.length} lens(es): ${discoveryHydeOutput.lenses.map(l => l.label).join(', ')}`,\n data: { lenses: discoveryHydeOutput.lenses, model: getModelName(\"lensInferrer\") },\n });\n }\n for (const [lens, doc] of Object.entries(discoveryHydeOutput.hydeDocuments)) {\n if (doc?.hydeText) {\n traceEntries.push({\n node: \"hyde_query\",\n detail: `[${lens}] \"${doc.hydeText.slice(0, 120)}${doc.hydeText.length > 120 ? '...' : ''}\"`,\n data: { lens, hydeTextPreview: doc.hydeText.slice(0, 300) + (doc.hydeText.length > 300 ? '...' : '') },\n });\n }\n }\n }\n\n // Compute per-lens stats from deduped candidates\n const lensStats: Record<string, { count: number; avgSimilarity: number }> = {};\n for (const c of queryCandidates) {\n const s = c.lens || 'unknown';\n if (!lensStats[s]) lensStats[s] = { count: 0, avgSimilarity: 0 };\n lensStats[s].count++;\n lensStats[s].avgSimilarity += c.similarity;\n }\n for (const s of Object.values(lensStats)) {\n s.avgSimilarity = s.count > 0 ? Math.round((s.avgSimilarity / s.count) * 1000) / 1000 : 0;\n }\n\n traceEntries.push({\n node: \"discovery\",\n detail: `HyDE search → ${queryCandidates.length} candidate(s) from query path`,\n data: {\n candidateCount: queryCandidates.length,\n byLens: lensStats,\n searchQuery: state.searchQuery?.trim().slice(0, 80),\n durationMs: Date.now() - startTime,\n model: getModelName(\"hydeGenerator\"),\n },\n });\n\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n const withPremisesAndContext = mergeStrategyCandidates(queryCandidates, premiseCands, contextCands);\n if (premiseCands.length > 0) {\n traceEntries.push({ node: \"strategy\", detail: `premise-to-premise → ${premiseCands.length} candidate(s)` });\n }\n if (contextCands.length > 0) {\n traceEntries.push({ node: \"strategy\", detail: `context-to-intent → ${contextCands.length} candidate(s)` });\n }\n return { candidates: filterByTarget(withPremisesAndContext), trace: traceEntries };\n }\n\n // No search query — premise-to-premise + context-to-intent discovery\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n if (premiseCands.length > 0 || contextCands.length > 0) {\n const merged = mergeStrategyCandidates(premiseCands, contextCands);\n const traceEntries: Array<{ node: string; detail?: string; data?: Record<string, unknown> }> = [];\n if (premiseCands.length > 0) {\n traceEntries.push({ node: \"strategy\", detail: `premise-to-premise → ${premiseCands.length} candidate(s)` });\n }\n if (contextCands.length > 0) {\n traceEntries.push({ node: \"strategy\", detail: `context-to-intent → ${contextCands.length} candidate(s)` });\n }\n traceEntries.push({\n node: \"discovery\",\n detail: `${[premiseCands.length > 0 && 'premise-to-premise', contextCands.length > 0 && 'context-to-intent'].filter(Boolean).length} strategies → ${premiseCands.length + contextCands.length} raw, ${merged.length} after dedup`,\n });\n return { candidates: filterByTarget(merged), trace: traceEntries };\n }\n return { candidates: [] };\n }\n\n async function runQueryHydeDiscovery(): Promise<CandidateMatch[]> {\n const searchText = state.searchQuery?.trim() ?? '';\n if (!searchText) return [];\n logger.verbose('[Graph:Discovery] runQueryHydeDiscovery start', { searchText: searchText.slice(0, 80) });\n const discovererContext = buildDiscovererContext(state.sourceProfile, state.indexedIntents);\n discoveryLensInput = {\n profileContext: discovererContext,\n model: getModelName(\"lensInferrer\"),\n };\n const hydeResult = await self.hydeGenerator.invoke({\n sourceType: 'query',\n sourceText: searchText,\n forceRegenerate: false,\n profileContext: discovererContext,\n });\n const hydeEmbeddings = hydeResult.hydeEmbeddings as Record<string, number[]>;\n const lenses = hydeResult.lenses ?? [];\n discoveryHydeOutput = {\n lenses: lenses as Array<{ label: string; corpus: string }>,\n hydeDocuments: (hydeResult.hydeDocuments ?? {}) as Record<string, { hydeText?: string }>,\n };\n const embeddingKeys = hydeEmbeddings ? Object.keys(hydeEmbeddings) : [];\n logger.verbose('[Graph:Discovery] HyDE generator result', {\n lensCount: embeddingKeys.length,\n lenses: embeddingKeys,\n });\n if (!hydeEmbeddings || Object.keys(hydeEmbeddings).length === 0) return [];\n const lensMap = new Map(lenses.map(l => [l.label, l]));\n const lensEmbeddings: LensEmbedding[] = [];\n for (const [label, emb] of Object.entries(hydeEmbeddings)) {\n if (emb?.length) {\n const lens = lensMap.get(label);\n lensEmbeddings.push({ lens: label, corpus: lens?.corpus ?? 'profiles', embedding: emb });\n }\n }\n const all: CandidateMatch[] = [];\n await Promise.all(\n state.targetNetworks.map(async (targetIndex) => {\n const results = await self.embedder.searchWithHydeEmbeddings(lensEmbeddings, {\n indexScope: [targetIndex.networkId],\n excludeUserId: discoveryUserId,\n limitPerStrategy,\n limit: perIndexLimit,\n minScore,\n });\n for (const r of results.filter((x) => x.type === 'intent')) {\n all.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n candidateIntentId: r.id as Id<'intents'>,\n networkId: targetIndex.networkId,\n similarity: r.score,\n lens: r.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query' as const,\n }));\n }\n for (const r of results.filter((x) => x.type === 'premise')) {\n all.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n candidatePremiseId: r.id as Id<'premises'>,\n networkId: targetIndex.networkId,\n similarity: r.score,\n lens: r.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query' as const,\n }));\n }\n })\n );\n const intentCount = all.filter((c) => c.candidateIntentId).length;\n const premiseCount = all.filter((c) => c.candidatePremiseId).length;\n logger.verbose('[Graph:Discovery] searchWithHydeEmbeddings raw results', {\n total: all.length,\n fromIntent: intentCount,\n fromPremise: premiseCount,\n });\n const byKey = new Map<string, CandidateMatch>();\n for (const c of all) {\n // Dedup by candidateUserId + entity (intent or premise), NOT by indexId.\n // Including indexId caused the same user to appear once per index they belong to.\n const entityKey = c.candidateIntentId ? `intent:${c.candidateIntentId}` : `premise:${c.candidatePremiseId}`;\n const key = `${c.candidateUserId}:${entityKey}`;\n if (!byKey.has(key) || c.similarity > (byKey.get(key)?.similarity ?? 0)) {\n byKey.set(key, c);\n }\n }\n return Array.from(byKey.values());\n }\n\n /**\n * Premise-to-premise discovery (path D).\n * Searches for other users' premises similar to the discoverer's premises,\n * scoped to target networks. Additive — merges into existing candidates.\n */\n async function runPremiseDiscovery(): Promise<CandidateMatch[]> {\n const targetNetworkIds = state.targetNetworks.map(t => t.networkId);\n if (targetNetworkIds.length === 0) return [];\n\n const sourceLimit = getSourcePremiseDiscoveryLimit();\n if (sourceLimit === 0) {\n logger.verbose('[Graph:Discovery] runPremiseDiscovery disabled by DISCOVERY_SOURCE_PREMISE_LIMIT=0');\n return [];\n }\n\n const sourcePremisesFromDb = self.database.getPremisesForUserInNetworks\n ? await self.database.getPremisesForUserInNetworks(discoveryUserId, targetNetworkIds, 'ACTIVE', sourceLimit)\n : await self.database.getPremisesForUser(discoveryUserId, 'ACTIVE');\n const sourcePremises = (sourcePremisesFromDb.length > 0\n ? sourcePremisesFromDb\n .filter(p => Array.isArray(p.embedding) && p.embedding.length > 0)\n .slice(0, sourceLimit)\n .map(p => ({ premiseId: p.id as Id<'premises'>, embedding: p.embedding! }))\n : (state.sourcePremises ?? []).slice(0, sourceLimit)\n );\n\n if (sourcePremises.length === 0) return [];\n\n logger.verbose('[Graph:Discovery] runPremiseDiscovery start', {\n premiseCount: sourcePremises.length,\n sourceLimit,\n targetNetworks: targetNetworkIds.length,\n batched: !!self.database.searchPremisesBySimilarityBatch,\n });\n\n const rawResults = self.database.searchPremisesBySimilarityBatch\n ? await self.database.searchPremisesBySimilarityBatch({\n sources: sourcePremises,\n networkIds: targetNetworkIds,\n excludeUserId: discoveryUserId,\n limitPerSource: PREMISE_MATCH_LIMIT_PER_SOURCE,\n })\n : (await Promise.all(\n sourcePremises.map(async (sp) => {\n const results = await self.database.searchPremisesBySimilarity({\n embedding: sp.embedding,\n networkIds: targetNetworkIds,\n excludeUserId: discoveryUserId,\n limit: PREMISE_MATCH_LIMIT_PER_SOURCE,\n });\n return results.map((r) => ({ ...r, sourcePremiseId: sp.premiseId }));\n })\n )).flat();\n\n const premiseCandidates: CandidateMatch[] = [];\n for (const r of rawResults) {\n premiseCandidates.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n sourcePremiseId: r.sourcePremiseId as Id<'premises'> | undefined,\n candidatePremiseId: r.premiseId as Id<'premises'>,\n networkId: r.networkId as Id<'networks'>,\n similarity: typeof r.similarity === 'number' ? r.similarity : parseFloat(String(r.similarity)),\n lens: 'premise_match',\n candidatePayload: r.assertionText ?? '',\n discoverySource: 'premise-similarity',\n }));\n }\n\n // Dedup by userId + premiseId + networkId (a premise can appear in multiple networks)\n const byKey = new Map<string, CandidateMatch>();\n for (const c of premiseCandidates) {\n const key = `${c.candidateUserId}:${c.candidatePremiseId ?? 'none'}:${c.networkId}`;\n if (!byKey.has(key) || c.similarity > (byKey.get(key)?.similarity ?? 0)) {\n byKey.set(key, c);\n }\n }\n const deduped = Array.from(byKey.values());\n logger.verbose('[Graph:Discovery] runPremiseDiscovery complete', {\n sourcePremiseCount: sourcePremises.length,\n rawCount: premiseCandidates.length,\n dedupedCount: deduped.length,\n });\n return deduped;\n }\n\n /**\n * Context-to-intent discovery: searches intents using context HyDE embeddings.\n * When HyDE documents exist for a context, uses optimised hypothetical-document\n * embeddings via searchWithHydeEmbeddings. Falls back to raw context embedding\n * via searchIntentsByContextEmbedding when no HyDE docs are available.\n */\n async function runContextToIntentDiscovery(): Promise<CandidateMatch[]> {\n if (!state.sourceContexts?.length) return [];\n const contextToIntentEnabled = process.env.DISCOVERY_CONTEXT_TO_INTENT !== '0';\n if (!contextToIntentEnabled) return [];\n\n const targetNetworkIds = state.targetNetworks.map(t => t.networkId);\n if (targetNetworkIds.length === 0) return [];\n\n logger.verbose('[Graph:Discovery] runContextToIntentDiscovery start', {\n contextCount: state.sourceContexts.length,\n targetNetworks: targetNetworkIds.length,\n });\n\n const contextCandidates: CandidateMatch[] = [];\n\n for (const ctx of state.sourceContexts.filter(c => targetNetworkIds.includes(c.networkId))) {\n // Attempt HyDE-enhanced search first\n const hydeDocs = await self.database.getHydeDocumentsForSource('context', ctx.contextId);\n const lensEmbeddings: LensEmbedding[] = hydeDocs\n .filter(d => d.hydeEmbedding?.length > 0)\n .map(d => ({\n lens: d.strategy,\n corpus: (d.targetCorpus === 'intents' ? 'intents' : d.targetCorpus === 'premises' ? 'premises' : 'intents') as 'intents' | 'premises' | 'profiles',\n embedding: d.hydeEmbedding,\n }));\n\n if (lensEmbeddings.length > 0) {\n // HyDE-enhanced search: same path as query HyDE, scoped to this context's network\n const results = await self.embedder.searchWithHydeEmbeddings(lensEmbeddings, {\n indexScope: [ctx.networkId],\n excludeUserId: discoveryUserId,\n limitPerStrategy: limitPerStrategy,\n limit: 20,\n minScore,\n });\n for (const r of results.filter(r => r.type === 'intent')) {\n contextCandidates.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n candidateIntentId: r.id as Id<'intents'>,\n sourceContextId: ctx.contextId,\n networkId: ctx.networkId,\n similarity: r.score,\n lens: r.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'context-to-intent',\n }));\n }\n } else {\n // Fallback: raw context embedding search (no HyDE docs yet)\n const results = await self.database.searchIntentsByContextEmbedding({\n embedding: ctx.embedding,\n networkIds: [ctx.networkId],\n excludeUserId: discoveryUserId,\n limit: 20,\n minScore: minScore,\n });\n for (const r of results) {\n contextCandidates.push(withCandidateEvidence({\n candidateUserId: r.userId as Id<'users'>,\n candidateIntentId: r.intentId as Id<'intents'>,\n sourceContextId: ctx.contextId,\n networkId: r.networkId as Id<'networks'>,\n similarity: typeof r.similarity === 'number' ? r.similarity : parseFloat(String(r.similarity)),\n lens: 'context_match',\n candidatePayload: r.payload ?? '',\n candidateSummary: r.summary ?? undefined,\n discoverySource: 'context-to-intent',\n }));\n }\n }\n }\n\n const byKey = new Map<string, CandidateMatch>();\n for (const c of contextCandidates) {\n const key = `${c.candidateUserId}:${c.candidateIntentId ?? 'none'}:${c.networkId}`;\n if (!byKey.has(key) || c.similarity > (byKey.get(key)?.similarity ?? 0)) {\n byKey.set(key, c);\n }\n }\n const deduped = Array.from(byKey.values());\n logger.verbose('[Graph:Discovery] runContextToIntentDiscovery complete', {\n rawCount: contextCandidates.length,\n dedupedCount: deduped.length,\n });\n return deduped;\n }\n\n /**\n * Merge candidates from multiple strategies. Deduplicates by userId + networkId + entityId,\n * keeps the highest similarity, tracks which strategies found each candidate,\n * and applies a multi-strategy boost (+0.05 per additional strategy, boost capped at 0.15,\n * final similarity capped at 1.0).\n */\n function mergeStrategyCandidates(...groups: CandidateMatch[][]): CandidateMatch[] {\n const merged = new Map<string, CandidateMatch & { _strategies: Set<string> }>();\n for (const group of groups) {\n for (const c of group) {\n const entityId = c.candidateIntentId ?? c.candidatePremiseId ?? 'none';\n const key = `${c.candidateUserId}:${c.networkId}:${entityId}`;\n const existing = merged.get(key);\n if (!existing) {\n merged.set(key, { ...c, _strategies: new Set([c.discoverySource ?? 'unknown']) });\n } else {\n existing._strategies.add(c.discoverySource ?? 'unknown');\n const mergedEvidence = mergeOpportunityEvidence(existing.evidence, c.evidence);\n if (c.similarity > existing.similarity) {\n Object.assign(existing, { ...c, evidence: mergedEvidence });\n } else {\n existing.evidence = mergedEvidence;\n }\n }\n }\n }\n return Array.from(merged.values()).map(({ _strategies, ...c }) => {\n const matchedStrategies = Array.from(_strategies);\n const boost = Math.min((_strategies.size - 1) * 0.05, 0.15);\n return {\n ...c,\n similarity: Math.min(c.similarity + boost, 1.0),\n matchedStrategies,\n evidence: withMatchedStrategies(mergeOpportunityEvidence(c.evidence), matchedStrategies),\n };\n });\n }\n\n const resolvedIntent = state.resolvedTriggerIntentId\n ? state.indexedIntents.find((i) => i.intentId === state.resolvedTriggerIntentId)\n : state.indexedIntents[0];\n const searchText = state.searchQuery ?? resolvedIntent?.payload ?? '';\n if (!searchText) {\n logger.warn('[Graph:Discovery] No search text available for intent path');\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n const merged = mergeStrategyCandidates(premiseCands, contextCands);\n if (merged.length > 0) {\n return {\n candidates: filterByTarget(merged),\n trace: [{ node: \"discovery\", detail: `No search text; premise → ${premiseCands.length}, context → ${contextCands.length}, merged → ${merged.length} candidate(s)` }],\n };\n }\n return { candidates: [] };\n }\n\n const discovererContext = buildDiscovererContext(state.sourceProfile, state.indexedIntents);\n discoveryLensInput = {\n profileContext: discovererContext,\n model: getModelName(\"lensInferrer\"),\n };\n const hydeResult = await this.hydeGenerator.invoke({\n sourceType: 'query',\n sourceText: searchText,\n forceRegenerate: false,\n profileContext: discovererContext,\n });\n const hydeEmbeddings = hydeResult.hydeEmbeddings as Record<string, number[]>;\n const lenses = hydeResult.lenses ?? [];\n if (!hydeEmbeddings || Object.keys(hydeEmbeddings).length === 0) {\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n const merged = mergeStrategyCandidates(premiseCands, contextCands);\n if (merged.length > 0) {\n return {\n hydeEmbeddings: {} as Record<string, number[]>,\n candidates: filterByTarget(merged),\n trace: [{ node: \"discovery\", detail: `No HyDE embeddings; premise → ${premiseCands.length}, context → ${contextCands.length}, merged → ${merged.length} candidate(s)` }],\n };\n }\n return { hydeEmbeddings: {} as Record<string, number[]>, candidates: [] };\n }\n const lensMap = new Map(lenses.map(l => [l.label, l]));\n const lensEmbeddings: LensEmbedding[] = [];\n for (const [label, emb] of Object.entries(hydeEmbeddings)) {\n if (emb?.length) {\n const lens = lensMap.get(label);\n lensEmbeddings.push({ lens: label, corpus: lens?.corpus ?? 'profiles', embedding: emb });\n }\n }\n const allCandidates: CandidateMatch[] = [];\n await Promise.all(\n state.targetNetworks.map(async (targetIndex) => {\n const results = await this.embedder.searchWithHydeEmbeddings(lensEmbeddings, {\n indexScope: [targetIndex.networkId],\n excludeUserId: discoveryUserId,\n limitPerStrategy,\n limit: perIndexLimit,\n minScore,\n });\n for (const result of results.filter((r) => r.type === 'intent')) {\n allCandidates.push(withCandidateEvidence({\n candidateUserId: result.userId as Id<'users'>,\n candidateIntentId: result.id as Id<'intents'>,\n networkId: targetIndex.networkId,\n similarity: result.score,\n lens: result.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query' as const,\n }));\n }\n for (const result of results.filter((r) => r.type === 'premise')) {\n allCandidates.push(withCandidateEvidence({\n candidateUserId: result.userId as Id<'users'>,\n candidatePremiseId: result.id as Id<'premises'>,\n networkId: targetIndex.networkId,\n similarity: result.score,\n lens: result.matchedVia,\n candidatePayload: '',\n candidateSummary: undefined,\n discoverySource: 'query' as const,\n }));\n }\n })\n );\n const byUserAndIndex = new Map<string, CandidateMatch>();\n for (const c of allCandidates) {\n const entityKey = c.candidateIntentId ? `intent:${c.candidateIntentId}` : `premise:${c.candidatePremiseId}`;\n const key = `${c.candidateUserId}:${c.networkId}:${entityKey}`;\n if (!byUserAndIndex.has(key) || c.similarity > (byUserAndIndex.get(key)?.similarity ?? 0)) {\n byUserAndIndex.set(key, c);\n }\n }\n const candidates = Array.from(byUserAndIndex.values());\n logger.verbose('[Graph:Discovery] Intent-path discovery complete', { candidatesFound: candidates.length });\n const usedLenses = Object.keys(hydeEmbeddings);\n\n // Build trace with individual candidate similarity scores\n const traceEntries: Array<{ node: string; detail?: string; data?: Record<string, unknown> }> = [];\n\n // Lens input trace\n if (discoveryLensInput) {\n traceEntries.push({\n node: \"lens_input\",\n detail: \"Profile context for lens inference\",\n data: discoveryLensInput,\n });\n }\n\n // Lens output trace\n if (lenses.length > 0) {\n traceEntries.push({\n node: \"lens_output\",\n detail: `Inferred ${lenses.length} lens(es): ${lenses.map(l => l.label).join(', ')}`,\n data: { lenses, model: getModelName(\"lensInferrer\") },\n });\n }\n\n // Compute per-lens stats from deduped candidates\n const lensStats: Record<string, { count: number; avgSimilarity: number }> = {};\n for (const c of candidates) {\n const s = c.lens || 'unknown';\n if (!lensStats[s]) lensStats[s] = { count: 0, avgSimilarity: 0 };\n lensStats[s].count++;\n lensStats[s].avgSimilarity += c.similarity;\n }\n for (const s of Object.values(lensStats)) {\n s.avgSimilarity = s.count > 0 ? Math.round((s.avgSimilarity / s.count) * 1000) / 1000 : 0;\n }\n\n traceEntries.push({\n node: \"discovery\",\n detail: `Query: \"${searchText.slice(0, 50)}${searchText.length > 50 ? '...' : ''}\" → ${candidates.length} candidate(s)`,\n data: {\n query: searchText.slice(0, 100),\n lenses: usedLenses,\n candidateCount: candidates.length,\n byLens: lensStats,\n durationMs: Date.now() - startTime,\n model: getModelName(\"hydeGenerator\"),\n },\n });\n\n // Show the HyDE-generated hypothetical documents used for search\n const hydeDocuments = hydeResult.hydeDocuments;\n if (hydeDocuments) {\n for (const [lens, doc] of Object.entries(hydeDocuments)) {\n if (doc?.hydeText) {\n traceEntries.push({\n node: \"hyde_query\",\n detail: `[${lens}] \"${doc.hydeText.slice(0, 120)}${doc.hydeText.length > 120 ? '...' : ''}\"`,\n data: {\n lens,\n hydeTextPreview: doc.hydeText.slice(0, 160) + (doc.hydeText.length > 160 ? '...' : ''),\n },\n });\n }\n }\n }\n\n // Add top candidates with similarity scores\n const sortedCandidates = [...candidates].sort((a, b) => b.similarity - a.similarity).slice(0, 10);\n for (const c of sortedCandidates) {\n traceEntries.push({\n node: \"match\",\n detail: `Similarity ${Math.round(c.similarity * 100)}% via ${c.lens}`,\n data: {\n userId: c.candidateUserId,\n similarity: Math.round(c.similarity * 100),\n lens: c.lens,\n hasIntent: !!c.candidateIntentId,\n },\n });\n }\n\n const [premiseCands, contextCands] = await Promise.all([\n runPremiseDiscovery(),\n runContextToIntentDiscovery(),\n ]);\n const allStrategies = mergeStrategyCandidates(candidates, premiseCands, contextCands);\n if (premiseCands.length > 0 || contextCands.length > 0) {\n traceEntries.push({\n node: \"discovery\",\n detail: `+ Premise → ${premiseCands.length}, Context → ${contextCands.length}, merged to ${allStrategies.length} candidate(s)`,\n });\n }\n return {\n hydeEmbeddings: hydeEmbeddings as Record<string, number[]>,\n candidates: filterByTarget(allStrategies),\n trace: traceEntries,\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Discovery] Failed', { error });\n return {\n candidates: [],\n error: 'Failed to search for candidates.',\n trace: [{\n node: \"discovery_fatal\",\n detail: `Discovery failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const candidates = r?.candidates as unknown[];\n return candidates ? `Found ${candidates.length} candidate(s)` : undefined;\n },\n );\n\n /**\n * Node 3: Evaluation (Entity bundle)\n * Builds entity bundle from source + candidates, invokes entity-bundle evaluator, maps to EvaluatedOpportunity with networkId from entities.\n */\n const evaluationNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.evaluation\", async () => {\n const startTime = Date.now();\n logger.verbose('[Graph:Evaluation] Starting evaluation', {\n candidatesCount: state.candidates.length,\n });\n\n if (state.candidates.length === 0) {\n logger.verbose('[Graph:Evaluation] No candidates to evaluate');\n return { evaluatedOpportunities: [], agentTimings: [] };\n }\n\n // Batch candidates to avoid timeout - evaluate top 25 per batch, store remaining\n const EVAL_BATCH_SIZE = 25;\n const sortedCandidates = [...state.candidates]\n .sort((a, b) => b.similarity - a.similarity);\n\n // Dedup by userId — when same similarity, prefer index with highest relevancyScore\n const bestByUser = new Map<string, CandidateMatch>();\n for (const c of sortedCandidates) {\n const existing = bestByUser.get(c.candidateUserId);\n if (!existing) {\n bestByUser.set(c.candidateUserId, c);\n } else if (c.similarity > existing.similarity) {\n bestByUser.set(c.candidateUserId, c);\n } else if (c.similarity === existing.similarity) {\n // Tie-break: prefer index with higher relevancy score\n const cScore = state.indexRelevancyScores[c.networkId] ?? 0;\n const existingScore = state.indexRelevancyScores[existing.networkId] ?? 0;\n if (cScore > existingScore) {\n bestByUser.set(c.candidateUserId, c);\n }\n }\n }\n const dedupedCandidates = Array.from(bestByUser.values());\n // Re-sort by similarity descending (Map iteration order doesn't guarantee sort)\n dedupedCandidates.sort((a, b) => b.similarity - a.similarity);\n\n if (dedupedCandidates.length < sortedCandidates.length) {\n logger.info(\"[Graph:Evaluation] Deduped candidates by userId\", {\n before: sortedCandidates.length,\n after: dedupedCandidates.length,\n removed: sortedCandidates.length - dedupedCandidates.length,\n });\n }\n\n const batchToEvaluate = dedupedCandidates.slice(0, EVAL_BATCH_SIZE);\n const remaining = dedupedCandidates.slice(EVAL_BATCH_SIZE);\n\n // Early termination: if search was query-driven and no query-sourced candidates remain,\n // clear remaining to prevent pointless pagination through non-query leftovers\n const isQueryDriven = !!state.searchQuery?.trim();\n const queryRemaining = remaining.filter(\n (c) => c.discoverySource === 'query' || c.discoverySource == null,\n );\n const effectiveRemaining =\n isQueryDriven && queryRemaining.length === 0 ? [] : remaining;\n\n if (isQueryDriven && remaining.length > 0 && queryRemaining.length === 0) {\n logger.info(\n \"[Graph:Evaluation] Early termination: no query-sourced candidates remain\",\n {\n droppedCandidates: remaining.length,\n },\n );\n }\n\n if (effectiveRemaining.length > 0) {\n logger.verbose('[Graph:Evaluation] Batched candidates for evaluation', {\n evaluating: batchToEvaluate.length,\n remaining: effectiveRemaining.length,\n total: sortedCandidates.length,\n });\n }\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n\n try {\n const discoveryUserId = state.onBehalfOfUserId ?? state.userId;\n const sourceProfile = await this.database.getProfile(discoveryUserId);\n const sourceEntity: EvaluatorEntity = {\n userId: discoveryUserId,\n profile: {\n name: sourceProfile?.identity?.name,\n bio: sourceProfile?.identity?.bio,\n location: sourceProfile?.identity?.location,\n interests: sourceProfile?.attributes?.interests,\n skills: sourceProfile?.attributes?.skills,\n context: sourceProfile?.narrative?.context,\n },\n intents: state.indexedIntents.slice(0, 5).map((i) => ({\n intentId: i.intentId,\n payload: i.payload,\n summary: i.summary,\n })),\n networkId: '' as Id<'networks'>, // Placeholder — overwritten per-pairing below\n evidenceKey: `${discoveryUserId}::source`,\n ragScore: undefined,\n matchedVia: undefined,\n };\n\n const candidateEntities: EvaluatorEntity[] = await Promise.all(\n batchToEvaluate.map(async (c) => {\n const profile = await this.database.getProfile(c.candidateUserId);\n let intentPayload = c.candidatePayload;\n let intentSummary = c.candidateSummary;\n if (c.candidateIntentId != null && (!intentPayload || intentPayload === '')) {\n const intent = await this.database.getIntent(c.candidateIntentId);\n if (intent) {\n intentPayload = intent.payload;\n intentSummary = intent.summary ?? undefined;\n }\n }\n const evidenceKey = buildEvaluatorEvidenceKey(c);\n return {\n userId: c.candidateUserId,\n profile: {\n name: profile?.identity?.name,\n bio: profile?.identity?.bio,\n location: profile?.identity?.location,\n interests: profile?.attributes?.interests,\n skills: profile?.attributes?.skills,\n context: profile?.narrative?.context,\n },\n intents:\n c.candidateIntentId != null\n ? [{ intentId: c.candidateIntentId, payload: intentPayload ?? '', summary: intentSummary }]\n : undefined,\n networkId: c.networkId,\n evidenceKey,\n ragScore: c.similarity * 100,\n matchedVia: c.lens,\n evidence: c.evidence,\n };\n })\n );\n\n const userIdToIndexId = new Map<string, Id<'networks'>>();\n const evidenceByEntityKey = new Map<string, OpportunityEvidence[]>();\n const entityKeysByUserId = new Map<string, string[]>();\n for (const e of candidateEntities) {\n if (!userIdToIndexId.has(e.userId)) userIdToIndexId.set(e.userId, e.networkId as Id<'networks'>);\n if (e.evidenceKey) {\n evidenceByEntityKey.set(\n e.evidenceKey,\n mergeOpportunityEvidence(evidenceByEntityKey.get(e.evidenceKey), e.evidence),\n );\n entityKeysByUserId.set(e.userId, [...(entityKeysByUserId.get(e.userId) ?? []), e.evidenceKey]);\n }\n }\n\n function evidenceForActor(actor: { userId: string; intentId?: string | null; evidenceKey?: string | null }): OpportunityEvidence[] | undefined {\n if (actor.evidenceKey) return evidenceByEntityKey.get(actor.evidenceKey);\n const keys = entityKeysByUserId.get(actor.userId) ?? [];\n const intentKey = actor.intentId ? keys.find((key) => key.endsWith(`:${actor.intentId}`)) : undefined;\n if (intentKey) return evidenceByEntityKey.get(intentKey);\n // Avoid leaking unrelated resource evidence when the evaluator collapsed multiple\n // candidates for the same user into a profile-only actor.\n if (keys.length === 1) return evidenceByEntityKey.get(keys[0]);\n return undefined;\n }\n\n // Lower default threshold to 50 for better recall\n const minScore = state.options.minScore ?? 50;\n\n const evaluator = typeof (evaluatorAgent as OpportunityEvaluator).invokeEntityBundle === 'function'\n ? (evaluatorAgent as OpportunityEvaluator)\n : new OpportunityEvaluator();\n\n const runParallel = process.env.RUN_OPPORTUNITY_EVAL_IN_PARALLEL === 'true';\n const networkContexts = await buildNetworkContexts([sourceEntity, ...candidateEntities], this.database);\n\n // Declare trace entries early so both parallel and serial paths can push error entries\n const traceEntries: Array<{ node: string; detail?: string; data?: Record<string, unknown> }> = [];\n const parallelErrors: Array<{ candidateUserId: string; candidateName: string; error: string; durationMs: number }> = [];\n\n let pairwiseOpportunities: Array<{ reasoning: string; score: number; actors: Array<{ userId: string; role: 'agent' | 'patient' | 'peer'; intentId?: string | null; evidenceKey?: string | null }> }>;\n\n if (runParallel) {\n // Experimental: one LLM call per candidate, all fired in parallel\n logger.verbose('[Graph:Evaluation] Running parallel evaluation', { candidates: candidateEntities.length });\n const parallelResults = await Promise.all(\n candidateEntities.map((candidateEntity) => {\n const input: EvaluatorInput = {\n discovererId: discoveryUserId,\n entities: [sourceEntity, candidateEntity],\n existingOpportunities: state.options.existingOpportunities,\n ...(state.searchQuery?.trim() ? { discoveryQuery: state.searchQuery.trim() } : {}),\n networkContexts,\n };\n const _evalStart = Date.now();\n const _traceEmitter = requestContext.getStore()?.traceEmitter;\n _traceEmitter?.({ type: \"agent_start\", name: \"opportunity-evaluator\" });\n const _candidateName = candidateEntity.profile?.name ?? \"Unknown\";\n return evaluator.invokeEntityBundle(input, { minScore, returnAll: true })\n .then((res) => {\n const _evalDuration = Date.now() - _evalStart;\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _evalDuration });\n const _topScore = res.length > 0 ? Math.max(...res.map(r => r.score)) : -1;\n const _summary = _topScore < 0 ? `${_candidateName}: no match` : `${_candidateName}: ${_topScore}`;\n _traceEmitter?.({ type: \"agent_end\", name: \"opportunity-evaluator\", durationMs: _evalDuration, summary: _summary });\n return res;\n })\n .catch((err) => {\n const _evalDuration = Date.now() - _evalStart;\n const _errMsg = err instanceof Error ? err.message : String(err);\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _evalDuration });\n _traceEmitter?.({ type: \"agent_end\", name: \"opportunity-evaluator\", durationMs: _evalDuration, summary: `${_candidateName}: error — ${_errMsg}` });\n logger.warn('[Graph:Evaluation] Parallel eval failed for candidate', {\n candidateUserId: candidateEntity.userId,\n error: err,\n });\n parallelErrors.push({\n candidateUserId: candidateEntity.userId,\n candidateName: _candidateName,\n error: _errMsg,\n durationMs: _evalDuration,\n });\n return [] as Array<{ reasoning: string; score: number; actors: Array<{ userId: string; role: 'agent' | 'patient' | 'peer'; intentId?: string | null; evidenceKey?: string | null }> }>;\n });\n })\n );\n // Each call is already pairwise (source + 1 candidate) — flatten directly\n pairwiseOpportunities = parallelResults.flat();\n\n // Record trace entries for candidates that failed during parallel evaluation\n if (parallelErrors.length > 0) {\n traceEntries.push({\n node: \"evaluation_errors\",\n detail: `${parallelErrors.length}/${candidateEntities.length} candidate evaluation(s) failed`,\n data: {\n failedCount: parallelErrors.length,\n totalCandidates: candidateEntities.length,\n errors: parallelErrors.map(e => ({\n candidateUserId: e.candidateUserId,\n candidateName: e.candidateName,\n error: e.error,\n durationMs: e.durationMs,\n })),\n },\n });\n }\n } else {\n // Default: single bundled LLM call with all candidates\n const entities: EvaluatorEntity[] = [sourceEntity, ...candidateEntities];\n const input: EvaluatorInput = {\n discovererId: discoveryUserId,\n entities,\n existingOpportunities: state.options.existingOpportunities,\n ...(state.searchQuery?.trim() ? { discoveryQuery: state.searchQuery.trim() } : {}),\n networkContexts,\n };\n // Get ALL scored results for tracing (returnAll: true), filter for persistence later\n const _evalStart = Date.now();\n const _traceEmitterSerial = requestContext.getStore()?.traceEmitter;\n _traceEmitterSerial?.({ type: \"agent_start\", name: \"opportunity-evaluator\" });\n let opportunitiesWithActors: EvaluatedOpportunityWithActors[];\n try {\n opportunitiesWithActors = await evaluator.invokeEntityBundle(input, { minScore, returnAll: true });\n const _evalDuration = Date.now() - _evalStart;\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _evalDuration });\n _traceEmitterSerial?.({ type: \"agent_end\", name: \"opportunity-evaluator\", durationMs: _evalDuration, summary: `Evaluated ${candidateEntities.length} candidate(s)` });\n } catch (serialErr) {\n const _evalDuration = Date.now() - _evalStart;\n const _errMsg = serialErr instanceof Error ? serialErr.message : String(serialErr);\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _evalDuration });\n _traceEmitterSerial?.({ type: \"agent_end\", name: \"opportunity-evaluator\", durationMs: _evalDuration, summary: `error — ${_errMsg}` });\n throw serialErr; // Re-throw for the outer catch to handle\n }\n\n // Split multi-actor evaluator results into pairwise (viewer + candidate).\n // Each persisted discovery opportunity should have exactly 2 actors.\n // When splitting, build per-candidate reasoning from entity data because\n // the shared reasoning typically describes only one candidate.\n pairwiseOpportunities = [];\n for (const op of opportunitiesWithActors) {\n const pairwiseSourceId = state.onBehalfOfUserId ?? state.userId;\n const nonViewerActors = op.actors.filter(a => a.userId !== pairwiseSourceId);\n if (nonViewerActors.length <= 1) {\n pairwiseOpportunities.push(op);\n } else {\n logger.warn('[Graph:Evaluation] Splitting multi-actor opportunity; LLM returned bundled actors instead of one-per-candidate', {\n actorCount: nonViewerActors.length,\n userIds: nonViewerActors.map(a => a.userId),\n });\n const viewerActor = op.actors.find(a => a.userId === pairwiseSourceId);\n for (const candidate of nonViewerActors) {\n const entity = candidateEntities.find(e => e.userId === candidate.userId);\n const candidateName = entity?.profile?.name ?? '';\n const reasoningLower = op.reasoning.toLowerCase();\n const mentionsCandidate =\n candidateName !== '' &&\n reasoningLower.includes(candidateName.toLowerCase());\n const mentionsOtherCandidate = nonViewerActors\n .filter((actor) => actor.userId !== candidate.userId)\n .map((actor) =>\n candidateEntities.find((e) => e.userId === actor.userId)?.profile?.name?.toLowerCase()\n )\n .some((name) => name != null && reasoningLower.includes(name));\n let reasoning: string;\n if (mentionsCandidate && !mentionsOtherCandidate) {\n reasoning = op.reasoning;\n } else if (entity?.profile) {\n const p = entity.profile;\n const parts = [p.name, p.bio].filter(Boolean);\n if (p.skills?.length) parts.push(`Skills: ${p.skills.join(', ')}`);\n if (p.interests?.length) parts.push(`Interests: ${p.interests.join(', ')}`);\n reasoning = parts.join('. ') || op.reasoning;\n } else {\n reasoning = op.reasoning;\n }\n pairwiseOpportunities.push({\n reasoning,\n score: op.score,\n actors: [\n viewerActor ?? { userId: pairwiseSourceId, role: 'patient' as const, intentId: null },\n candidate,\n ],\n });\n }\n }\n }\n }\n\n const evaluatedOpportunities: EvaluatedOpportunity[] = pairwiseOpportunities.map((op) => ({\n reasoning: op.reasoning,\n score: op.score,\n evidence: mergeOpportunityEvidence(...op.actors.map(evidenceForActor)),\n actors: op.actors.map((a) => {\n const isSource = a.userId === discoveryUserId;\n if (isSource) {\n // Source actor inherits the counterpart's networkId (shared match context)\n const counterpart = op.actors.find((other) => other.userId !== a.userId);\n const counterpartIndexId = counterpart\n ? userIdToIndexId.get(counterpart.userId) ?? (candidateEntities.find((e) => e.userId === counterpart.userId)?.networkId as Id<'networks'>)\n : undefined;\n return {\n userId: a.userId as Id<'users'>,\n role: a.role,\n intentId: a.intentId as Id<'intents'> | undefined,\n networkId: counterpartIndexId ?? userIdToIndexId.get(a.userId) ?? ('' as Id<'networks'>),\n };\n }\n return {\n userId: a.userId as Id<'users'>,\n role: a.role,\n intentId: a.intentId as Id<'intents'> | undefined,\n networkId: userIdToIndexId.get(a.userId) ?? (candidateEntities.find((e) => e.userId === a.userId)?.networkId as Id<'networks'>),\n };\n }),\n }));\n\n const passed = evaluatedOpportunities.filter((o) => o.score >= minScore);\n logger.verbose('[Graph:Evaluation] Evaluation complete', {\n evaluatedCount: evaluatedOpportunities.length,\n passed: passed.length,\n });\n\n // Build detailed trace entries for each evaluated candidate\n\n // Threshold filter trace: how many candidates in this batch were above/below similarity threshold\n const aboveThreshold = batchToEvaluate.filter(c => c.similarity >= 0.40).length;\n const belowThreshold = batchToEvaluate.length - aboveThreshold;\n traceEntries.push({\n node: \"threshold_filter\",\n detail: `${aboveThreshold} above 0.40, ${belowThreshold} below (batch of ${batchToEvaluate.length})`,\n data: {\n aboveThreshold,\n belowThreshold,\n minScore: 0.40,\n batchSize: batchToEvaluate.length,\n },\n });\n\n // Create a map of evaluated candidates by userId for quick lookup.\n // Use discoveryUserId (which accounts for onBehalfOfUserId in introducer flow)\n // rather than state.userId (which is the introducer, not present in pairwise actors).\n const evaluatedByUserId = new Map<string, { score: number; reasoning: string }>();\n for (const opp of evaluatedOpportunities) {\n const candidateActor = opp.actors.find(a => a.userId !== discoveryUserId);\n if (candidateActor) {\n evaluatedByUserId.set(candidateActor.userId, { score: opp.score, reasoning: opp.reasoning });\n }\n }\n\n // Summary entry\n traceEntries.push({\n node: \"evaluation\",\n detail: `Evaluated ${candidateEntities.length} candidate(s) → ${passed.length} passed (min score ${minScore})`,\n data: {\n inputCandidates: batchToEvaluate.length,\n returnedFromEvaluator: evaluatedOpportunities.length,\n passedCount: passed.length,\n minScore,\n remaining: effectiveRemaining.length,\n batchNumber: 1,\n durationMs: Date.now() - startTime,\n model: getModelName(\"opportunityEvaluator\"),\n },\n });\n\n // Individual candidate entries - show ALL candidates that went to evaluator\n for (const entity of candidateEntities) {\n const candidateName = entity.profile?.name || entity.userId.slice(0, 8);\n const candidateBio = entity.profile?.bio;\n const evaluated = evaluatedByUserId.get(entity.userId);\n const score = evaluated?.score;\n const reasoning = evaluated?.reasoning;\n const didPass = score !== undefined && score >= minScore;\n const status = score !== undefined \n ? (didPass ? '✓ passed' : `✗ score ${score}`) \n : '✗ not scored';\n \n traceEntries.push({\n node: \"candidate\",\n detail: `${candidateName}: ${status}`,\n data: {\n userId: entity.userId,\n name: candidateName,\n bio: candidateBio,\n score: score,\n passed: didPass,\n reasoning: reasoning || 'No evaluation returned for this candidate',\n matchedVia: entity.matchedVia,\n ragScore: entity.ragScore,\n model: getModelName(\"opportunityEvaluator\"),\n intents: entity.intents?.map((i: { intentId?: string; payload?: string; summary?: string }) => ({\n intentId: i.intentId,\n summary: (i.summary || i.payload || '').slice(0, 100),\n })),\n profile: entity.profile ? {\n name: entity.profile.name,\n location: entity.profile.location,\n } : undefined,\n },\n });\n }\n\n // Only pass opportunities that passed the threshold to downstream nodes\n const passedOpportunities = evaluatedOpportunities.filter((o) => o.score >= minScore);\n\n return {\n evaluatedOpportunities: passedOpportunities,\n remainingCandidates: effectiveRemaining,\n trace: traceEntries,\n agentTimings: agentTimingsAccum,\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Evaluation] Failed', { error });\n return {\n evaluatedOpportunities: [],\n error: 'Failed to evaluate candidates.',\n trace: [{\n node: \"evaluation_fatal\",\n detail: `Evaluation failed: ${errMsg}`,\n data: {\n error: errMsg,\n candidateCount: state.candidates?.length ?? 0,\n durationMs: Date.now() - startTime,\n },\n }],\n agentTimings: agentTimingsAccum,\n };\n }\n });\n };\n\n /**\n * Node 3b: Negotiate (post-persist)\n * Runs bilateral negotiation per persisted opportunity, passing opportunityId so the\n * negotiation graph's finalize node updates each opportunity's status:\n * accept → 'pending' (sender notification follows the pending → notification path)\n * reject → 'rejected'\n * timeout/turn_cap → 'stalled'\n * Status updates land in the DB; in-memory state.opportunities is not mutated.\n */\n const NEGOTIATE_TIMER_SENTINEL = Symbol('negotiate-timer-sentinel');\n const negotiateNode = async (state: typeof OpportunityGraphState.State) => {\n if (!this.negotiationGraph) return {};\n if (!state.opportunities || state.opportunities.length === 0) return {};\n\n const traceEmitter = requestContext.getStore()?.traceEmitter;\n const graphStart = Date.now();\n traceEmitter?.({ type: \"graph_start\", name: \"Negotiation graph\" });\n\n try {\n // Use the same discoveryUserId pattern as evaluationNode\n const discoveryUserId = (state.onBehalfOfUserId ?? state.userId) as string;\n\n const sourceAccount = await this.database.getUser(discoveryUserId).catch(() => null);\n\n const sourceUser = {\n id: discoveryUserId,\n intents: state.indexedIntents?.slice(0, 5).map(i => ({\n id: i.intentId as string,\n title: i.summary ?? '',\n description: i.payload ?? '',\n confidence: 1,\n })) ?? [],\n profile: {\n name: state.sourceProfile?.identity?.name ?? sourceAccount?.name,\n bio: state.sourceProfile?.identity?.bio ?? sourceAccount?.intro ?? undefined,\n location: state.sourceProfile?.identity?.location ?? sourceAccount?.location ?? undefined,\n skills: state.sourceProfile?.attributes?.skills,\n interests: state.sourceProfile?.attributes?.interests,\n },\n };\n\n // Build candidates from persisted opportunities. Each opportunity carries its DB id\n // so the negotiation graph's finalize node can update its status from the outcome.\n logger.verbose('[Graph:Negotiate] Building candidates from opportunities', {\n opportunityCount: state.opportunities.length,\n discoveryUserId,\n });\n\n const candidateEntries = state.opportunities\n .map(opp => {\n // Skip opportunities where any introducer exists but has not yet approved.\n const introducerActors = (opp.actors as OpportunityActor[])\n .filter(a => a.role === 'introducer');\n if (introducerActors.length > 0 && !introducerActors.every(a => a.approved === true)) {\n logger.verbose('[Graph:Negotiate] Skipping opportunity: introducer not approved', {\n opportunityId: opp.id,\n introducerCount: introducerActors.length,\n approvedCount: introducerActors.filter(a => a.approved === true).length,\n });\n return null;\n }\n\n const candidateActor = (opp.actors as Array<{ userId: string; role?: string; networkId?: string; intentId?: string }>)\n .find(a => a.userId !== discoveryUserId);\n if (!candidateActor) {\n logger.verbose('[Graph:Negotiate] Skipping opportunity: no candidateActor found', {\n opportunityId: opp.id,\n discoveryUserId,\n actors: (opp.actors as OpportunityActor[])?.map(a => ({ userId: a.userId, role: a.role })) ?? [],\n });\n return null;\n }\n return { opp, candidateActor };\n })\n .filter((e): e is NonNullable<typeof e> => e !== null);\n\n logger.verbose('[Graph:Negotiate] Candidate filtering complete', {\n inputOpportunities: state.opportunities.length,\n outputCandidates: candidateEntries.length,\n });\n\n const candidates: NegotiationCandidate[] = await Promise.all(\n candidateEntries.map(async ({ opp, candidateActor }) => {\n const userId = candidateActor.userId as string;\n const [profile, user, activeIntents, intent] = await Promise.all([\n this.database.getProfile(userId).catch(() => null),\n this.database.getUser(userId).catch(() => null),\n this.database.getActiveIntents(userId).catch(() => []),\n candidateActor.intentId\n ? this.database.getIntent(candidateActor.intentId as string).catch(() => null)\n : null,\n ]);\n\n const toNegIntent = (ai: { id?: string | null; summary?: string | null; payload?: string | null }) => ({\n id: (ai.id ?? candidateActor.intentId) as string,\n title: ai.summary ?? '',\n description: ai.payload ?? '',\n confidence: 1,\n });\n const triggerInActive = activeIntents.some(ai => ai.id === candidateActor.intentId);\n const triggerFallback = !triggerInActive && intent ? [toNegIntent(intent)] : [];\n const candidateIntents = [\n ...triggerFallback,\n ...activeIntents.filter(ai => ai.id === candidateActor.intentId).map(toNegIntent),\n ...activeIntents.filter(ai => ai.id !== candidateActor.intentId).map(toNegIntent),\n ].slice(0, 5);\n\n return {\n userId,\n opportunityId: opp.id as string,\n reasoning: (opp.interpretation as { reasoning?: string } | null)?.reasoning ?? '',\n valencyRole: candidateActor.role ?? 'peer',\n networkId: candidateActor.networkId as string,\n ...(state.searchQuery?.trim() && { discoveryQuery: state.searchQuery.trim() }),\n candidateUser: {\n id: userId,\n intents: candidateIntents,\n profile: {\n name: profile?.identity?.name ?? user?.name,\n bio: profile?.identity?.bio ?? user?.intro ?? undefined,\n location: profile?.identity?.location ?? user?.location ?? undefined,\n skills: profile?.attributes?.skills,\n interests: profile?.attributes?.interests,\n },\n },\n };\n }),\n );\n\n const isChatPath = !!state.options?.conversationId;\n const maxTurns = isChatPath\n ? Number(process.env.NEGOTIATION_MAX_TURNS_CHAT) || 4\n : Number(process.env.NEGOTIATION_MAX_TURNS_AMBIENT) || 6;\n\n // Fetch per-candidate index context (group by networkId to avoid duplicate lookups)\n const uniqueIndexIds = [...new Set(candidates.map(c => c.networkId).filter((id): id is string => !!id))];\n const indexContextMap = new Map<string, string>();\n await Promise.all(\n uniqueIndexIds.map(async (networkId) => {\n const ctx = await this.database.getNetworkMemberContext(networkId, discoveryUserId).catch(() => null);\n const prompt = [ctx?.indexPrompt, ctx?.memberPrompt]\n .filter((v): v is string => !!v?.trim())\n .join('\\n\\n');\n if (prompt) indexContextMap.set(networkId, prompt);\n }),\n );\n\n // Decide turn timeout.\n // - Background/queue path (no conversationId): always the park-window\n // budget (AMBIENT_PARK_WINDOW_MS, 5 min). Turns park in\n // `waiting_for_agent` and are picked up via polling; the dispatcher\n // additionally short-circuits to the system agent when no personal\n // agent has a fresh heartbeat (see AgentDispatcherImpl).\n // - Chat path with a personal agent authorized: use the same park-window\n // so the dispatcher parks the turn and the user's personal agent can\n // pick it up via polling.\n // - Chat path with no personal agent: use a short timeout (30s) so the\n // system `Index Negotiator` kicks in without stalling the chat.\n // Check the personal agent per unique candidate network so cross-network\n // chat runs don't get a single authorized agent deciding the timeout for\n // every candidate. Only use the long (polling) timeout when a personal\n // agent is authorized on ALL candidate networks; otherwise fall back to\n // the short timeout so chats don't stall on a network where only the\n // system negotiator is allowed.\n const hasPersonalAgent = isChatPath && this.agentDispatcher\n ? (uniqueIndexIds.length > 0\n ? (await Promise.all(\n uniqueIndexIds.map((networkId) =>\n this.agentDispatcher!.hasPersonalAgent(\n discoveryUserId,\n { action: 'manage:negotiations', scopeType: 'network', scopeId: networkId },\n ).catch(() => false),\n ),\n )).every(Boolean)\n : false)\n : false;\n // Orchestrator (chat-driven a2h) fan-out uses a tight 60s park window —\n // the user is watching the stream, so we cannot afford the 5-min ambient\n // budget. Ambient keeps its heartbeat-aware long/short split.\n const ORCHESTRATOR_PARK_WINDOW_MS = 60_000;\n const isOrchestrator = state.trigger === 'orchestrator';\n const useLongTimeout = !isChatPath || hasPersonalAgent;\n const timeoutMs = isOrchestrator\n ? ORCHESTRATOR_PARK_WINDOW_MS\n : useLongTimeout ? AMBIENT_PARK_WINDOW_MS : 30_000;\n\n logger.info('negotiateNode timeout decision', {\n discoveryUserId,\n trigger: state.trigger,\n isChatPath,\n isOrchestrator,\n hasDispatcher: !!this.agentDispatcher,\n hasPersonalAgent,\n useLongTimeout,\n timeoutMs,\n candidateCount: candidates.length,\n });\n\n // Per-candidate hook — always-on. Accumulates negotiation resolutions\n // for discovery question generation. Additionally, for the orchestrator\n // trigger: flips the opp from 'pending' to 'draft' and pushes an\n // `opportunity_draft_ready` event so the frontend can render it\n // inline as soon as it resolves, rather than waiting for the full\n // fan-out. Abort (e.g. user closed the chat) suppresses both the\n // status flip and the event — the in-flight negotiation finishes\n // naturally but its card never reaches the user.\n // Build a stable order index so that resolutions accumulated via the\n // per-candidate async hook can be re-sorted to candidate-list order\n // before being handed to buildQuestionPrompt. Without this the LLM\n // sees negotiations in completion-time order (non-deterministic).\n const candidateOrderById = new Map<string, number>();\n candidates.forEach((c, i) => candidateOrderById.set(c.userId, i));\n\n const resolutions: Array<NegotiationResolution & { __order: number }> = [];\n\n const onCandidateResolved: OnNegotiationResolved = async ({ candidate, accepted, turns, outcome }) => {\n resolutions.push({\n __order: candidateOrderById.get(candidate.userId) ?? Number.MAX_SAFE_INTEGER,\n candidateUserId: candidate.userId,\n counterpartyHint: (() => {\n const bio = candidate.candidateUser.profile?.bio?.trim();\n if (bio) return bio;\n return (candidate.candidateUser.profile?.interests ?? []).join(\", \");\n })(),\n indexContext: candidate.networkId\n ? indexContextMap.get(candidate.networkId) ?? \"\"\n : \"\",\n turns,\n outcome,\n });\n\n if (state.trigger !== 'orchestrator') return;\n // ─── orchestrator streaming body ───\n const abortSignal = requestContext.getStore()?.abortSignal;\n if (abortSignal?.aborted) return;\n if (!accepted || !candidate.opportunityId) return;\n\n // Only emit after a successful status flip — the frontend keys\n // cards off `opportunity.status === 'draft'`, so emitting a row\n // with its pre-flip status would render inconsistently. If the\n // flip fails we log and drop the event; the negotiation result\n // is still captured in acceptedResults for the final summary.\n const updated = await this.database\n .updateOpportunityStatus(candidate.opportunityId, 'draft')\n .catch((err) => {\n logger.warn('[Graph:Negotiate] failed to flip opp to draft; suppressing draft-ready event', {\n opportunityId: candidate.opportunityId,\n error: err,\n });\n return null;\n });\n if (!updated || abortSignal?.aborted) return;\n\n const counterpartName = candidate.candidateUser.profile?.name ?? '';\n const viewerName = sourceUser.profile.name;\n const rawReasoning = updated.interpretation?.reasoning ?? '';\n const personalizedSummary = viewerCentricCardSummary(\n rawReasoning,\n counterpartName,\n undefined,\n viewerName,\n );\n\n traceEmitter?.({\n type: 'opportunity_draft_ready',\n opportunityId: candidate.opportunityId,\n opportunity: updated,\n personalizedSummary,\n counterparty: {\n userId: candidate.candidateUser.id,\n ...(candidate.candidateUser.profile?.name\n ? { name: candidate.candidateUser.profile.name }\n : {}),\n },\n });\n };\n\n const negotiationWork = negotiateCandidates(\n this.negotiationGraph, sourceUser, candidates,\n { networkId: '', prompt: '' }, // base context, overridden per-candidate below\n { maxTurns, traceEmitter: traceEmitter ?? undefined,\n indexContextOverrides: indexContextMap,\n timeoutMs,\n trigger: state.trigger === 'orchestrator' ? 'orchestrator' : 'ambient',\n onCandidateResolved },\n );\n\n // MCP-only: race the whole negotiate phase against a budget. When the\n // timer wins we return early with a `timed_out` trace; the unresolved\n // promise keeps running in the Bun event loop and each candidate's\n // finalize node updates its opp status in the DB. We deliberately do\n // NOT await it, NOT abort it, and NOT mutate state.opportunities —\n // the MCP tool handler refreshes statuses from the DB before\n // responding. Bounded blast radius: at most ~20 s of background work\n // per request; orphans heal via maintenance scripts or IND-279 when\n // it lands.\n const budgetMs = state.options.negotiateTimeoutMs;\n let acceptedResults: Awaited<typeof negotiationWork>;\n if (budgetMs !== undefined) {\n let timerId: ReturnType<typeof setTimeout> | undefined;\n const timerWork = new Promise<typeof NEGOTIATE_TIMER_SENTINEL>((resolve) => {\n timerId = setTimeout(() => resolve(NEGOTIATE_TIMER_SENTINEL), budgetMs);\n });\n // try/finally ensures the timer is cleared on every exit path —\n // sentinel-win, work-win, AND `negotiationWork` rejection. Without\n // this, a rejected negotiation would leave the timer pending and\n // keep the event loop alive until `budgetMs` elapses.\n let raced: typeof NEGOTIATE_TIMER_SENTINEL | Awaited<typeof negotiationWork>;\n try {\n raced = await Promise.race([negotiationWork, timerWork]);\n } finally {\n if (timerId !== undefined) clearTimeout(timerId);\n }\n if (raced === NEGOTIATE_TIMER_SENTINEL) {\n // Floating promise is intentional — see comment above.\n void negotiationWork.catch((err) => {\n logger.warn('[Graph:Negotiate] background negotiation failed after timer fired', { error: err });\n });\n logger.warn('[Graph:Negotiate] timed out — returning partial results to caller', {\n discoveryUserId,\n candidateCount: candidates.length,\n negotiateTimeoutMs: budgetMs,\n });\n traceEmitter?.({ type: \"graph_end\", name: \"Negotiation graph\", durationMs: Date.now() - graphStart });\n const orderedResolutionsPartial = [...resolutions]\n .sort((a, b) => a.__order - b.__order)\n .map(({ __order: _o, ...r }) => r as NegotiationResolution);\n const discoveryNegotiationsPartial = orderedResolutionsPartial.map(toDiscoveryNegotiation);\n const discoverySummaryPartial = buildDiscoverySummary(orderedResolutionsPartial);\n return {\n trace: [{\n node: 'negotiate',\n detail: 'timed_out',\n data: {\n negotiateTimeoutMs: budgetMs,\n candidateCount: candidates.length,\n durationMs: Date.now() - graphStart,\n },\n }],\n discoveryNegotiations: discoveryNegotiationsPartial,\n discoverySummary: discoverySummaryPartial,\n };\n }\n acceptedResults = raced;\n } else {\n acceptedResults = await negotiationWork;\n }\n\n // No filtering: every candidate's outcome (accept/reject/stalled) was applied to its\n // opportunity row by the negotiation graph's finalize node via the opportunityId we\n // passed. state.opportunities stays as it was at persist time; DB has the new statuses.\n const acceptedUserIds = new Set(acceptedResults.map(r => r.userId));\n const negotiationDurationMs = Date.now() - graphStart;\n\n const candidateTraceEntries = candidates.map(c => {\n const accepted = acceptedUserIds.has(c.userId);\n const result = accepted ? acceptedResults.find(r => r.userId === c.userId) : null;\n const name = c.candidateUser.profile?.name ?? c.userId;\n const outcome = accepted ? 'accepted' : 'rejected_or_stalled';\n return {\n node: 'negotiate_candidate',\n detail: `${name}: ${outcome}`,\n data: {\n userId: c.userId,\n opportunityId: c.opportunityId,\n name,\n outcome,\n turns: result?.turnCount ?? 0,\n },\n };\n });\n\n const acceptedCount = acceptedResults.length;\n const otherCount = candidates.length - acceptedCount;\n const negotiateTrace = [\n {\n node: 'negotiate',\n detail: `${candidates.length} candidate(s) -> ${acceptedCount} accepted, ${otherCount} rejected/stalled`,\n data: {\n durationMs: negotiationDurationMs,\n candidateCount: candidates.length,\n acceptedCount,\n otherCount,\n },\n },\n ...candidateTraceEntries,\n ];\n\n traceEmitter?.({ type: \"graph_end\", name: \"Negotiation graph\", durationMs: Date.now() - graphStart });\n const orderedResolutions = [...resolutions]\n .sort((a, b) => a.__order - b.__order)\n .map(({ __order: _o, ...r }) => r as NegotiationResolution);\n const discoveryNegotiations = orderedResolutions.map(toDiscoveryNegotiation);\n const discoverySummary = buildDiscoverySummary(orderedResolutions);\n return {\n trace: negotiateTrace,\n discoveryNegotiations,\n discoverySummary,\n };\n } catch (err) {\n logger.error(\"[Graph:Negotiate] Negotiation stage failed\", { error: err });\n traceEmitter?.({ type: \"graph_end\", name: \"Negotiation graph\", durationMs: Date.now() - graphStart });\n return {\n trace: [{\n node: 'negotiate',\n detail: 'Negotiation failed',\n data: { durationMs: Date.now() - graphStart, error: true },\n }],\n discoveryNegotiations: [],\n discoverySummary: buildDiscoverySummary([]),\n };\n }\n };\n\n /**\n * Node 4: Ranking\n * Sorts evaluated opportunities by score, applies limit, dedupes by actor-set hash.\n */\n const rankingNode = withNodeTrace(\n \"opportunity-ranking\",\n async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.ranking\", async () => {\n logger.verbose('[Graph:Ranking] Starting ranking', {\n evaluatedCount: state.evaluatedOpportunities.length,\n });\n\n try {\n const sorted = [...state.evaluatedOpportunities].sort((a, b) => b.score - a.score);\n const limit = state.options.limit ?? 20;\n const ranked = sorted.slice(0, limit);\n\n const actorSetKey = (opp: EvaluatedOpportunity) =>\n opp.actors\n .map((a) => `${a.userId}:${a.networkId}`)\n .sort()\n .join('|');\n const seen = new Set<string>();\n const deduplicated = ranked.filter((opp) => {\n const key = actorSetKey(opp);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n logger.verbose('[Graph:Ranking] Ranking complete', {\n sorted: sorted.length,\n afterLimit: ranked.length,\n afterDedup: deduplicated.length,\n });\n return { evaluatedOpportunities: deduplicated };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Ranking] Failed', { error });\n return {\n evaluatedOpportunities: [],\n error: 'Failed to rank opportunities.',\n trace: [{\n node: \"ranking_fatal\",\n detail: `Ranking failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const opps = r?.evaluatedOpportunities as unknown[];\n return opps ? `Ranked ${opps.length} opportunity(ies)` : undefined;\n },\n );\n\n /**\n * Node: intro_validation (create_introduction path)\n * Validates index scope, membership for introducer and all party users, and no existing opportunity.\n */\n const introValidationNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.introValidation\", async () => {\n logger.verbose('[Graph:IntroValidation] Starting', {\n userId: state.userId,\n networkId: state.networkId,\n entitiesCount: state.introductionEntities?.length ?? 0,\n });\n\n try {\n const entities = state.introductionEntities ?? [];\n const primaryNetworkId = (state.networkId ?? entities[0]?.networkId) as Id<'networks'> | undefined;\n const partyUserIds = [...new Set(entities.map((e) => e.userId).filter((id) => id !== state.userId))];\n\n if (!primaryNetworkId || partyUserIds.length < 1) {\n return {\n error: 'Introduction requires networkId and at least two entities (introducer + one counterpart).',\n };\n }\n\n if (state.requiredNetworkId && primaryNetworkId !== state.requiredNetworkId) {\n return {\n error: 'This chat is scoped to a different community. You can only introduce members of the current community.',\n };\n }\n\n const [introducerIsMember, introducerIsOwner] = await Promise.all([\n this.database.isNetworkMember(primaryNetworkId, state.userId),\n this.database.isIndexOwner(primaryNetworkId, state.userId),\n ]);\n if (!introducerIsMember && !introducerIsOwner) {\n return {\n error: 'One or more users are not members of the specified community. You can only introduce members who share a network.',\n };\n }\n const partyInScope = await Promise.all(\n partyUserIds.map(async (userId) => {\n const [isMember, isOwner] = await Promise.all([\n this.database.isNetworkMember(primaryNetworkId, userId),\n this.database.isIndexOwner(primaryNetworkId, userId),\n ]);\n return isMember || isOwner;\n }),\n );\n const allPartyMembers = partyInScope.every(Boolean);\n if (!allPartyMembers) {\n return {\n error: 'One or more users are not members of the specified community. You can only introduce members who share a network.',\n };\n }\n\n const exists = await this.database.opportunityExistsBetweenActors(partyUserIds, primaryNetworkId);\n if (exists) {\n return { error: 'An opportunity already exists between these people.' };\n }\n\n logger.verbose('[Graph:IntroValidation] Validation passed');\n return {};\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n logger.error('[Graph:IntroValidation] Failed', {\n userId: state.userId,\n networkId: state.networkId,\n error: err,\n });\n return {\n error: 'Introduction validation failed.',\n trace: [{\n node: \"intro_validation_fatal\",\n detail: `IntroValidation failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n };\n\n /**\n * Build fallback reasoning and actors when evaluator returns empty or throws.\n */\n function buildIntroFallback(\n entities: EvaluatorEntity[],\n state: typeof OpportunityGraphState.State,\n primaryNetworkId: Id<'networks'>,\n introducerName?: string\n ): { reasoning: string; score: number; actors: EvaluatedOpportunityActor[] } {\n const reasoning =\n `${introducerName ?? 'A member'} believes these people should connect.` +\n (state.introductionHint ? ` Context: ${state.introductionHint}` : '');\n const score = 70;\n const partyUserIds = entities.map((e) => e.userId).filter((id) => id !== state.userId);\n const actors: EvaluatedOpportunityActor[] = partyUserIds.map((uid) => ({\n userId: uid as Id<'users'>,\n role: 'peer' as const,\n networkId: primaryNetworkId,\n }));\n return { reasoning, score, actors };\n }\n\n /**\n * Node: intro_evaluation (create_introduction path)\n * Runs entity-bundle evaluator and sets evaluatedOpportunities (one) + introductionContext.\n */\n const introEvaluationNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.introEvaluation\", async () => {\n logger.verbose('[Graph:IntroEvaluation] Starting', { userId: state.userId });\n\n if (state.error) {\n return { evaluatedOpportunities: [], agentTimings: [] };\n }\n\n const entities = state.introductionEntities ?? [];\n const primaryNetworkId = (state.networkId ?? entities[0]?.networkId) as Id<'networks'> | undefined;\n if (!primaryNetworkId || entities.length < 2) {\n return { evaluatedOpportunities: [], error: 'Missing entities or network for introduction.', agentTimings: [] };\n }\n\n const agentTimingsAccum: DebugMetaAgent[] = [];\n let introducerName: string | undefined;\n let reasoning: string;\n let score: number;\n let actors: EvaluatedOpportunityActor[] = [];\n\n const _traceEmitterIntro = requestContext.getStore()?.traceEmitter;\n let _introEvalStarted = false;\n let _evalStart = Date.now();\n try {\n const introducerUser = await this.database.getUser(state.userId);\n introducerName = introducerUser?.name ?? undefined;\n const networkContexts = await buildNetworkContexts(entities, this.database);\n const input: EvaluatorInput = {\n discovererId: state.userId,\n entities,\n introductionMode: true,\n introducerName,\n introductionHint: state.introductionHint ?? undefined,\n networkContexts,\n };\n\n _evalStart = Date.now();\n _traceEmitterIntro?.({ type: \"agent_start\", name: \"intro-evaluator\" });\n _introEvalStarted = true;\n const evaluated = await (evaluatorAgent as OpportunityEvaluator).invokeEntityBundle(input, { minScore: 0 });\n const _introDuration = Date.now() - _evalStart;\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _introDuration });\n _traceEmitterIntro?.({ type: \"agent_end\", name: \"intro-evaluator\", durationMs: _introDuration, summary: \"Evaluated introduction\" });\n if (evaluated.length > 0) {\n const best = evaluated[0];\n reasoning = best.reasoning;\n score = best.score;\n actors = best.actors.map((a) => ({\n userId: a.userId as Id<'users'>,\n role: a.role,\n intentId: a.intentId ?? undefined,\n networkId: primaryNetworkId,\n }));\n } else {\n const fallback = buildIntroFallback(entities, state, primaryNetworkId, introducerName);\n reasoning = fallback.reasoning;\n score = fallback.score;\n actors = fallback.actors;\n }\n } catch (evalErr) {\n const errMsg = evalErr instanceof Error ? evalErr.message : String(evalErr);\n // Close the intro-evaluator span if it was started before the error\n if (_introEvalStarted) {\n const _introErrDuration = Date.now() - _evalStart;\n _traceEmitterIntro?.({ type: \"agent_end\", name: \"intro-evaluator\", durationMs: _introErrDuration, summary: `error — ${errMsg}` });\n agentTimingsAccum.push({ name: 'opportunity.evaluator', durationMs: _introErrDuration });\n }\n logger.warn('[Graph:IntroEvaluation] Evaluator or getUser failed, using fallback', { error: evalErr });\n const fallback = buildIntroFallback(entities, state, primaryNetworkId, introducerName);\n reasoning = fallback.reasoning;\n score = fallback.score;\n actors = fallback.actors;\n return {\n evaluatedOpportunities: [{ actors, score, reasoning }],\n introductionContext: { createdByName: introducerName },\n options: { ...state.options, initialStatus: state.options.initialStatus ?? 'latent' },\n agentTimings: agentTimingsAccum,\n trace: [{\n node: \"intro_evaluation_fatal\",\n detail: `IntroEvaluation failed (using fallback): ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n\n const evaluatedOpportunity: EvaluatedOpportunity = {\n actors,\n score,\n reasoning,\n };\n\n return {\n evaluatedOpportunities: [evaluatedOpportunity],\n introductionContext: { createdByName: introducerName },\n options: { ...state.options, initialStatus: state.options.initialStatus ?? 'latent' },\n agentTimings: agentTimingsAccum,\n };\n });\n };\n\n /**\n * Node 5: Persist\n * Creates opportunities from evaluator-proposed actors (networkId, userId, role, optional intent).\n */\n const persistNode = withNodeTrace(\n \"opportunity-persist\",\n async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.persist\", async () => {\n const startTime = Date.now();\n const initialStatus = resolveInitialStatus(state.trigger, state.options.initialStatus);\n logger.verbose('[Graph:Persist] Starting persistence (dedup-v2)', {\n opportunitiesToCreate: state.evaluatedOpportunities.length,\n trigger: state.trigger,\n initialStatus,\n });\n\n if (state.evaluatedOpportunities.length === 0) {\n logger.verbose('[Graph:Persist] No opportunities to persist');\n return { opportunities: [] };\n }\n\n try {\n const itemsToPersist: CreateOpportunityData[] = [];\n const reactivatedOpportunities: Opportunity[] = [];\n const existingBetweenActors: Array<{\n candidateUserId: Id<'users'>;\n networkId: Id<'networks'>;\n existingOpportunityId?: Id<'opportunities'>;\n existingStatus?: string;\n }> = [];\n const now = new Date().toISOString();\n // Only skip 'draft' (chat-only) opportunities during dedup.\n // 'latent' must NOT be skipped — background discovery creates latent opportunities,\n // and excluding them causes the same user pair to get duplicate opportunities\n // when multiple intents trigger separate discovery jobs (IND-166).\n const DEDUP_SKIP_STATUSES: Array<'draft'> = ['draft'];\n\n const introducerUserForOnBehalf = state.onBehalfOfUserId\n ? await this.database.getUser(state.userId)\n : null;\n\n // Orchestrator-only: collect already-accepted pairs so Task 7's\n // discover_opportunities tool can tell the LLM \"these pairs are\n // already connected, surface the existing chat rather than\n // creating a new draft\". Runs in parallel across unique\n // counterparties (a single evaluator pass can return multiple\n // opps per counterparty; we only hit the DB once per pair).\n // Failures are swallowed — the per-pair query is best-effort.\n const dedupAlreadyAccepted: Array<{ opportunityId: string; counterpartyUserId: string }> = [];\n if (state.trigger === 'orchestrator') {\n // Use the same viewer-resolution as evaluation/negotiate/persist\n // on-behalf branches so an introducer-driven orchestrator run\n // queries accepted opps between the *target* user and the\n // counterparty, not between the introducer and the counterparty.\n const dedupUserId = (state.onBehalfOfUserId ?? state.userId) as string;\n const uniqueCounterparts = new Set<string>();\n for (const evaluated of state.evaluatedOpportunities) {\n const candidateUserId = evaluated.actors.find(a => a.userId !== dedupUserId)?.userId;\n if (candidateUserId) uniqueCounterparts.add(candidateUserId);\n }\n const lookups = await Promise.all(\n [...uniqueCounterparts].map(async (counterpartyUserId) => {\n const accepted = await this.database\n .findOpportunitiesByActors([dedupUserId, counterpartyUserId], { includeIntroducers: true, statuses: ['accepted'] })\n .catch((err: unknown) => {\n logger.warn('[Graph:Persist] findOpportunitiesByActors (sibling-accept) failed', {\n userId: dedupUserId,\n counterpartyUserId,\n error: err,\n });\n return [] as Awaited<ReturnType<typeof this.database.findOpportunitiesByActors>>;\n });\n return accepted.map((opp: { id: string }) => ({ opportunityId: opp.id, counterpartyUserId }));\n }),\n );\n dedupAlreadyAccepted.push(...lookups.flat());\n }\n\n for (const evaluated of state.evaluatedOpportunities) {\n const indexIdForActors = state.networkId ?? evaluated.actors[0]?.networkId;\n let actors: OpportunityActor[];\n let data: CreateOpportunityData;\n\n logger.verbose('[Graph:Persist:PathSelect]', {\n isIntroduction: !!state.introductionContext,\n stateUserId: state.userId,\n stateIndexId: state.networkId,\n evaluatedActorUserIds: evaluated.actors.map(a => a.userId),\n });\n\n if (state.introductionContext) {\n if (indexIdForActors === undefined) {\n logger.warn('[Graph:Persist] Introduction path missing networkId; skipping opportunity', {\n userId: state.userId,\n actorsCount: evaluated.actors.length,\n });\n continue;\n }\n // Introduction path: manual detection, introducer actor, curator_judgment signal.\n const evaluatorActors: OpportunityActor[] = evaluated.actors.map((a: EvaluatedOpportunityActor) => ({\n networkId: a.networkId ?? indexIdForActors,\n userId: a.userId,\n role: a.role,\n ...(a.intentId ? { intent: a.intentId } : {}),\n }));\n const viewerAlreadyInActors = evaluatorActors.some(a => a.userId === state.userId);\n actors = viewerAlreadyInActors\n ? evaluatorActors\n : [\n ...evaluatorActors,\n { networkId: indexIdForActors, userId: state.userId, role: 'introducer' as const, approved: false },\n ];\n data = {\n detection: {\n source: 'manual',\n createdBy: state.userId,\n createdByName: state.introductionContext.createdByName,\n timestamp: now,\n },\n actors,\n interpretation: {\n category: 'collaboration',\n reasoning: evaluated.reasoning,\n confidence: evaluated.score / 100,\n signals: [\n {\n type: 'curator_judgment',\n weight: 1,\n detail: `Introduction by ${state.introductionContext.createdByName ?? 'a member'} via chat`,\n },\n ],\n },\n context: {\n networkId: state.networkId ?? indexIdForActors,\n ...(state.options.conversationId ? { conversationId: state.options.conversationId } : {}),\n },\n confidence: String(evaluated.score / 100),\n status: initialStatus,\n };\n } else if (state.onBehalfOfUserId) {\n if (indexIdForActors === undefined) {\n logger.warn('[Graph:Persist] Introducer discovery path missing networkId; skipping opportunity', {\n userId: state.userId,\n actorsCount: evaluated.actors.length,\n });\n continue;\n }\n // Introducer discovery path: introducer is state.userId, target is onBehalfOfUserId.\n const evaluatorActors: OpportunityActor[] = evaluated.actors.map((a: EvaluatedOpportunityActor) => ({\n networkId: a.networkId ?? indexIdForActors,\n userId: a.userId,\n role: a.role,\n ...(a.intentId ? { intent: a.intentId } : {}),\n }));\n const viewerAlreadyInActors = evaluatorActors.some(a => a.userId === state.userId);\n actors = viewerAlreadyInActors\n ? evaluatorActors\n : [\n ...evaluatorActors,\n { networkId: indexIdForActors!, userId: state.userId, role: 'introducer' as const, approved: false },\n ];\n\n const candidateUserId = evaluated.actors.find((a) => a.userId !== state.onBehalfOfUserId)?.userId;\n const overlapping = candidateUserId\n ? await this.database.findOpportunitiesByActors(\n [state.onBehalfOfUserId as Id<'users'>, candidateUserId as Id<'users'>],\n { excludeStatuses: DEDUP_SKIP_STATUSES },\n )\n : [];\n if (overlapping.length > 0) {\n const existing = overlapping[0];\n const isRecent = new Date(existing.createdAt).getTime() > Date.now() - DEDUP_WINDOW_MS;\n const sameIntroducer = existing.actors?.some(\n (actor) => actor.role === 'introducer' && actor.userId === state.userId,\n );\n\n if (existing.status === 'expired' || existing.status === 'stalled') {\n // Reactivate expired or stalled opportunities (only if same introducer for expired).\n // A different introducer creating for an expired pair falls through to new creation —\n // the prior expiry belongs to the original introducer, not this one.\n // Stalled opportunities are reactivated regardless of age: a stalled negotiation\n // is still in-flight for this pair, so we resume it rather than create a parallel one.\n if (existing.status === 'stalled' || sameIntroducer) {\n // Introduction path always targets 'draft' (chat-only surface) rather than using\n // initialStatus, because introductions are always chat-initiated, not background-discovered.\n const reactivated = await this.database.updateOpportunityStatus(existing.id, 'draft');\n if (reactivated) {\n logger.verbose('[Graph:Persist] Reactivated opportunity (introduction path)', {\n opportunityId: existing.id,\n candidateUserId,\n previousStatus: existing.status,\n });\n reactivatedOpportunities.push(reactivated);\n }\n continue;\n }\n } else if (existing.status === 'negotiating') {\n // Orphan heal (introduction path): same logic as discovery path\n const priorTask = await this.database.getNegotiationTaskForOpportunity(existing.id);\n if (priorTask) {\n const activeStates = ['submitted', 'working', 'input_required', 'waiting_for_agent', 'claimed'];\n const isFresh = (Date.now() - new Date(priorTask.updatedAt).getTime()) < 5 * 60 * 1000;\n if (activeStates.includes(priorTask.state) && isFresh) {\n existingBetweenActors.push({\n candidateUserId: candidateUserId as Id<'users'>,\n networkId: (state.networkId ?? indexIdForActors ?? '') as Id<'networks'>,\n existingOpportunityId: existing.id as Id<'opportunities'>,\n existingStatus: existing.status,\n });\n logger.verbose('[Graph:Persist] Skipping negotiating opportunity with active task (introduction path)', {\n opportunityId: existing.id,\n candidateUserId,\n taskState: priorTask.state,\n });\n continue;\n }\n }\n const reactivated = await this.database.updateOpportunityStatus(existing.id, 'draft');\n if (reactivated) {\n logger.info('[Graph:Persist] Resuming orphaned negotiating opportunity (introduction path)', {\n opportunityId: existing.id,\n candidateUserId,\n priorTaskState: priorTask?.state,\n });\n reactivatedOpportunities.push(reactivated);\n }\n continue;\n } else if (existing.status === 'latent') {\n // Upgrade latent to draft for introduction path\n const upgraded = await this.database.updateOpportunityStatus(existing.id, 'draft');\n if (upgraded) {\n logger.verbose('[Graph:Persist] Upgraded latent opportunity to draft (introduction path)', {\n opportunityId: existing.id,\n candidateUserId,\n });\n reactivatedOpportunities.push(upgraded);\n }\n continue;\n } else if (isRecent && candidateUserId) {\n // Time-gated skip: only skip if opportunity was created within DEDUP_WINDOW_MS\n existingBetweenActors.push({\n candidateUserId: candidateUserId as Id<'users'>,\n networkId: (state.networkId ?? indexIdForActors ?? '') as Id<'networks'>,\n existingOpportunityId: existing.id as Id<'opportunities'>,\n existingStatus: existing.status,\n });\n logger.verbose('[Graph:Persist] Skipping recent duplicate (introduction path)', {\n candidateUserId,\n existingStatus: existing.status,\n existingOpportunityId: existing.id,\n });\n continue;\n }\n // Else: existing opportunity is old enough, allow new opportunity creation\n logger.verbose('[Graph:Persist] Allowing new opportunity; existing is outside dedup window (introduction path)', {\n candidateUserId,\n existingStatus: existing.status,\n existingOpportunityId: existing.id,\n });\n }\n\n data = {\n detection: {\n source: INTRODUCER_DISCOVERY_SOURCE,\n createdBy: state.userId,\n createdByName: introducerUserForOnBehalf?.name ?? undefined,\n timestamp: now,\n },\n actors,\n interpretation: {\n category: 'collaboration',\n reasoning: evaluated.reasoning,\n confidence: evaluated.score / 100,\n signals: [{\n type: 'curator_judgment',\n weight: 1,\n detail: `Introducer discovery for ${introducerUserForOnBehalf?.name ?? 'a member'} via background maintenance`,\n }],\n },\n context: {\n networkId: state.networkId ?? indexIdForActors,\n ...(state.options.conversationId ? { conversationId: state.options.conversationId } : {}),\n },\n confidence: String(evaluated.score / 100),\n status: initialStatus,\n };\n } else {\n // Discovery path: opportunity_graph source, no introducer, lifecycle guard for agent/patient.\n\n // Build premise lookup from discovery candidates for premise tracking.\n // When multiple premise candidates exist for the same user, keep the highest-similarity one.\n const premiseLookup = new Map<string, { premiseId: string; similarity: number }>();\n for (const c of state.candidates ?? []) {\n if (c.candidatePremiseId) {\n const existing = premiseLookup.get(c.candidateUserId);\n if (!existing || c.similarity > existing.similarity) {\n premiseLookup.set(c.candidateUserId, { premiseId: c.candidatePremiseId, similarity: c.similarity });\n }\n }\n }\n\n const evaluatorActors: OpportunityActor[] = evaluated.actors.map((a: EvaluatedOpportunityActor) => ({\n networkId: a.networkId ?? indexIdForActors,\n userId: a.userId,\n role: a.role,\n ...(a.intentId ? { intent: a.intentId } : {}),\n ...(premiseLookup.has(a.userId) ? { premise: premiseLookup.get(a.userId)!.premiseId as Id<'premises'> } : {}),\n }));\n actors = evaluatorActors;\n\n const hasIntroducerActor = actors.some(a => a.role === 'introducer');\n if (!hasIntroducerActor) {\n const discovererIdx = actors.findIndex(a => a.userId === state.userId);\n if (discovererIdx >= 0 && actors[discovererIdx].role === 'agent') {\n const counterpartIdx = actors.findIndex(\n (a, i) => i !== discovererIdx && a.role === 'patient'\n );\n actors[discovererIdx] = { ...actors[discovererIdx], role: 'patient' };\n if (counterpartIdx >= 0) {\n actors[counterpartIdx] = { ...actors[counterpartIdx], role: 'agent' };\n }\n logger.verbose('[Graph:Persist] Swapped discoverer from agent to patient for lifecycle visibility', {\n discovererId: state.userId,\n });\n }\n }\n\n // Index-agnostic dedup: find ANY existing opportunity between these users,\n // regardless of which index it was created in or whether context.networkId is set.\n const candidateUserId = evaluated.actors.find((a) => a.userId !== state.userId)?.userId;\n logger.verbose('[Graph:Persist:Dedup] Checking overlapping opportunities', {\n stateUserId: state.userId,\n candidateUserId: candidateUserId ?? 'NONE',\n evaluatedActors: evaluated.actors.map(a => ({ userId: a.userId, role: a.role })),\n });\n const overlapping = candidateUserId\n ? await this.database.findOpportunitiesByActors(\n [state.userId as Id<'users'>, candidateUserId as Id<'users'>],\n { excludeStatuses: DEDUP_SKIP_STATUSES },\n )\n : [];\n logger.verbose('[Graph:Persist:Dedup] findOpportunitiesByActors result', {\n count: overlapping.length,\n results: overlapping.map(o => ({ id: o.id, status: o.status, actors: o.actors?.map((a: OpportunityActor) => ({ userId: a.userId, role: a.role })) })),\n });\n\n if (overlapping.length > 0) {\n const existing = overlapping[0];\n const existingIndexId = (existing.context?.networkId ?? state.networkId ?? state.userNetworks?.[0] ?? '') as Id<'networks'>;\n const isRecent = new Date(existing.createdAt).getTime() > Date.now() - DEDUP_WINDOW_MS;\n\n if (existing.status === 'expired' || existing.status === 'stalled') {\n // Reactivate expired or stalled opportunities.\n // Stalled opportunities are reactivated regardless of age: a stalled negotiation\n // is still in-flight for this pair, so we resume it rather than create a parallel one.\n const reactivated = await this.database.updateOpportunityStatus(existing.id, initialStatus);\n if (reactivated) {\n logger.verbose('[Graph:Persist] Reactivated opportunity', {\n opportunityId: existing.id,\n candidateUserId,\n previousStatus: existing.status,\n newStatus: initialStatus,\n });\n reactivatedOpportunities.push(reactivated);\n }\n continue;\n } else if (existing.status === 'negotiating') {\n // Orphan heal: if a prior opportunity is stuck in 'negotiating' with a stale task,\n // reactivate it so the new discovery run can reuse it instead of creating a duplicate.\n const priorTask = await this.database.getNegotiationTaskForOpportunity(existing.id);\n if (priorTask) {\n const activeStates = ['submitted', 'working', 'input_required', 'waiting_for_agent', 'claimed'];\n const isFresh = (Date.now() - new Date(priorTask.updatedAt).getTime()) < 5 * 60 * 1000;\n if (activeStates.includes(priorTask.state) && isFresh) {\n // Still active — skip (lock gate in init node will handle)\n existingBetweenActors.push({\n candidateUserId: candidateUserId as Id<'users'>,\n networkId: existingIndexId,\n existingOpportunityId: existing.id as Id<'opportunities'>,\n existingStatus: existing.status,\n });\n logger.verbose('[Graph:Persist] Skipping negotiating opportunity with active task', {\n opportunityId: existing.id,\n candidateUserId,\n taskState: priorTask.state,\n });\n continue;\n }\n }\n // Task is stale or missing — reactivate the orphaned negotiating opportunity\n const reactivated = await this.database.updateOpportunityStatus(existing.id, initialStatus);\n if (reactivated) {\n logger.info('[Graph:Persist] Resuming orphaned negotiating opportunity', {\n opportunityId: existing.id,\n candidateUserId,\n priorTaskState: priorTask?.state,\n });\n reactivatedOpportunities.push(reactivated);\n }\n continue;\n } else if (existing.status === 'latent' && initialStatus !== 'latent') {\n // Upgrade latent (background-discovered) to the higher-priority status (e.g. pending)\n const upgraded = await this.database.updateOpportunityStatus(existing.id, initialStatus);\n if (upgraded) {\n logger.verbose('[Graph:Persist] Upgraded latent opportunity to higher-priority status', {\n opportunityId: existing.id,\n candidateUserId,\n previousStatus: 'latent',\n newStatus: initialStatus,\n });\n reactivatedOpportunities.push(upgraded);\n }\n continue;\n } else if (isRecent && candidateUserId) {\n // Time-gated skip: only skip if opportunity was created within DEDUP_WINDOW_MS\n // This prevents parallel job duplicates while allowing new discoveries for long-connected pairs\n existingBetweenActors.push({\n candidateUserId: candidateUserId as Id<'users'>,\n networkId: existingIndexId,\n existingOpportunityId: existing.id as Id<'opportunities'>,\n existingStatus: existing.status,\n });\n logger.verbose('[Graph:Persist] Skipping recent duplicate; opportunity created within dedup window', {\n candidateUserId,\n existingStatus: existing.status,\n existingOpportunityId: existing.id,\n createdAt: existing.createdAt,\n });\n continue;\n }\n // Else: existing opportunity is old enough (>10 min), allow new opportunity creation\n logger.verbose('[Graph:Persist] Allowing new opportunity; existing is outside dedup window', {\n candidateUserId,\n existingStatus: existing.status,\n existingOpportunityId: existing.id,\n createdAt: existing.createdAt,\n });\n }\n\n data = {\n detection: {\n source: 'opportunity_graph',\n createdBy: 'agent-opportunity-finder',\n ...(state.discoverySource === 'intent' && state.resolvedTriggerIntentId\n ? { triggeredBy: state.resolvedTriggerIntentId }\n : {}),\n timestamp: now,\n },\n actors,\n interpretation: {\n category: 'collaboration',\n reasoning: evaluated.reasoning,\n confidence: evaluated.score / 100,\n signals: [\n {\n type: evaluated.actors.some((a) => a.intentId) ? 'intent_match' : 'profile_match',\n weight: evaluated.score / 100,\n detail: 'Entity-bundle evaluator',\n },\n ],\n },\n context: {\n ...(state.networkId ? { networkId: state.networkId } : {}),\n ...(state.options.conversationId ? { conversationId: state.options.conversationId } : {}),\n },\n confidence: String(evaluated.score / 100),\n status: initialStatus,\n metadata: {\n evidence: evaluated.evidence ?? [],\n },\n };\n }\n\n try {\n validateOpportunityActors(data.actors);\n } catch (err) {\n logger.warn('[Graph:Persist] Skipping opportunity with invalid actors', {\n error: err instanceof Error ? err.message : String(err),\n opportunityReasoning: evaluated.reasoning?.slice(0, 80),\n });\n continue;\n }\n\n itemsToPersist.push(data);\n }\n\n const { created: createdList } = await persistOpportunities({\n database: this.database,\n embedder: this.embedder,\n items: itemsToPersist,\n });\n\n const allOpportunities = [...reactivatedOpportunities, ...createdList];\n\n logger.verbose('[Graph:Persist] Persistence complete', {\n created: createdList.length,\n reactivated: reactivatedOpportunities.length,\n existingBetweenActorsCount: existingBetweenActors.length,\n status: initialStatus,\n });\n return {\n opportunities: allOpportunities,\n existingBetweenActors,\n dedupAlreadyAccepted,\n trace: [{\n node: \"persist\",\n detail: `Created ${createdList.length}, reactivated ${reactivatedOpportunities.length}, ${existingBetweenActors.length} existing skipped, ${dedupAlreadyAccepted.length} already-accepted pair(s)`,\n data: {\n created: createdList.length,\n reactivated: reactivatedOpportunities.length,\n existingSkipped: existingBetweenActors.length,\n alreadyAccepted: dedupAlreadyAccepted.length,\n totalOutput: allOpportunities.length,\n durationMs: Date.now() - startTime,\n },\n }],\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n logger.error('[Graph:Persist] Failed', { error });\n return {\n opportunities: [],\n existingBetweenActors: [],\n error: 'Failed to persist opportunities.',\n trace: [{\n node: \"persist_fatal\",\n detail: `Persist failed: ${errMsg}`,\n data: { error: errMsg },\n }],\n };\n }\n });\n },\n (result) => {\n const r = result as Record<string, unknown>;\n if (r?.error) return `error: ${r.error}`;\n const opps = r?.opportunities as unknown[];\n return opps ? `Persisted ${opps.length} opportunity(ies)` : undefined;\n },\n );\n\n // ═══════════════════════════════════════════════════════════════\n // CRUD NODES (read, update, delete, send)\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * Read Node: List opportunities for the user, optionally filtered by networkId.\n * Fast path — no LLM calls.\n */\n const readNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.read\", async () => {\n logger.verbose('[Graph:Read] Listing opportunities', {\n userId: state.userId,\n networkId: state.networkId,\n });\n\n try {\n let indexIdFilter: string | undefined;\n if (state.networkId) {\n const [isMember, isOwner] = await Promise.all([\n this.database.isNetworkMember(state.networkId, state.userId),\n this.database.isIndexOwner(state.networkId, state.userId),\n ]);\n if (!isMember && !isOwner) {\n return {\n readResult: { count: 0, opportunities: [], message: 'Network not found or you are not a member.' },\n };\n }\n indexIdFilter = state.networkId;\n }\n\n const rawList = await this.database.getOpportunitiesForUser(state.userId, {\n limit: 30,\n ...(indexIdFilter ? { networkId: indexIdFilter } : {}),\n });\n const list = rawList.filter((opp) => opp.status !== 'expired');\n\n if (list.length === 0) {\n return {\n readResult: {\n count: 0,\n message: 'You have no opportunities yet. Use discover_opportunities to search for connections.',\n opportunities: [],\n },\n };\n }\n\n // Dedupe by counterpart set (same people = one row) so chat does not show \"You and X\" per index\n const counterpartKey = (opp: (typeof list)[number]) =>\n opp.actors\n .filter((a: OpportunityActor) => a.userId !== state.userId && a.role !== 'introducer')\n .map((a: OpportunityActor) => a.userId)\n .sort()\n .join(',');\n const byKey = new Map<string, (typeof list)[number]>();\n for (const opp of list) {\n const key = counterpartKey(opp);\n const existing = byKey.get(key);\n const conf = Number(opp.interpretation?.confidence ?? opp.confidence ?? 0);\n const existingConf = existing ? Number(existing.interpretation?.confidence ?? existing.confidence ?? 0) : 0;\n const oppTime = opp.updatedAt instanceof Date ? opp.updatedAt.getTime() : new Date(opp.updatedAt).getTime();\n const existingTime = existing\n ? (existing.updatedAt instanceof Date ? existing.updatedAt.getTime() : new Date(existing.updatedAt).getTime())\n : 0;\n if (!existing || conf > existingConf || (conf === existingConf && oppTime > existingTime)) {\n byKey.set(key, opp);\n }\n }\n const dedupedList = [...byKey.values()];\n\n const sourceLabel: Record<string, string> = {\n chat: 'Suggested in chat',\n opportunity_graph: 'System match',\n manual: 'Manual',\n cron: 'Scheduled',\n member_added: 'Member added',\n introducer_discovery: 'Suggested by contact',\n };\n\n const enriched = await Promise.all(\n dedupedList.map(async (opp) => {\n // \"Other parties\" = all actors who are not the current user (exclude introducer for suggestedBy).\n // Opportunity graph persists roles as 'agent'|'patient'|'peer'; manual/createManual use 'party'.\n const otherParties = opp.actors.filter((a: OpportunityActor) => a.userId !== state.userId && a.role !== 'introducer');\n const introducer = opp.actors.find((a: OpportunityActor) => a.role === 'introducer');\n const partyIds = otherParties.map((a: OpportunityActor) => a.userId);\n const idsToResolve = introducer ? [...partyIds, introducer.userId] : partyIds;\n // Use the counterpart's (non-viewer) networkId — it reflects where the match was found.\n // actors[0] is typically the viewer with an arbitrary first-target-index value.\n const counterpartActor = opp.actors.find((a: OpportunityActor) => a.userId !== state.userId);\n const actorIndexId = counterpartActor?.networkId ?? opp.actors[0]?.networkId;\n const [indexRecord, ...profileAndUserPairs] = await Promise.all([\n actorIndexId ? this.database.getNetwork(actorIndexId) : Promise.resolve(null),\n ...idsToResolve.map(async (uid: string) => {\n const [profile, user] = await Promise.all([\n this.database.getProfile(uid),\n this.database.getUser(uid),\n ]);\n return (profile?.identity?.name ?? user?.name ?? 'Unknown') as string;\n }),\n ]);\n const connectedWith = profileAndUserPairs.slice(0, partyIds.length);\n const suggestedBy = introducer ? profileAndUserPairs[partyIds.length] ?? null : null;\n const category = opp.interpretation?.category ?? 'connection';\n const confidence = opp.interpretation?.confidence ?? (opp.confidence ? Number(opp.confidence) : null);\n const source = opp.detection?.source ? (sourceLabel[opp.detection.source] ?? opp.detection.source) : null;\n return {\n id: opp.id,\n indexName: indexRecord?.title ?? (actorIndexId ?? ''),\n connectedWith,\n suggestedBy,\n reasoning: opp.interpretation?.reasoning ?? 'Connection opportunity',\n status: opp.status,\n category,\n confidence: confidence != null ? confidence : null,\n source,\n };\n })\n );\n\n return {\n readResult: {\n count: enriched.length,\n message: `You have ${enriched.length} opportunity(ies).`,\n opportunities: enriched,\n },\n };\n } catch (err) {\n logger.error('[Graph:Read] Failed', { error: err });\n return {\n readResult: { count: 0, opportunities: [], message: 'Failed to list opportunities.' },\n };\n }\n });\n };\n\n /**\n * Update Node: Change opportunity status (accept, reject, etc.).\n * For 'accepted', enforces the self-accept guard: the caller's actor entry\n * must not already have `actedAt` set — i.e. the caller has not yet been\n * the one to advance this opportunity's state. Stamps `actedAt` on accept\n * atomically with the status change via `stampOpportunityActorAction`.\n */\n const updateNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.update\", async () => {\n logger.verbose('[Graph:Update] Updating opportunity status', {\n userId: state.userId,\n opportunityId: state.opportunityId,\n newStatus: state.newStatus,\n });\n\n try {\n if (!state.opportunityId) {\n return { mutationResult: { success: false, error: 'opportunityId is required.' } };\n }\n if (!state.newStatus || !['accepted', 'rejected', 'expired'].includes(state.newStatus)) {\n return { mutationResult: { success: false, error: 'newStatus must be one of: accepted, rejected, expired.' } };\n }\n\n const opp = await this.database.getOpportunity(state.opportunityId);\n if (!opp) {\n return { mutationResult: { success: false, error: 'Opportunity not found.' } };\n }\n const callerActor = opp.actors.find((a: OpportunityActor) => a.userId === state.userId);\n if (!callerActor) {\n return { mutationResult: { success: false, error: 'You are not part of this opportunity.' } };\n }\n\n // Self-accept guard: only applies to the 'accepted' transition. Reject/expire\n // remain available to all actors regardless of prior actedAt.\n if (state.newStatus === 'accepted' && callerActor.actedAt) {\n return {\n mutationResult: {\n success: false,\n error: 'You have already acted on this opportunity. The other party must accept.',\n },\n };\n }\n\n let conversationId: string | undefined;\n if (state.newStatus === 'accepted') {\n const counterpart = opp.actors.find(\n (a: OpportunityActor) => a.userId !== state.userId && a.role !== 'introducer'\n );\n if (counterpart) {\n const dm = await this.database.getOrCreateDM(state.userId, counterpart.userId);\n conversationId = dm.id;\n }\n }\n\n if (state.newStatus === 'accepted') {\n await this.database.stampOpportunityActorAction(\n state.opportunityId,\n state.userId,\n 'accepted',\n state.userId,\n );\n } else {\n // Reject/expire do not stamp actedAt on the caller; they are\n // terminal flips, not commit signals. Keep the legacy path.\n await this.database.updateOpportunityStatus(\n state.opportunityId,\n state.newStatus as 'rejected' | 'expired',\n );\n }\n\n return {\n mutationResult: {\n success: true,\n opportunityId: state.opportunityId,\n message: `Opportunity status updated to ${state.newStatus}.`,\n ...(conversationId && { conversationId }),\n },\n };\n } catch (err) {\n logger.error('[Graph:Update] Failed', { error: err });\n return { mutationResult: { success: false, error: 'Failed to update opportunity.' } };\n }\n });\n };\n\n /**\n * Delete Node: Expire/archive an opportunity.\n */\n const deleteNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.delete\", async () => {\n logger.verbose('[Graph:Delete] Expiring opportunity', {\n userId: state.userId,\n opportunityId: state.opportunityId,\n });\n\n try {\n if (!state.opportunityId) {\n return { mutationResult: { success: false, error: 'opportunityId is required.' } };\n }\n\n const opp = await this.database.getOpportunity(state.opportunityId);\n if (!opp) {\n return { mutationResult: { success: false, error: 'Opportunity not found.' } };\n }\n const isActor = opp.actors.some((a: OpportunityActor) => a.userId === state.userId);\n if (!isActor) {\n return { mutationResult: { success: false, error: 'You are not part of this opportunity.' } };\n }\n\n await this.database.updateOpportunityStatus(state.opportunityId, 'expired');\n\n return {\n mutationResult: {\n success: true,\n opportunityId: state.opportunityId,\n message: 'Opportunity archived (expired).',\n },\n };\n } catch (err) {\n logger.error('[Graph:Delete] Failed', { error: err });\n return { mutationResult: { success: false, error: 'Failed to delete opportunity.' } };\n }\n });\n };\n\n /**\n * Send Node: Promote latent or draft opportunity to pending + queue notification.\n */\n const sendNode = async (state: typeof OpportunityGraphState.State) => {\n return timed(\"OpportunityGraph.send\", async () => {\n logger.verbose('[Graph:Send] Sending opportunity', {\n userId: state.userId,\n opportunityId: state.opportunityId,\n });\n\n try {\n if (!state.opportunityId) {\n return { mutationResult: { success: false, error: 'opportunityId is required.' } };\n }\n\n const opp = await this.database.getOpportunity(state.opportunityId);\n if (!opp) {\n return { mutationResult: { success: false, error: 'Opportunity not found.' } };\n }\n const canSendStatus = opp.status === 'latent' || opp.status === 'draft';\n if (!canSendStatus) {\n return {\n mutationResult: {\n success: false,\n error: `Opportunity is already ${opp.status}; only latent or draft opportunities can be sent.`,\n },\n };\n }\n const senderActor = opp.actors.find((a: OpportunityActor) => a.userId === state.userId);\n const hasIntroducer = opp.actors.some((a: OpportunityActor) => a.role === 'introducer');\n const canSend =\n senderActor?.role === 'introducer' ||\n senderActor?.role === 'peer' ||\n (senderActor?.role === 'patient' && !hasIntroducer) ||\n (senderActor?.role === 'party' && !hasIntroducer);\n if (!senderActor) {\n return { mutationResult: { success: false, error: 'You are not part of this opportunity.' } };\n }\n if (!canSend) {\n return { mutationResult: { success: false, error: 'You cannot send this opportunity.' } };\n }\n\n await this.database.stampOpportunityActorAction(\n state.opportunityId,\n state.userId,\n 'pending',\n );\n\n // Notify only the role that becomes visible at the next tier\n let recipients: OpportunityActor[];\n if (senderActor.role === 'introducer') {\n recipients = opp.actors.filter((a: OpportunityActor) => a.role === 'patient' || a.role === 'party');\n } else if (senderActor.role === 'peer') {\n recipients = opp.actors.filter((a: OpportunityActor) => a.role === 'peer' && a.userId !== state.userId);\n } else {\n recipients = opp.actors.filter((a: OpportunityActor) => a.role === 'agent');\n }\n\n // queueNotification is injected via constructor; if not provided, notifications are skipped.\n const notifier: QueueOpportunityNotificationFn | undefined = this.queueNotification;\n if (notifier) {\n for (const recipient of recipients) {\n await notifier(opp.id, recipient.userId, 'high');\n }\n }\n\n const recipientIds = recipients.map((a: OpportunityActor) => a.userId);\n return {\n mutationResult: {\n success: true,\n opportunityId: opp.id,\n notified: recipientIds,\n message: 'Opportunity sent. The other person has been notified.',\n },\n };\n } catch (err) {\n logger.error('[Graph:Send] Failed', { error: err });\n return { mutationResult: { success: false, error: 'Failed to send opportunity.' } };\n }\n });\n };\n\n /**\n * Negotiate Existing Node: Load an existing opportunity by ID and run bilateral negotiation.\n * Used after introducer approval to trigger the normal negotiation flow for a latent opportunity.\n */\n const negotiateExistingNode = async (state: typeof OpportunityGraphState.State) => {\n if (!state.opportunityId) return {};\n if (!this.negotiationGraph) {\n logger.warn('[Graph:NegotiateExisting] No negotiationGraph wired; skipping', {\n opportunityId: state.opportunityId,\n });\n return {};\n }\n\n try {\n const opp = await this.database.getOpportunity(state.opportunityId as string);\n if (!opp) {\n logger.warn('[Graph:NegotiateExisting] Opportunity not found', { opportunityId: state.opportunityId });\n return {};\n }\n\n const actors = opp.actors as OpportunityActor[];\n const nonIntroducerActors = actors.filter(a => a.role !== 'introducer');\n\n // Find the sourceActor: non-introducer with role patient or party, fallback to first non-introducer\n const sourceActor = nonIntroducerActors.find(a => a.role === 'patient' || a.role === 'party')\n ?? nonIntroducerActors[0];\n if (!sourceActor) {\n logger.warn('[Graph:NegotiateExisting] No source actor found', { opportunityId: state.opportunityId });\n return {};\n }\n\n // Find the candidateActor: non-introducer that is NOT the sourceActor\n const candidateActor = nonIntroducerActors.find(a => a.userId !== sourceActor.userId);\n if (!candidateActor) {\n logger.warn('[Graph:NegotiateExisting] No candidate actor found', { opportunityId: state.opportunityId });\n return {};\n }\n\n // Load user data for both actors in parallel\n const [sourceUserAccount, sourceProfile, sourceIntents, candidateAccount, candidateProfile, candidateIntents] =\n await Promise.all([\n this.database.getUser(sourceActor.userId).catch(() => null),\n this.database.getProfile(sourceActor.userId).catch(() => null),\n this.database.getActiveIntents(sourceActor.userId).catch(() => [] as ActiveIntent[]),\n this.database.getUser(candidateActor.userId).catch(() => null),\n this.database.getProfile(candidateActor.userId).catch(() => null),\n this.database.getActiveIntents(candidateActor.userId).catch(() => [] as ActiveIntent[]),\n ]);\n\n const toNegIntent = (ai: ActiveIntent) => ({\n id: ai.id as string,\n title: ai.summary ?? '',\n description: ai.payload ?? '',\n confidence: 1,\n });\n\n const sourceUser = {\n id: sourceActor.userId,\n intents: sourceIntents.slice(0, 5).map(toNegIntent),\n profile: {\n name: sourceProfile?.identity?.name ?? sourceUserAccount?.name,\n bio: sourceProfile?.identity?.bio ?? sourceUserAccount?.intro ?? undefined,\n location: sourceProfile?.identity?.location ?? sourceUserAccount?.location ?? undefined,\n skills: sourceProfile?.attributes?.skills,\n interests: sourceProfile?.attributes?.interests,\n },\n };\n\n const candidateIntentsForNeg = candidateIntents.slice(0, 5).map(toNegIntent);\n\n const candidate: NegotiationCandidate = {\n userId: candidateActor.userId,\n opportunityId: opp.id as string,\n reasoning: (opp.interpretation as { reasoning?: string } | null)?.reasoning ?? '',\n valencyRole: candidateActor.role ?? 'peer',\n networkId: (candidateActor as { networkId?: string }).networkId as string,\n candidateUser: {\n id: candidateActor.userId,\n intents: candidateIntentsForNeg,\n profile: {\n name: candidateProfile?.identity?.name ?? candidateAccount?.name,\n bio: candidateProfile?.identity?.bio ?? candidateAccount?.intro ?? undefined,\n location: candidateProfile?.identity?.location ?? candidateAccount?.location ?? undefined,\n skills: candidateProfile?.attributes?.skills,\n interests: candidateProfile?.attributes?.interests,\n },\n },\n };\n\n // Load index context for the candidate's network\n const indexContextMap = new Map<string, string>();\n if (candidate.networkId) {\n const ctx = await this.database.getNetworkMemberContext(candidate.networkId, sourceActor.userId).catch(() => null);\n const prompt = [ctx?.indexPrompt, ctx?.memberPrompt]\n .filter((v): v is string => !!v?.trim())\n .join('\\n\\n');\n if (prompt) indexContextMap.set(candidate.networkId, prompt);\n }\n\n const acceptedResults = await negotiateCandidates(\n this.negotiationGraph, sourceUser, [candidate],\n { networkId: '', prompt: '' },\n {\n maxTurns: Number(process.env.NEGOTIATION_MAX_TURNS_AMBIENT) || 6,\n indexContextOverrides: indexContextMap,\n timeoutMs: AMBIENT_PARK_WINDOW_MS,\n trigger: 'ambient',\n },\n );\n\n // Send notifications to non-introducer actors if negotiation was accepted\n if (acceptedResults.length > 0 && this.queueNotification) {\n for (const actor of nonIntroducerActors) {\n await this.queueNotification(opp.id, actor.userId, 'high').catch((err) => {\n logger.warn('[Graph:NegotiateExisting] Failed to queue notification', { actorId: actor.userId, error: err });\n });\n }\n }\n\n logger.info('[Graph:NegotiateExisting] Negotiation complete', {\n opportunityId: opp.id,\n accepted: acceptedResults.length > 0,\n });\n } catch (err) {\n logger.error('[Graph:NegotiateExisting] Failed', { opportunityId: state.opportunityId, error: err });\n return { error: `Failed to load opportunity: ${err instanceof Error ? err.message : String(err)}` };\n }\n\n return {};\n };\n\n /**\n * Node: Approve Introduction\n * Called by the introducer to approve a latent introducer-pattern opportunity.\n * Sets approved=true on the introducer actor (status stays latent), then\n * enqueues a negotiate_existing job so the parties negotiate normally.\n */\n const approveIntroductionNode = async (state: typeof OpportunityGraphState.State) => {\n const { opportunityId, userId } = state;\n if (!opportunityId) {\n return { mutationResult: { success: false, error: 'opportunityId required for approve_introduction' } };\n }\n\n let opp;\n try {\n opp = await this.database.getOpportunity(opportunityId as string);\n } catch (err) {\n return { mutationResult: { success: false, error: `Failed to load opportunity: ${err instanceof Error ? err.message : String(err)}` } };\n }\n if (!opp) {\n return { mutationResult: { success: false, error: 'Opportunity not found' } };\n }\n\n const introducerActor = (opp.actors as OpportunityActor[])\n .find(a => a.role === 'introducer' && a.userId === userId);\n if (!introducerActor) {\n return { mutationResult: { success: false, error: 'You are not the introducer for this opportunity' } };\n }\n if (introducerActor.approved === true) {\n return { mutationResult: { success: false, error: 'Introduction already approved' } };\n }\n\n const updated = await this.database.updateOpportunityActorApproval(opportunityId as string, userId as string, true);\n if (!updated) {\n return { mutationResult: { success: false, error: 'Failed to update approval' } };\n }\n\n if (this.queueNegotiateExisting) {\n await this.queueNegotiateExisting(opportunityId as string, userId as string);\n }\n\n return { mutationResult: { success: true, opportunityId } };\n };\n\n // ═══════════════════════════════════════════════════════════════\n // CONDITIONAL ROUTING FUNCTIONS\n // ═══════════════════════════════════════════════════════════════\n\n /**\n * Router: Decides which path based on operationMode.\n */\n const routeByMode = (state: typeof OpportunityGraphState.State): string => {\n const mode = state.operationMode ?? 'create';\n if (mode === 'read') return 'read';\n if (mode === 'update') return 'update';\n if (mode === 'delete') return 'delete_opp';\n if (mode === 'send') return 'send';\n if (mode === 'create_introduction') return 'intro_validation';\n if (mode === 'negotiate_existing') return 'negotiate_existing';\n if (mode === 'approve_introduction') return 'approve_introduction';\n // 'create' is the default discovery pipeline\n return 'prep';\n };\n\n /**\n * After prep: check if user has indexed intents.\n * Early exit if none (cannot find opportunities).\n */\n const shouldContinueAfterPrep = (state: typeof OpportunityGraphState.State): string => {\n if (state.error) {\n logger.verbose('[Graph:Routing] Error in prep - ending early');\n return END;\n }\n // Continuation mode: skip scope/resolve/discovery, go straight to evaluation\n if (state.operationMode === 'continue_discovery') {\n logger.verbose('[Graph:Routing] Continue discovery → skipping to evaluation', {\n candidatesLoaded: state.candidates.length,\n });\n return 'evaluation';\n }\n logger.verbose('[Graph:Routing] Continuing to scope');\n return 'scope';\n };\n\n /**\n * After scope: check if we have target indexes.\n */\n const shouldContinueAfterScope = (state: typeof OpportunityGraphState.State): string => {\n if (state.error || state.targetNetworks.length === 0) {\n logger.verbose('[Graph:Routing] No target indexes - ending early');\n return END;\n }\n logger.verbose('[Graph:Routing] Continuing to resolve');\n return 'resolve';\n };\n\n /**\n * After discovery: if create-intent signal was set, end so tool can return it; else continue to evaluation.\n */\n const shouldContinueAfterDiscovery = (state: typeof OpportunityGraphState.State): string => {\n if (state.createIntentSuggested) {\n logger.verbose('[Graph:Routing] Create-intent suggested - ending for tool signal');\n return END;\n }\n return 'evaluation';\n };\n\n /**\n * After intro_validation: if validation set state.error, end early; else continue to intro_evaluation.\n */\n const routeAfterIntroValidation = (state: typeof OpportunityGraphState.State): string => {\n if (state.error) {\n logger.verbose('[Graph:Routing] Intro validation error - ending early');\n return END;\n }\n return 'intro_evaluation';\n };\n\n // ═══════════════════════════════════════════════════════════════\n // GRAPH ASSEMBLY\n // ═══════════════════════════════════════════════════════════════\n\n const workflow = new StateGraph(OpportunityGraphState)\n // Add all nodes\n .addNode('prep', prepNode)\n .addNode('scope', scopeNode)\n .addNode('resolve', resolveNode)\n .addNode('discovery', discoveryNode)\n .addNode('evaluation', evaluationNode)\n .addNode('ranking', rankingNode)\n .addNode('intro_validation', introValidationNode)\n .addNode('intro_evaluation', introEvaluationNode)\n .addNode('persist', persistNode)\n // CRUD nodes\n .addNode('read', readNode)\n .addNode('update', updateNode)\n .addNode('delete_opp', deleteNode)\n .addNode('send', sendNode)\n .addNode('negotiate_existing', negotiateExistingNode)\n .addNode('approve_introduction', approveIntroductionNode)\n\n // Route by operation mode from START\n .addConditionalEdges(START, routeByMode, {\n prep: 'prep',\n intro_validation: 'intro_validation',\n read: 'read',\n update: 'update',\n delete_opp: 'delete_opp',\n send: 'send',\n negotiate_existing: 'negotiate_existing',\n approve_introduction: 'approve_introduction',\n })\n\n // Introduction path: validation -> evaluation -> persist (or END on validation error)\n .addConditionalEdges('intro_validation', routeAfterIntroValidation, {\n intro_evaluation: 'intro_evaluation',\n [END]: END,\n })\n .addEdge('intro_evaluation', 'persist')\n\n // CRUD fast paths -> END\n .addEdge('read', END)\n .addEdge('update', END)\n .addEdge('delete_opp', END)\n .addEdge('send', END)\n .addEdge('negotiate_existing', END)\n .addEdge('approve_introduction', END)\n\n // Conditional routing: early exit if no indexed intents\n .addConditionalEdges('prep', shouldContinueAfterPrep, {\n scope: 'scope',\n evaluation: 'evaluation',\n [END]: END,\n })\n\n // Conditional routing: early exit if no target indexes\n .addConditionalEdges('scope', shouldContinueAfterScope, {\n resolve: 'resolve',\n [END]: END,\n })\n .addEdge('resolve', 'discovery')\n\n .addConditionalEdges('discovery', shouldContinueAfterDiscovery, {\n evaluation: 'evaluation',\n [END]: END,\n })\n\n // Discovery → Ranking → Persist → Negotiate (post-persist).\n // Negotiation runs against persisted opportunities so each negotiation receives the\n // opportunity's id and its outcome flips status (pending|stalled|rejected) via the\n // negotiation graph's finalize node. Skipped for continue_discovery and when no\n // negotiation graph or no opportunities were persisted (negotiateNode returns early).\n .addNode('negotiate', negotiateNode)\n .addEdge('evaluation', 'ranking')\n .addEdge('ranking', 'persist')\n .addConditionalEdges('persist', (state) => {\n if (state.operationMode === 'continue_discovery') return END;\n if (!this.negotiationGraph) return END;\n if (!state.opportunities || state.opportunities.length === 0) return END;\n return 'negotiate';\n }, {\n negotiate: 'negotiate',\n [END]: END,\n })\n .addEdge('negotiate', END);\n\n return workflow.compile();\n }\n}\n"]}