@kamino-finance/klend-sdk 3.2.21 → 3.2.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/classes/action.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6CAWyB;AACzB,iDAK2B;AAC3B,kDAAuB;AACvB,4DAAiC;AACjC,8DAwBqC;AACrC,oCAgBkB;AAElB,6CAAgD;AAEhD,gDAAuD;AACvD,yDAAoD;AAEpD,4DAA4D;AAC5D,gCAAoC;AACpC,yDAAoD;AAEvC,QAAA,cAAc,GAAG,EAAE,CAAC;AACpB,QAAA,aAAa,GAAG,CAAC,CAAC;AAClB,QAAA,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,wBAAwB,GAAG,IAAI,eAAE,CAAC,SAAS,CAAC,CAAC;AAmBnD,MAAa,YAAY;IA+DvB,YACE,YAA0B,EAC1B,KAAgB,EAChB,UAAoD,EACpD,uBAAkC,EAClC,4BAAuC,EACvC,IAAe,EACf,SAAiB,EACjB,MAAmB,EACnB,eAAiC,EACjC,cAAgC,EAChC,YAA2B,EAC3B,WAAmB,EACnB,aAAyB,EACzB,6BAAyC,EACzC,mBAAmC,EACnC,aAA2B,EAC3B,QAAoB,EACpB,KAAiB;QAvEnB,eAAU,GAA4B,IAAI,CAAC;QAU3C;;WAEG;QACH,mBAAc,GAA0B,IAAI,CAAC;QA4D3C,IAAI,UAAU,YAAY,6BAAgB,EAAE,CAAC;YAC3C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/B,CAAC;aAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,KAAK,CAAC;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,eAAE,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;QACvD,IAAI,CAAC,4BAA4B,GAAG,4BAA4B,CAAC;QACjE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,+BAA+B,GAAG,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,6BAA6B,GAAG,6BAA6B,CAAC;QACnE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,mBAAmB,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,eAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,8BAA8B,GAAG,EAAE,CAAC;QACzC,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAS,CAAC,OAAO,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,MAAM,CAAO,UAAU;6DACrB,MAAkB,EAClB,MAAmB,EACnB,IAAe,EACf,KAAgB,EAChB,YAA0B,EAC1B,UAA6C,EAC7C,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC,EACvB,KAAiB;YAEjB,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,wBAAwB,YAAY,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACjG,CAAC;YAED,MAAM,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,GAAG,YAAY,CAAC,uBAAuB,CACpG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,KAAK,EACd,OAAO,CAAC,KAAK,CACd,CAAC;YAEF,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,oBAAoB,EAAE,GAC/E,MAAM,YAAY,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;YAE9F,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAE/F,OAAO,IAAI,YAAY,CACrB,YAAY,EACZ,KAAK,EACL,gBAAgB,IAAI,UAAU,EAC9B,uBAAuB,EACvB,4BAA4B,EAC5B,IAAI,EACJ,oBAAoB,EACpB,MAAM,EACN,eAAe,EACf,cAAc,EACd,OAAO,EACP,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,KAAK,CACN,CAAC;QACJ,CAAC;KAAA;IAEO,MAAM,CAAC,uBAAuB,CAAC,KAAgB,EAAE,OAAgB;QACvE,MAAM,uBAAuB,GAAG,IAAA,iCAAyB,EACvD,OAAO,CAAC,SAAS,CAAC,UAAU,EAC5B,KAAK,EACL,IAAI,EACJ,OAAO,CAAC,SAAS,CAAC,YAAY,EAC9B,uCAA2B,CAC5B,CAAC;QACF,MAAM,4BAA4B,GAAG,IAAA,iCAAyB,EAC5D,OAAO,CAAC,UAAU,CAAC,UAAU,EAC7B,KAAK,EACL,IAAI,EACJ,4BAAgB,EAChB,uCAA2B,CAC5B,CAAC;QAEF,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,CAAC;IACnE,CAAC;IAEO,MAAM,CAAO,cAAc,CACjC,MAAkB,EAClB,YAA0B,EAC1B,KAAgB,EAChB,OAAkB,EAClB,UAA6C,EAC7C,cAA0B;;YAE1B,IAAI,gBAAyC,CAAC;YAC9C,MAAM,eAAe,GAAqB,EAAE,CAAC;YAC7C,MAAM,cAAc,GAAqB,EAAE,CAAC;YAC5C,IAAI,UAAU,YAAY,6BAAgB,EAAE,CAAC;gBAC3C,gBAAgB,GAAG,UAAU,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,iBAAiB,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC7E,gBAAgB,GAAG,MAAM,6BAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC9B,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC/D,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC;YAED,IAAI,CAAC,cAAc,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC3E,CAAC;YAED,qBAAqB;YACrB,MAAM,oBAAoB,GACxB,IAAI,oBAAY,CAAY;gBAC1B,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC/B,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM;gBACnB,IAAI,oBAAY,CAAY;oBAC1B,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;oBAChC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1C,GAAG,CAAC,MAAM,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC,cAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5D,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC;YAEtB,IAAI,oBAAoB,GAAG,sBAAc,EAAE,CAAC;gBAC1C,MAAM,KAAK,CAAC,mDAAmD,sBAAc,EAAE,CAAC,CAAC;YACnF,CAAC;YAED,OAAO;gBACL,gBAAgB;gBAChB,eAAe;gBACf,cAAc;gBACd,oBAAoB;aACrB,CAAC;QACJ,CAAC;KAAA;IAED,MAAM,CAAO,0BAA0B;6DACrC,YAA0B,EAC1B,KAAgB,EAChB,UAA4B,EAC5B,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,cAAsB,CAAC;YAEvB,yCAAyC;YACzC,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YACjE,MAAM,kBAAkB,GAAG,YAAY,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAC1E,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,WAAW,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,mBAAmB,EACnB,GAAG,EACH,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,gBAAgB,EAAE,EACtC,UAAU,CAAC,KAAK,CAAC,KAAK,EACtB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,CACZ,CAAC;YAEF,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAEhC,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,8BAA8B;6DACzC,YAA0B,EAC1B,KAAgB,EAChB,UAA4B,EAC5B,cAAsB,EACtB,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,cAAsB,CAAC;YAEvB,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,CAClD,CAAC,cAAc,CAAC;YAClB,MAAM,kBAAkB,GAAG,YAAY,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAC1E,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,WAAW,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,uBAAuB,EACvB,GAAG,EACH,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,gBAAgB,EAAE,EACtC,UAAU,CAAC,KAAK,CAAC,KAAK,EACtB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,CACZ,CAAC;YAEF,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChC,GAAG,CAAC,qBAAqB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAEnD,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,gBAAgB;6DAC3B,YAA0B,EAC1B,MAAmB,EACnB,IAAe,EACf,KAAgB,EAChB,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,4DAA4D;QAC5F,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,oCAAoC;QACzE,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC,EACvB,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAChF,gCAAoD,SAAS,CAAC,yEAAyE;;YAEvI,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,SAAS,EACT,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,wBAAwB,GAAG,IAAI,CAAC;YAEtC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;aACpB,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,GAAG,CAAC,aAAa,CACrB,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,SAAS,EACT,6BAA6B,CAC9B,CAAC;YACF,GAAG,CAAC,YAAY,EAAE,CAAC;YACnB,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAE/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,0BAA0B,CAAC,YAA0B,EAAE,QAAqB;QAC1E,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,KAAK,MAAM,cAAc,IAAI,QAAQ,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,YAAY,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAChF,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3F,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACrE,IAAI,CAAC,KAAK,mBAAO,EAAE,CAAC;wBAClB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACpE,IAAI,CAAC,KAAK,mBAAO,EAAE,CAAC;wBAClB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEK,kBAAkB;6DAAC,MAAgB,EAAE,OAAe,QAAQ;YAChE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS,CAAC,OAAO,CACpB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,kBAAkB,CAC9C;gBACE,IAAI,EAAE,IAAI;aACX,EACD,MAAM,CACP,CACF,CAAC;QACJ,CAAC;KAAA;IAED,MAAM,CAAO,eAAe;6DAC1B,YAA0B,EAC1B,MAAmB,EACnB,IAAe,EACf,KAAgB,EAChB,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,4DAA4D;QAC5F,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,oCAAoC;QACzE,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC,EACvB,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAChF,gCAAoD,SAAS,CAAC,yEAAyE;;YAEvI,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,wBAAwB,GAAG,IAAI,CAAC;YACtC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;aACpB,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,QAAQ,EACR,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,SAAS,EACT,6BAA6B,CAC9B,CAAC;YACF,GAAG,CAAC,WAAW,EAAE,CAAC;YAClB,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAE/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,gCAAgC;6DAC3C,YAA0B,EAC1B,MAAmB,EACnB,IAAe,EACf,KAAgB,EAChB,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,2DAA2D;QAC3F,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,oCAAoC;QACzE,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC,EACvB,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAEhF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,wBAAwB,GAAG,IAAI,CAAC;YAEtC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;aACpB,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,MAAM,EACN,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,CACzB,CAAC;YACF,GAAG,CAAC,4BAA4B,EAAE,CAAC;YACnC,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,gCAAgC;6DAC3C,YAA0B,EAC1B,MAAmB,EACnB,IAAe,EACf,KAAgB,EAChB,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,2DAA2D;QAC3F,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,qCAAqC;QAC1E,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC,EACvB,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAEhF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,wBAAwB,GAAG,IAAI,CAAC;YAEtC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;aACpB,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,QAAQ,EACR,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,CACzB,CAAC;YACF,GAAG,CAAC,4BAA4B,EAAE,CAAC;YACnC,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,oCAAoC;6DAC/C,YAA0B,EAC1B,MAAmB,EACnB,IAAe,EACf,KAAgB,EAChB,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,2DAA2D;QAC3F,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,oCAAoC;QACzE,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC,EACvB,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAEhF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,mBAAmB,EACnB,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,wBAAwB,GAAG,IAAI,CAAC;YAEtC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;aACpB,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,CACzB,CAAC;YACF,GAAG,CAAC,gCAAgC,EAAE,CAAC;YACvC,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,yBAAyB;6DACpC,YAA0B,EAC1B,aAA0B,EAC1B,WAAsB,EACtB,YAAyB,EACzB,UAAqB,EACrB,KAAgB,EAChB,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,4DAA4D;QAC5F,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,qCAAqC;QAC1E,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC,EACvB,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAEhF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,0BAA0B,CACvD,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,UAAU,EACV,KAAK,EACL,KAAK,EACL,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,kCAAkC,GAAG,IAAI,CAAC;YAChD,MAAM,iCAAiC,GAAG,KAAK,CAAC;YAChD,MAAM,cAAc,GAAG,IAAI,CAAC;YAE5B,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;gBACnB,GAAG,CAAC,cAAe,CAAC,OAAO;aAC5B,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,kCAAkC,EAClC,cAAc,CACf,CAAC;YACF,MAAM,GAAG,CAAC,qBAAqB,EAAE,CAAC;YAClC,MAAM,GAAG,CAAC,eAAe,CACvB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,iCAAiC,CAClC,CAAC;YACF,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,yBAAyB;6DACpC,YAA0B,EAC1B,WAAwB,EACxB,SAAoB,EACpB,cAA2B,EAC3B,YAAuB,EACvB,KAAgB,EAChB,WAAmB,EACnB,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,4DAA4D;QAC5F,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,qCAAqC;QAC1E,oBAA6B,KAAK,EAClC,WAAsB,mBAAS,CAAC,OAAO,EACvC,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAEhF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,0BAA0B,CACvD,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,KAAK,EACL,KAAK,EACL,UAAU,EACV,cAAc,EACd,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,gCAAgC,GAAG,IAAI,CAAC;YAC9C,MAAM,mCAAmC,GAAG,KAAK,CAAC;YAClD,MAAM,cAAc,GAAG,IAAI,CAAC;YAC5B,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;gBACnB,GAAG,CAAC,cAAe,CAAC,OAAO;aAC5B,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,gCAAgC,EAChC,cAAc,CACf,CAAC;YACF,MAAM,GAAG,CAAC,sBAAsB,EAAE,CAAC;YACnC,MAAM,GAAG,CAAC,eAAe,CACvB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,mCAAmC,EACnC,iBAAiB,CAClB,CAAC;YACF,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAC/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,iBAAiB;6DAC5B,YAA0B,EAC1B,MAAmB,EACnB,IAAe,EACf,KAAgB,EAChB,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,4DAA4D;QAC5F,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,oCAAoC;QACzE,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC,EACvB,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAEhF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,UAAU,EACV,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,wBAAwB,GAAG,IAAI,CAAC;YAEtC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;aACpB,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,UAAU,EACV,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,CACzB,CAAC;YACF,MAAM,GAAG,CAAC,aAAa,EAAE,CAAC;YAC1B,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAE/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAO,cAAc;6DACzB,YAA0B,EAC1B,MAAmB,EACnB,IAAe,EACf,KAAgB,EAChB,UAA6C,EAC7C,WAAmB,EACnB,QAA+B,SAAS,EACxC,qBAA6B,OAAS,EACtC,iBAA0B,IAAI,EAC9B,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EACnC,WAAsB,mBAAS,CAAC,OAAO,EACvC,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAEhF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,UAAU,CACvC,OAAO,EACP,MAAM,EACN,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,WAAW,EACX,KAAK,CACN,CAAC;YACF,MAAM,wBAAwB,GAAG,IAAI,CAAC;YAEtC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;aACpB,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,OAAO,EACP,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,CACzB,CAAC;YACF,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;YACvB,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAE/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,kBAAkB;6DAC7B,YAA0B,EAC1B,MAAmB,EACnB,0BAAuC,EACvC,cAAyB,EACzB,iBAA4B,EAC5B,UAAqB,EACrB,eAA0B,EAC1B,UAA6C,EAC7C,qBAA6B,OAAS,EAAE,2BAA2B;QACnE,iBAA0B,IAAI,EAAE,iHAAiH;QACjJ,wBAAiC,KAAK,EACtC,sBAA+B,IAAI,EAAE,oCAAoC;QACzE,WAAsB,mBAAS,CAAC,OAAO,EACvC,+BAAuC,CAAC,EACxC,cAAsB,CAAC,EACvB,eAA6B,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;YAEhF,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,0BAA0B,CACvD,YAAY,EACZ,WAAW,EACX,MAAM,EACN,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,eAAe,EACf,UAAU,EACV,0BAA0B,EAC1B,QAAQ,EACR,WAAW,CACZ,CAAC;YACF,MAAM,wBAAwB,GAAG,IAAI,CAAC;YAEtC,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;gBAC3B,GAAG,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,oBAAY,CAAY;gBAC9C,GAAG,GAAG,CAAC,eAAe;gBACtB,GAAG,GAAG,CAAC,cAAc;gBACrB,GAAG,CAAC,OAAO,CAAC,OAAO;gBACnB,GAAG,CAAC,cAAe,CAAC,OAAO;aAC5B,CAAC,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,GAAG,CAAC,0BAA0B,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAE3E,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,mBAAmB,EAAE,CAAC;gBAC5D,MAAM,GAAG,CAAC,kBAAkB,CAAC,QAAQ,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,GAAG,CAAC,aAAa,CACrB,WAAW,EACX,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,CACzB,CAAC;YACF,MAAM,GAAG,CAAC,cAAc,CAAC,4BAA4B,CAAC,CAAC;YACvD,GAAG,CAAC,wCAAwC,EAAE,CAAC;YAE/C,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAED,MAAM,CAAO,4BAA4B;6DACvC,KAAgB,EAChB,SAAoB,EACpB,YAA0B,EAC1B,cAAsB,CAAC;YAEvB,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,MAAM,YAAY,CAAC,8BAA8B,CAC/E,SAAS,EACT,KAAK,EACL,YAAY,EACZ,WAAW,CACZ,CAAC;YAEF,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,CAAC;YACtC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAErF,GAAG,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAChD,GAAG,CAAC,0BAA0B,EAAE,CAAC;YAEjC,OAAO,GAAG,CAAC;QACb,CAAC;KAAA;IAEK,eAAe;;YACnB,MAAM,IAAI,GAIN;gBACF,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;aACrB,CAAC;YAEF,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,qBAAW,CAAC;oBACnC,QAAQ,EAAE,IAAI,CAAC,KAAK;oBACpB,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS;iBAC1F,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,UAAU,GAAG,IAAI,qBAAW,CAAC;oBAChC,QAAQ,EAAE,IAAI,CAAC,KAAK;oBACpB,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS;iBAC1F,CAAC,CAAC,GAAG,CACJ,GAAG,IAAI,CAAC,QAAQ,EAChB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACvB,GAAG,IAAI,CAAC,YAAY,EACpB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EACvB,GAAG,IAAI,CAAC,UAAU,CACnB,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU,GAAG,IAAI,qBAAW,CAAC;oBAChC,QAAQ,EAAE,IAAI,CAAC,KAAK;oBACpB,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS;iBAC1F,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YACnE,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,qBAAW,CAAC;oBACpC,QAAQ,EAAE,IAAI,CAAC,KAAK;oBACpB,eAAe,EAAE,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS;iBAC1F,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEK,gBAAgB,CAAC,eAA4F;;YACjH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAE1C,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YAEtE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAErF,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAEvE,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAEa,qBAAqB,CACjC,GAAuB,EACvB,eAA4F;;YAE5F,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,CAAC;YAEpB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC;YAChF,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAEtE,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAEK,oBAAoB,CACxB,eAGiE;;YAEjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAE1C,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;YAE1E,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAEzF,MAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAE3E,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAEa,yBAAyB,CACrC,GAAuB,EACvB,eAGiE;;YAEjE,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC;QACvE,CAAC;KAAA;IAED,YAAY;QACV,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAA,6DAA8C,EAC5C;YACE,eAAe,EAAE,IAAI,CAAC,MAAM;SAC7B,EACD;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;YACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;YACrE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YACrD,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;YAChE,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YACnD,mCAAmC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,wBAAwB;YACxG,mBAAmB,EAAE,IAAI,CAAC,uBAAuB;YACjD,oCAAoC,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS;YACjE,sBAAsB,EAAE,4BAAgB;YACxC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;YAC9D,wBAAwB,EAAE,oCAA0B;SACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CACF,CAAC;IACJ,CAAC;IAED,4BAA4B;QAC1B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAA,sCAAuB,EACrB;YACE,eAAe,EAAE,IAAI,CAAC,MAAM;SAC7B,EACD;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;YACrE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YACrD,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;YAChE,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YACnD,mBAAmB,EAAE,IAAI,CAAC,uBAAuB;YACjD,yBAAyB,EAAE,IAAI,CAAC,4BAA4B;YAC5D,sBAAsB,EAAE,4BAAgB;YACxC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;YAC9D,wBAAwB,EAAE,oCAA0B;SACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CACF,CAAC;IACJ,CAAC;IAED,4BAA4B;QAC1B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAA,sCAAuB,EACrB;YACE,gBAAgB,EAAE,IAAI,CAAC,MAAM;SAC9B,EACD;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;YACrE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YACrD,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;YAChE,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YACnD,oBAAoB,EAAE,IAAI,CAAC,4BAA4B;YACvD,wBAAwB,EAAE,IAAI,CAAC,uBAAuB;YACtD,sBAAsB,EAAE,4BAAgB;YACxC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;YAC9D,wBAAwB,EAAE,oCAA0B;SACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CACF,CAAC;IACJ,CAAC;IAED,gCAAgC;QAC9B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAA,0CAA2B,EACzB;YACE,gBAAgB,EAAE,IAAI,CAAC,MAAM;SAC9B,EACD;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;YACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAC7C,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YACpC,4BAA4B,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW;YACvE,oBAAoB,EAAE,IAAI,CAAC,4BAA4B;YACvD,YAAY,EAAE,4BAAgB;YAC9B,wBAAwB,EAAE,oCAA0B;SACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CACF,CAAC;IACJ,CAAC;IAED,WAAW;QACT,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAExD,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAEpE,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAA,wCAAyB,EACxC;YACE,eAAe,EAAE,IAAI,CAAC,MAAM;SAC7B,EACD;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;YACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;YACrE,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YACnC,0BAA0B,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YAC3D,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;YAChE,wBAAwB,EAAE,IAAI,CAAC,uBAAuB;YACtD,iCAAiC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ;YACxE,kBAAkB,EAAE,IAAA,6BAAqB,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9G,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;YACrD,wBAAwB,EAAE,oCAA0B;SACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;QACF,QAAQ,CAAC,IAAI;YACX,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC,UAAW,CAAC,cAAc,CAAC,6BAA6B,GAAG,CAAC;gBAC5G,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC;gBACvD,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAEK,qBAAqB;;YACzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC7E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACxD,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAA,6DAA8C,EAC5C;gBACE,eAAe,EAAE,IAAI,CAAC,MAAM;aAC7B,EACD;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;gBACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;gBACrE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC7B,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBACrD,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;gBAChE,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;gBACnD,mCAAmC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,wBAAwB;gBACxG,mBAAmB,EAAE,IAAI,CAAC,uBAAuB;gBACjD,oCAAoC,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS;gBACjE,sBAAsB,EAAE,4BAAgB;gBACxC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;gBAC9D,wBAAwB,EAAE,oCAA0B;aACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CACF,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3D,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;YACpE,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,IAAA,wCAAyB,EACxC;gBACE,eAAe,EAAE,IAAI,CAAC,aAAa;aACpC,EACD;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;gBACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;gBACrE,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO;gBAC1C,0BAA0B,EAAE,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE;gBAClE,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;gBACvE,wBAAwB,EAAE,IAAI,CAAC,6BAA6B;gBAC5D,iCAAiC,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ;gBAC/E,kBAAkB,EAAE,IAAA,6BAAqB,EACvC,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,cAAc,CAAC,OAAO,EAC3B,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC,CAAC,CAAC;gBACJ,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE;gBAC5D,wBAAwB,EAAE,oCAA0B;aACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;YAEF,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC;YAEtE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;KAAA;IAEK,sBAAsB;;YAC1B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACxB,oCAAoC,IAAI,CAAC,OAAQ,CAAC,OAAO,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,GAAG,CACpG,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YAErF,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;YAEpE,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAChE,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,uCAAwB,EACtC;gBACE,eAAe,EAAE,IAAI,CAAC,MAAM;aAC7B,EACD;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;gBACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,YAAY,EAAE,IAAI,CAAC,OAAQ,CAAC,OAAO;gBACnC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBACrD,mBAAmB,EAAE,IAAI,CAAC,uBAAuB;gBACjD,2BAA2B,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;gBACrE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;gBACrD,wBAAwB,EAAE,oCAA0B;aACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;YAEF,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC;YAEpE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC3D,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,sBAAsB,GAAG,IAAI,CAAC,cAAc,CAAC,kCAAkC,CACnF,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACvC,CAAC;YAEF,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAA,qEAAsD,EACpD;gBACE,gBAAgB,EAAE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,eAAE,CAAC,eAAO,CAAC,CAAC;oBACtD,CAAC,CAAC,IAAI,CAAC,aAAa;oBACpB,CAAC,CAAC,IAAI,eAAE,CAAC,IAAI,oBAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;aACrG,EACD;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;gBACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;gBACrE,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO;gBAC5C,oBAAoB,EAAE,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE;gBAC5D,qBAAqB,EAAE,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;gBAC1D,sBAAsB,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;gBACvE,uBAAuB,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW;gBACzE,wBAAwB,EAAE,IAAI,CAAC,6BAA6B;gBAC5D,oCAAoC,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS;gBACjE,sBAAsB,EAAE,4BAAgB;gBACxC,qBAAqB,EAAE,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE;gBACrE,wBAAwB,EAAE,oCAA0B;aACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CACF,CAAC;QACJ,CAAC;KAAA;IAEK,aAAa;;YACjB,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,kCAAkC,CAC5E,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACvC,CAAC;YAEF,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAE,CAAC,eAAO,CAAC,CAAC;gBACtD,CAAC,CAAC,IAAI,CAAC,MAAM;gBACb,CAAC,CAAC,IAAI,eAAE,CAAC,IAAI,oBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE9F,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACrF,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,IAAA,qEAAsD,EACpD;gBACE,gBAAgB;aACjB,EACD;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;gBACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;gBACrE,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBACrC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBACrD,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;gBACnD,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;gBAChE,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW;gBAClE,wBAAwB,EAAE,IAAI,CAAC,uBAAuB;gBACtD,oCAAoC,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS;gBACjE,sBAAsB,EAAE,4BAAgB;gBACxC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;gBAC9D,wBAAwB,EAAE,oCAA0B;aACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CACF,CAAC;QACJ,CAAC;KAAA;IAEK,UAAU;;YACd,IAAI,CAAC,gBAAgB,CAAC,IAAI,CACxB,oCAAoC,IAAI,CAAC,OAAO,CAAC,OAAO,gBAAgB,IAAI,CAAC,gBAAgB,EAAE,GAAG,CACnG,CAAC;YAEF,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;YAEpE,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAA,uCAAwB,EACtC;gBACE,eAAe,EAAE,IAAI,CAAC,MAAM;aAC7B,EACD;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;gBACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAClC,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBACrD,mBAAmB,EAAE,IAAI,CAAC,uBAAuB;gBACjD,2BAA2B,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;gBACrE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;gBACrD,wBAAwB,EAAE,oCAA0B;aACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;YAEF,OAAO,CAAC,IAAI;gBACV,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;YAElH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;KAAA;IAEK,cAAc;6DAAC,+BAAuC,CAAC;YAC3D,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC;gBACxC,MAAM,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAClE,CAAC;YAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;YACpE,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,IAAA,4DAA6C,EAC/D;gBACE,eAAe,EAAE,IAAI,CAAC,MAAM;gBAC5B,mEAAmE;gBACnE,oCAAoC,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,eAAE,CAAC,CAAC,CAAC;gBACrE,4BAA4B,EAAE,IAAI,eAAE,CAAC,4BAA4B,CAAC;aACnE,EACD;gBACE,UAAU,EAAE,IAAI,CAAC,KAAK;gBACtB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;gBACnC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;gBACrE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAClC,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAC1D,2BAA2B,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;gBACrE,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO;gBAC5C,4BAA4B,EAAE,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE;gBACpE,6BAA6B,EAAE,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;gBAClE,+BAA+B,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW;gBACjF,8BAA8B,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;gBAC/E,mBAAmB,EAAE,IAAI,CAAC,6BAA6B;gBACvD,yBAAyB,EAAE,IAAI,CAAC,4BAA4B;gBAC5D,wBAAwB,EAAE,IAAI,CAAC,uBAAuB;gBACtD,mCAAmC,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ;gBACjF,sBAAsB,EAAE,4BAAgB;gBACxC,0BAA0B,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;gBACnE,6BAA6B,EAAE,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE;gBAC7E,wBAAwB,EAAE,oCAA0B;aACrD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;YACF,WAAW,CAAC,IAAI;gBACd,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC;oBACvC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC;oBAC1D,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;KAAA;IAEK,eAAe;6DACnB,MAAkB,EAClB,cAAuB,EACvB,qBAA8B,EAC9B,wBAAiC,EACjC,oBAA6B,KAAK;YAElC,MAAM,IAAI,CAAC,kCAAkC,CAC3C,MAAM,EACN,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,CAClB,CAAC;QACJ,CAAC;KAAA;IAED,oBAAoB,CAAC,KAAgB;QACnC,MAAM,sBAAsB,GAAG,IAAI,oBAAY,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAE5G,MAAM,iBAAiB,GAAG,OAAO,CAAC;QAClC,qBAAqB;QACrB,MAAM,2BAA2B,GAAG,CAAC,GAAG,sBAAsB,CAAC,CAAC;QAEhE,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,EAAE,iBAAiB,CAAC,CAAC;QAC1E,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAE,CAAC,EAC1E,iBAAiB,EACjB,uBAAe,CAAC,UAAU,EAC1B,KAAK,CACN,CAAC;QACF,IAAI,CAAC,yBAAyB,CAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAE,CAAC,EACzE,iBAAiB,EACjB,uBAAe,CAAC,IAAI,EACpB,KAAK,CACN,CAAC;QACF,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;IAEK,kCAAkC;6DACtC,MAAkB,EAClB,cAAuB,EACvB,iBAA8B,OAAO,EACrC,wBAAiC,KAAK,EACtC,2BAAoC,KAAK,EACzC,oBAA6B,KAAK,EAClC,iBAA0B,KAAK,EAC/B,6BAAsC;;YAEtC,yCAAyC;YACzC,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;YAED,IACE;gBACE,mBAAmB;gBACnB,SAAS;gBACT,UAAU;gBACV,QAAQ;gBACR,WAAW;gBACX,OAAO;gBACP,kBAAkB;gBAClB,kBAAkB;gBAClB,mBAAmB;aACpB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAClB,CAAC;gBACD,iCAAiC;gBACjC,yBAAyB;gBACzB,oBAAoB;gBACpB,8BAA8B;gBAC9B,sFAAsF;gBACtF,sDAAsD;gBACtD,mCAAmC;gBACnC,sDAAsD;gBACtD,4DAA4D;gBAC5D,4BAA4B;gBAC5B,sDAAsD;gBACtD,4DAA4D;gBAE5D,IAAI,eAAe,GAAoB,EAAE,CAAC;gBAE1C,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;oBAC7F,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;wBACzB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;oBACjD,CAAC;oBAED,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;wBACnE,eAAe,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;wBACtD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;4BACpB,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gCAClC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC9D,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CACpD,CAAC;gCAEF,IAAI,CAAC,OAAO,EAAE,CAAC;oCACb,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gCACjE,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3D,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAClD,CAAC;gCAEF,IAAI,CAAC,MAAM,EAAE,CAAC;oCACZ,MAAM,KAAK,CAAC,iDAAiD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gCACzG,CAAC;gCAED,MAAM,8BAA8B,GAAG,6BAAgB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;gCAExF,MAAM,2BAA2B,GAAG,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAC/E,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACvC,CAAC;gCACF,MAAM,SAAS,GAAG,6BAAgB,CAAC,eAAe,CAAC,MAAM,CAAC;qCACvD,GAAG,CAAC,2BAA2B,CAAC;qCAChC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gCAEvC,MAAM,aAAa,GAAG,IAAI,oBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gCAE1D,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;oCACjC,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gCAChE,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,0EAA0E;4BAC1E,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBACjE,CAAC;oBACH,CAAC;yBAAM,IAAI,MAAM,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC/F,eAAe,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACxD,CAAC;yBAAM,CAAC;wBACN,eAAe,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,eAAe,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACnC,CAAC;gBAED,MAAM,sBAAsB,GAAG,IAAI,oBAAY,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;gBAClG,MAAM,uBAAuB,GAAG,IAAI,oBAAY,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;gBAEpG,qBAAqB;gBACrB,MAAM,2BAA2B,GAAG,CAAC,GAAG,sBAAsB,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAC9E,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,CACxD,CAAC;gBAEF,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;gBACvE,IAAI,wBAAwB,EAAE,CAAC;oBAC7B,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;wBAC3B,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAe,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;wBACxF,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAe,EAAE,uBAAe,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;oBACxG,CAAC;yBAAM,IACL,MAAM,KAAK,kBAAkB;wBAC7B,MAAM,KAAK,mBAAmB;wBAC9B,MAAM,KAAK,UAAU;wBACrB,MAAM,KAAK,SAAS,EACpB,CAAC;wBACD,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAe,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;wBAC9F,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;4BACxB,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,uBAAe,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;wBACjG,CAAC;oBACH,CAAC;yBAAM,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;wBACtF,iFAAiF;wBACjF,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAe,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;wBACxF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;4BACxB,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,uBAAe,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;wBACvG,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAe,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;wBAC9F,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAe,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;wBACxF,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;4BACxB,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,uBAAe,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;4BACrG,MAAM,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,cAAc,EAAE,uBAAe,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;wBACjG,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;gBAE7E,IAAI,MAAM,KAAK,kBAAkB,IAAI,cAAc,KAAK,WAAW,IAAI,iBAAiB,EAAE,CAAC;oBACzF,8CAA8C;oBAC9C,8FAA8F;oBAC9F,uEAAuE;oBACvE,kEAAkE;oBAClE,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,sBAAsB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;gBACrD,CAAC;gBAED,IAAI,MAAM,KAAK,OAAO,IAAI,qBAAqB,EAAE,CAAC;oBAChD,MAAM,wBAAwB,GAAG,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAEpF,IAAI,CAAC,wBAAwB,EAAE,CAAC;wBAC9B,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,OAAO,CAAC,OAAO,gBAAgB,CAAC,CAAC;oBACvF,CAAC;oBAED,IACE,IAAI,oBAAO,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;wBACrF,IAAI,CAAC,UAAW,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;wBACnC,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,CAAC,cAAc,MAAK,CAAC,EAC3C,CAAC;wBACD,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;wBAClE,yDAAyD;wBACzD,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;wBAC7C,IAAI,CAAC,qBAAqB,CAAC,6BAA6B,aAA7B,6BAA6B,cAA7B,6BAA6B,GAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;oBAClF,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,qBAAqB,EAAE,CAAC;oBACpF,IAAI,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;oBAChE,IAAI,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;oBAChE,IAAI,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;oBAEvC,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;wBAClC,eAAe,GAAG,IAAI,CAAC,cAAe,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;wBACpE,WAAW,GAAG,IAAI,CAAC,cAAe,CAAC,OAAO,CAAC;oBAC7C,CAAC;yBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,UAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CACzD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,CAClD,CAAC,cAAc,CAAC;wBAClB,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;wBAC1E,eAAe,GAAG,WAAY,CAAC,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;oBAC9D,CAAC;oBACD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC;oBACvD,MAAM,qBAAqB,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,MAAM,CACvD,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAC3G,CAAC;oBAEF,OAAO,CAAC,GAAG,CACT,wBAAwB,EACxB,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,qBAAqB,CACtB,CAAC;oBAEF,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACvC,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;oBACxE,CAAC;yBAAM,CAAC;wBACN,MAAM,kCAAkC,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;4BACrF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;4BAC5D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;4BAC5D,OAAO,SAAU,CAAC,MAAM,GAAG,SAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;wBAC7D,CAAC,CAAC,CAAC;wBAEH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,kCAAkC,CAAE,CAAC,EAAE,CAAC;wBAC/F,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,6BAA6B,aAA7B,6BAA6B,cAA7B,6BAA6B,GAAI,UAAU,CAAC,CAAC;wBAElF,IAAI,cAAc,GAAgB,WAAW,CAAC;wBAC9C,IAAI,UAAU,KAAK,CAAC,IAAI,UAAU,MAAK,MAAA,IAAI,CAAC,UAAU,0CAAE,KAAK,CAAC,cAAc,CAAA,EAAE,CAAC;4BAC7E,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gCACxB,IAAI,CAAC,UAAW,CAAC,cAAc,CAAC,6BAA6B,GAAG,UAAU,CAAC;gCAC3E,cAAc,GAAG,OAAO,CAAC;4BAC3B,CAAC;4BACD,IAAI,CAAC,qBAAqB,CAAC,6BAA6B,aAA7B,6BAA6B,cAA7B,6BAA6B,GAAI,UAAU,EAAE,cAAc,CAAC,CAAC;4BACxF,IAAI,CAAC,oBAAoB,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;4BACvE,IAAI,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;4BAC7E,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;wBAC9C,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;oBAC/B,+FAA+F;oBAC/F,qCAAqC;oBACrC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;wBAC3B,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,cAAe,CAAC,EAAE,cAAc,EAAE,uBAAe,CAAC,UAAU,CAAC,CAAC;wBACnG,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,uBAAe,CAAC,IAAI,CAAC,CAAC;oBACvF,CAAC;yBAAM,IACL,MAAM,KAAK,kBAAkB;wBAC7B,MAAM,KAAK,mBAAmB;wBAC9B,MAAM,KAAK,UAAU;wBACrB,MAAM,KAAK,SAAS,EACpB,CAAC;wBACD,IAAI,CAAC,yBAAyB,CAC5B,eAAe,EACf,cAAc,EACd,uBAAe,CAAC,UAAU,EAC1B,SAAS,EACT,cAAc,CACf,CAAC;oBACJ,CAAC;yBAAM,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;wBACtF,IAAI,CAAC,yBAAyB,CAC5B,eAAe,EACf,cAAc,EACd,uBAAe,CAAC,IAAI,EACpB,SAAS,EACT,cAAc,CACf,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC;oBAC3E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,iGAAiG;oBACjG,4BAA4B;oBAC5B,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;wBAClC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,cAAe,CAAC,EAAE,cAAc,EAAE,uBAAe,CAAC,IAAI,CAAC,CAAC;oBAC/F,CAAC;yBAAM,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;wBACzC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,cAAe,CAAC,EAAE,cAAc,EAAE,uBAAe,CAAC,UAAU,CAAC,CAAC;oBACrG,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC;oBAC3E,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAEK,aAAa;6DACjB,MAAkB,EAClB,cAAuB,EACvB,qBAA8B,EAC9B,mBAA4B,EAC5B,wBAAiC,EACjC,iBAA0B,KAAK,EAC/B,6BAAsC;YAEtC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,EAAE,iBAAiB,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClF,IAAI,CAAC,iBAAiB,IAAI,mBAAmB,EAAE,CAAC;oBAC9C,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBACtC,CAAC;gBAED,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBAC1C,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACpC,CAAC;YAED,MAAM,IAAI,CAAC,kCAAkC,CAC3C,MAAM,EACN,cAAc,EACd,OAAO,EACP,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,EACL,cAAc,EACd,6BAA6B,CAC9B,CAAC;QACJ,CAAC;KAAA;IAEO,MAAM,CAAC,eAAe,CAAC,MAAiB,EAAE,YAAuB,gBAAU;QACjF,IAAI,IAAA,uBAAe,EAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,QAAqB,EAAE,iBAA8B,OAAO;QACvF,QAAQ,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;YAClC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YAC3E,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,cAAc,cAAc,CAAC,CAAC;YAC1E,CAAC;YAED,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;YAE/B,MAAM,gBAAgB,GAAG,IAAA,6BAAc,EACrC;gBACE,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,OAAO,EAAE,cAAc;gBACvB,UAAU,EAAE,YAAY,CAAC,eAAe,CACtC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAC9C,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B;gBACD,sBAAsB,EAAE,YAAY,CAAC,eAAe,CAClD,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,eAAe,EAC/D,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B;gBACD,qBAAqB,EAAE,YAAY,CAAC,eAAe,CACjD,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,cAAc,EAC9D,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B;gBACD,WAAW,EAAE,YAAY,CAAC,eAAe,CACvC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,EACnD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B;aACF,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;YAEF,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,cAAc,GAAG,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,cAAc,KAAK,WAAW,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACzC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,cAAc,GAAG,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACvC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,kBAAkB,cAAc,GAAG,CAAC,CAAC;YAClE,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,MAAM,CAAC,qBAAqB,CAAC,YAA0B,EAAE,QAAqB;QACnF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,cAAc,EAA0B,EAAE;YAC7D,MAAM,YAAY,GAAG,YAAY,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;YACtE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,cAAc,cAAc,CAAC,CAAC;YAC1E,CAAC;YAED,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;YAC/B,OAAO,IAAA,6BAAc,EACnB;gBACE,OAAO,EAAE,cAAc;gBACvB,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,SAAS,CAAC;gBACxG,sBAAsB,EAAE,IAAI,CAAC,eAAe,CAC1C,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,eAAe,EAC/D,YAAY,CAAC,SAAS,CACvB;gBACD,qBAAqB,EAAE,IAAI,CAAC,eAAe,CACzC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,cAAc,EAC9D,YAAY,CAAC,SAAS,CACvB;gBACD,WAAW,EAAE,IAAI,CAAC,eAAe,CAC/B,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,SAAS,EACnD,YAAY,CAAC,SAAS,CACvB;aACF,EACD,YAAY,CAAC,SAAS,CACvB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,sBAAsB,CAAC,iBAA8B,OAAO,EAAE,wBAAiC,KAAK;QAC1G,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;QACrD,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,mBAAmB,GAAG,IAAA,gCAAiB,EAC3C;YACE,aAAa,EAAE,aAAa;YAC5B,UAAU,EAAE,aAAa;SAC1B,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;QAEF,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAEpE,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,MAAM,6BAA6B,GAAG,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9G,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CACnD,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,6BAA6B,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CACzE,CAAC;QAEF,MAAM,yBAAyB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACnE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,MAAM,iCAAiC,GAAG,kBAAkB;aACzD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACf,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACpF,CAAC;YACD,MAAM,yBAAyB,GAAG,IAAA,6BAAqB,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAChH,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAClF,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAEhE,mBAAmB,CAAC,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;YACzD,GAAG,0BAA0B;YAC7B,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,yBAAyB,EAAE,GAAG,iCAAiC,CAAC,CAAC;SACvG,CAAC,CAAC;QAEH,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACxC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;aAAM,IAAI,cAAc,KAAK,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC5C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,qBAAqB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC1C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,qBAAqB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAEO,qBAAqB,CAC3B,cAAsB,EACtB,cAA2B,EAC3B,wBAAiC,KAAK;QAEtC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,IAAI,GAA8B;YACtC,cAAc;SACf,CAAC;QACF,MAAM,QAAQ,GAAkC;YAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,aAAa;YACzB,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;SAC9C,CAAC;QAEF,MAAM,uBAAuB,GAAG,IAAA,oCAAqB,EAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEnG,MAAM,mBAAmB,GAAG,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAEpE,MAAM,0BAA0B,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACrE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,MAAM,6BAA6B,GAAG,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9G,MAAM,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CACnD,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,6BAA6B,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CACzE,CAAC;QAEF,MAAM,yBAAyB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACnE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,MAAM,iCAAiC,GAAG,kBAAkB;aACzD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACf,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACpF,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAE,CAAC;YACrE,MAAM,yBAAyB,GAAG,IAAA,6BAAqB,EACrD,IAAI,CAAC,QAAQ,EACb,YAAY,CAAC,OAAO,EACpB,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC,CAAC,CAAC,CAAC;YACL,OAAO,EAAE,MAAM,EAAE,yBAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAClF,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAEhE,uBAAuB,CAAC,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;YACjE,GAAG,0BAA0B;YAC7B,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,yBAAyB,EAAE,GAAG,iCAAiC,CAAC,CAAC;SACvG,CAAC,CAAC;QAEH,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,oBAAoB,aAAa,sBAAsB,cAAc,EAAE,CAAC,CAAC;QACpG,CAAC;aAAM,IAAI,cAAc,KAAK,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAChD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,aAAa,sBAAsB,cAAc,EAAE,CAAC,CAAC;QACxG,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,oBAAoB,aAAa,sBAAsB,cAAc,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAEO,yBAAyB,CAC/B,QAAyB,EACzB,iBAA8B,OAAO,EACrC,IAAqE,EACrE,QAAmB,IAAI,CAAC,KAAK,EAC7B,iBAA0B,KAAK;QAE/B,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,CAAC,IAAe,EAAE,EAAE,CACjC,mBAAS,CAAC,sBAAsB,CAC9B,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC,EACzE,mBAAO,CACR,CAAC,CAAC,CAAC,CAAC;QAEP,MAAM,KAAK,GAKL,EAAE,CAAC;QAET,KAAK,MAAM,aAAa,IAAI,QAAQ,EAAE,CAAC;YACrC,IAAI,IAAI,KAAK,uBAAe,CAAC,UAAU,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzG,KAAK,CAAC,IAAI,CAAC;oBACT,uBAAe,CAAC,UAAU;oBAC1B,aAAa,CAAC,KAAK,CAAC,cAAc;oBAClC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC;oBAC1C,aAAa;iBACd,CAAC,CAAC;YACL,CAAC;YACD,IAAI,IAAI,KAAK,uBAAe,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7F,KAAK,CAAC,IAAI,CAAC;oBACT,uBAAe,CAAC,IAAI;oBACpB,aAAa,CAAC,KAAK,CAAC,QAAQ;oBAC5B,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC;oBACpC,aAAa;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CACX,CAAC,GAA2G,EAAE,EAAE;YAC9G,MAAM,IAAI,GAAyC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;YAClF,MAAM,QAAQ,GAA6C;gBACzD,KAAK;gBACL,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;gBACnC,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;gBACrE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO;gBACvB,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxB,uBAAuB,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC/B,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7C,YAAY,EAAE,mBAAO;gBACrB,IAAI,EAAE,4BAAkB;gBACxB,aAAa,EAAE,uBAAa,CAAC,SAAS;aACvC,CAAC;YACF,MAAM,0BAA0B,GAAG,IAAA,+CAAgC,EACjE,IAAI,EACJ,QAAQ,EACR,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;YAEF,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAC/C,IAAI,CAAC,cAAc,CAAC,IAAI,CACtB,4BACE,GAAG,CAAC,CAAC,CAAC,CAAC,IACT,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,GAAG,CACjF,CAAC;gBACF,IAAI,cAAc,EAAE,CAAC;oBACnB,uEAAuE;oBACvE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;oBACnD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAC1B,4BACE,GAAG,CAAC,CAAC,CAAC,CAAC,IACT,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,GAAG,CACjF,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;oBAChE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CACvC,4BACE,GAAG,CAAC,CAAC,CAAC,CAAC,IACT,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,GAAG,CACjF,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,cAAc,KAAK,WAAW,EAAE,CAAC;gBAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACnD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAC1B,4BACE,GAAG,CAAC,CAAC,CAAC,CAAC,IACT,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,GAAG,CACjF,CAAC;gBAEF,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBAChE,IAAI,CAAC,+BAA+B,CAAC,IAAI,CACvC,4BACE,GAAG,CAAC,CAAC,CAAC,CAAC,IACT,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,GAAG,CACjF,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,wCAAwC;QAC9C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAChE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC9E,CAAC;IAEa,wBAAwB;6DACpC,OAAsB,EACtB,IAAqE,EACrE,iBAA8B,OAAO;YAErC,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,CAAC,IAAe,EAAE,EAAE,CACjC,mBAAS,CAAC,sBAAsB,CAC9B,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,EAAE,CAAC,EACzE,mBAAO,CACR,CAAC,CAAC,CAAC,CAAC;YAEP,MAAM,KAAK,GAAqC,EAAE,CAAC;YAEnD,IAAI,IAAI,KAAK,uBAAe,CAAC,UAAU,IAAI,IAAA,uBAAe,EAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;gBACzF,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;gBAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,CAAC,uBAAe,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;YAED,IAAI,IAAI,KAAK,uBAAe,CAAC,IAAI,IAAI,IAAA,uBAAe,EAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;gBAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,CAAC,uBAAe,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC3G,CAAC;YACH,CAAC;YAED,KAAK,CAAC,OAAO,CAAC,CAAC,GAAmC,EAAE,EAAE;gBACpD,MAAM,IAAI,GAAsC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,MAAM,QAAQ,GAA0C;oBACtD,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK;oBACjE,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE;oBACnC,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;oBACrE,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC;oBACxB,cAAc,EAAE,GAAG,CAAC,CAAC,CAAC;oBACtB,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;oBAC7C,YAAY,EAAE,mBAAO;oBACrB,IAAI,EAAE,4BAAkB;oBACxB,aAAa,EAAE,uBAAa,CAAC,SAAS;iBACvC,CAAC;gBACF,MAAM,qBAAqB,GAAG,IAAA,4CAA6B,EAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBACzG,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;oBAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBAC1C,IAAI,CAAC,cAAc,CAAC,IAAI,CACtB,yBAAyB,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,GAAG,CAC9F,CAAC;gBACJ,CAAC;qBAAM,IAAI,cAAc,KAAK,WAAW,EAAE,CAAC;oBAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBAC9C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAC1B,yBAAyB,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,GAAG,CAC9F,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAEa,oBAAoB;;YAChC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC9C,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,GAAG,IAAA,uBAAe,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gBAC9F,MAAM,gBAAgB,GAAG,IAAA,6BAAc,EACrC;oBACE,IAAI,EAAE;wBACJ,GAAG,EAAE,IAAI,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,GAAG;wBACtC,EAAE,EAAE,IAAI,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,EAAE;qBACrC;iBACF,EACD;oBACE,eAAe,EAAE,IAAI,CAAC,KAAK;oBAC3B,QAAQ,EAAE,IAAI,CAAC,KAAK;oBACpB,UAAU,EAAE,aAAa;oBACzB,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;oBAC7C,YAAY,EAAE,IAAI,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,KAAK;oBACjD,YAAY,EAAE,IAAI,CAAC,cAAe,CAAC,MAAM,EAAE,CAAC,KAAK;oBACjD,iBAAiB,EAAE,mBAAmB;oBACtC,IAAI,EAAE,4BAAkB;oBACxB,aAAa,EAAE,uBAAa,CAAC,SAAS;iBACvC,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,kBAAkB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;KAAA;IAEa,sBAAsB;;YAClC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,GAAG,MAAM,IAAA,2BAAmB,EAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACnH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC9E,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,GAAG,IAAA,uBAAe,EAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC9F,MAAM,2BAA2B,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC;gBACzE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS;gBAC7B,CAAC,CAAC,IAAA,uBAAe,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,MAAM,kBAAkB,GAAG,IAAA,+BAAgB,EACzC;gBACE,eAAe,EAAE,kBAAkB;aACpC,EACD;gBACE,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,IAAI,CAAC,KAAK;gBACpB,YAAY,EAAE,mBAAmB;gBACjC,oBAAoB,EAAE,2BAA2B;gBACjD,IAAI,EAAE,4BAAkB;gBACxB,aAAa,EAAE,uBAAa,CAAC,SAAS;aACvC,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,oBAAoB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAClF,CAAC;KAAA;IAEa,4BAA4B;6DAAC,cAA+B,EAAE;;YAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,OAAO,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEzF,MAAM,QAAQ,GACZ,WAAW,CAAC,MAAM,KAAK,CAAC;gBACtB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;gBAC/C,CAAC,CAAC,IAAI,oBAAY,CAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACvF,MAAM,mBAAmB,GAA6B,EAAE,CAAC;YACzD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,SAAS;gBACX,CAAC;gBAED,MAAM,yBAAyB,GAAG,IAAA,6BAAqB,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEhH,IAAI,CAAC,CAAC,MAAM,IAAA,4BAAoB,EAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,yBAAyB,CAAC,CAAC,EAAE,CAAC;oBAChG,mBAAmB,CAAC,IAAI,CAAC,CAAC,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC;YAED,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,EAAE,cAAc,CAAC,EAAE,EAAE;gBAC1E,MAAM,wBAAwB,GAAG,IAAA,qCAAsB,EACrD;oBACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,EACD;oBACE,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;oBAC7C,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,OAAO,EAAE,cAAc;oBACvB,kBAAkB,EAAE,yBAAyB;oBAC7C,IAAI,EAAE,4BAAkB;oBACxB,aAAa,EAAE,uBAAa,CAAC,SAAS;iBACvC,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;gBAChD,IAAI,CAAC,cAAc,CAAC,OAAO,CACzB,0BAA0B,yBAAyB,CAAC,QAAQ,EAAE,QAAQ,cAAc,GAAG,CACxF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;IAEO,0BAA0B;QAChC,MAAM,yBAAyB,GAAG,IAAA,6BAAqB,EACrD,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CAAC,OAAO,EACpB,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC,CAAC,CAAC,CAAC;QAEL,MAAM,sBAAsB,GAAG,IAAA,mCAAoB,EACjD;YACE,QAAQ,EAAE,IAAI,CAAC,KAAK;YACpB,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAC7C,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,oBAAoB,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;YACrD,kBAAkB,EAAE,yBAAyB;YAC7C,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW;YAChE,oBAAoB,EAAE,IAAI,CAAC,uBAAuB;YAClD,sBAAsB,EAAE,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE;YACrE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE;SACtD,EACD,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5B,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAEO,mBAAmB,CAAC,KAAa;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAA,4BAAoB,EAAC,KAAK,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,oBAAoB,KAAK,GAAG,CAAC,CAAC;IACzD,CAAC;IAEa,SAAS,CAAC,MAAkB;;;YACxC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAgB,CAAC,KAAI,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,CAAC,wBAAgB,CAAC,CAAA,EAAE,CAAC;gBACvF,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAgB,CAAC,EAAE,CAAC;gBACjH,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBAElH,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,MAAM,CAAC,EAAE,wBAAwB,CAAC,GAAG,IAAA,yDAAiD,EACpF,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAC/B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,EACvC,IAAI,CAAC,uBAAuB,CAC7B,CAAC;oBAEF,IAAI,IAAI,CAAC,SAAS,KAAK,sBAAc,EAAE,CAAC;wBACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;wBAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;oBACrE,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;wBAChD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,0BAA0B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC3B,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBAElH,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,CAAC;gBAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,MAAM,CAAC,EAAE,wBAAwB,CAAC,GAAG,IAAA,yDAAiD,EACpF,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,EACtC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE,EAC9C,IAAI,CAAC,uBAAuB,CAC7B,CAAC;oBACF,IAAI,IAAI,CAAC,SAAS,KAAK,sBAAc,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAgB,CAAC,EAAE,CAAC;wBAC5E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;wBAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBACzF,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;wBAChD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,iBAAiB,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAC3F,CAAC;gBACH,CAAC;gBAED,MAAM,yBAAyB,GAAG,MAAM,IAAI,CAAC,YAAY;qBACtD,aAAa,EAAE;qBACf,cAAc,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBACrD,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAC/B,MAAM,CAAC,EAAE,6BAA6B,CAAC,GAAG,IAAA,yDAAiD,EACzF,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,EACnC,IAAI,CAAC,KAAK,EACV,4BAAgB,EAChB,IAAI,CAAC,4BAA4B,CAClC,CAAC;oBAEF,IAAI,IAAI,CAAC,SAAS,KAAK,sBAAc,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAgB,CAAC,EAAE,CAAC;wBAC5E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;wBACnD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBACxG,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;wBACrD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,2BAA2B,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAC1G,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YAED,IACE,MAAM,KAAK,kBAAkB;gBAC7B,CAAC,MAAM,KAAK,kBAAkB,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,CAAC,wBAAgB,CAAC,CAAA,CAAC,EAChF,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;gBACtF,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBACzB,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,CAAC;gBAED,MAAM,8BAA8B,GAAG,MAAM,IAAI,CAAC,YAAY;qBAC3D,aAAa,EAAE;qBACf,cAAc,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAEtD,IAAI,CAAC,8BAA8B,EAAE,CAAC;oBACpC,MAAM,CAAC,EAAE,wBAAwB,CAAC,GAAG,IAAA,yDAAiD,EACpF,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,EACtC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE,EAC9C,IAAI,CAAC,6BAA6B,CACnC,CAAC;oBAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;oBAChD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,gCAAgC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC7E,CAAC;YACH,CAAC;YAED,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gBACxG,MAAM,oBAAoB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBAElH,kCAAkC;gBAClC,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,MAAM,CAAC,EAAE,wBAAwB,CAAC,GAAG,IAAA,yDAAiD,EACpF,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAC/B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,EACvC,IAAI,CAAC,uBAAuB,CAC7B,CAAC;oBACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;oBAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;YACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,MAAM,yBAAyB,GAAG,MAAM,IAAI,CAAC,YAAY;qBACtD,aAAa,EAAE;qBACf,cAAc,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAErD,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAC/B,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;oBAC1D,MAAM,CAAC,EAAE,6BAA6B,CAAC,GAAG,IAAA,yDAAiD,EACzF,IAAI,CAAC,KAAK,EACV,oBAAoB,EACpB,IAAI,CAAC,KAAK,EACV,4BAAgB,EAChB,IAAI,CAAC,4BAA4B,CAClC,CAAC;oBAEF,IAAI,IAAI,CAAC,SAAS,KAAK,sBAAc,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAgB,CAAC,EAAE,CAAC;wBAC5E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;wBACnD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,2BAA2B,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBACxG,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;wBACrD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,2BAA2B,IAAI,CAAC,4BAA4B,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAC1G,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAEa,iBAAiB,CAAC,MAAkB;;;YAChD,MAAM,MAAM,GAAkC,EAAE,CAAC;YACjD,MAAM,OAAO,GAAkC,EAAE,CAAC;YAClD,MAAM,YAAY,GAAkB,EAAE,CAAC;YACvC,MAAM,aAAa,GAAkB,EAAE,CAAC;YAExC,IAAI,MAAM,KAAK,kBAAkB,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gBACnE,OAAO;YACT,CAAC;YAED,IAAI,SAAS,GAAG,IAAI,eAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,UAAU,IAAI,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,eAAE,CAAC,eAAO,CAAC,CAAC,EAAE,CAAC;gBAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAC/C,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAChF,CAAC;gBAEF,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,KAAK,CAAC,iDAAiD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACzG,CAAC;gBAED,MAAM,8BAA8B,GAAG,6BAAgB,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;gBACxF,MAAM,2BAA2B,GAAG,IAAI,CAAC,OAAO,CAAC,gCAAgC,CAC/E,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACvC,CAAC;gBACF,iEAAiE;gBACjE,SAAS,GAAG,IAAI,eAAE,CAChB,IAAI,CAAC,KAAK,CACR,6BAAgB,CAAC,eAAe,CAAC,MAAM,CAAC;qBACrC,GAAG,CAAC,2BAA2B,CAAC;qBAChC,GAAG,CAAC,8BAA8B,CAAC;qBACnC,GAAG,CAAC,IAAI,oBAAO,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC,CAAC;qBACrD,QAAQ,EAAE,CACd,CAAC,QAAQ,EAAE,CACb,CAAC;YACJ,CAAC;YAED,IAAI,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,CAAC;YAC3D,IAAI,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,CAAC,wBAAgB,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;gBACtF,CAAC;gBACD,uBAAuB,GAAG,IAAI,CAAC,6BAA6B,CAAC;YAC/D,CAAC;YAED,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;YAE5G,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,iCAAiC,CAAC,GAAG,CAAC,CAAC;YAElG,wGAAwG;YACxG,MAAM,UAAU,GACd,MAAM,KAAK,SAAS;gBACpB,MAAM,KAAK,OAAO;gBAClB,MAAM,KAAK,MAAM;gBACjB,CAAC,MAAM,KAAK,WAAW,KAAI,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,CAAC,wBAAgB,CAAC,CAAA,CAAC,CAAC,CAAC,wEAAwE;YAEpJ,MAAM,kBAAkB,GAAG,uBAAa,CAAC,QAAQ,CAAC;gBAChD,UAAU,EAAE,IAAI,CAAC,KAAK;gBACtB,QAAQ,EAAE,uBAAuB;gBACjC,QAAQ,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACzG,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAChC,YAAY,CAAC,IAAI,CAAC,gCAAgC,uBAAuB,GAAG,CAAC,CAAC;YAE9E,MAAM,kBAAkB,GAAG,IAAA,yCAA6B,EACtD,uBAAuB,EACvB,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,KAAK,EACV,EAAE,EACF,4BAAgB,CACjB,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,uBAAuB,CAAC,CAAC;YACnD,IAAI,mBAAmB,EAAE,CAAC;gBACxB,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpB,YAAY,CAAC,IAAI,CAAC,kBAAkB,uBAAuB,GAAG,CAAC,CAAC;gBAClE,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBACjC,aAAa,CAAC,IAAI,CAAC,mBAAmB,uBAAuB,GAAG,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,EAAE,uBAAuB,CAAC,GAAG,IAAA,yDAAiD,EACnF,IAAI,CAAC,KAAK,EACV,uBAAW,EACX,IAAI,CAAC,KAAK,EACV,4BAAgB,EAChB,uBAAuB,CACxB,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;gBACrC,YAAY,CAAC,IAAI,CAAC,oBAAoB,uBAAuB,GAAG,CAAC,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpB,YAAY,CAAC,IAAI,CAAC,kBAAkB,uBAAuB,GAAG,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACjC,aAAa,CAAC,IAAI,CAAC,mBAAmB,uBAAuB,GAAG,CAAC,CAAC;YACpE,CAAC;YAED,wGAAwG;YACxG,4DAA4D;YAC5D,oCAAoC;YACpC,gDAAgD;YAChD,sCAAsC;YACtC,kDAAkD;YAClD,WAAW;YACX,IAAI;YACJ,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;QAC/C,CAAC;KAAA;IAED,MAAM,CAAO,0BAA0B;6DACrC,YAA0B,EAC1B,MAAkB,EAClB,YAAyB,EACzB,eAA0B,EAC1B,gBAA2B,EAC3B,KAAgB,EAChB,eAA0B,EAC1B,UAA6C,EAC7C,aAA2B,EAC3B,WAAsB,mBAAS,CAAC,OAAO,EACvC,cAAsB,CAAC;YAEvB,MAAM,aAAa,GAAG,YAAY,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACrE,MAAM,cAAc,GAAG,YAAY,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;YAEvE,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;YAED,MAAM,EACJ,uBAAuB,EAAE,8BAA8B,EACvD,4BAA4B,EAAE,mCAAmC,GAClE,GAAG,YAAY,CAAC,uBAAuB,CAAC,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;YAEtE,MAAM,EACJ,uBAAuB,EAAE,6BAA6B,EACtD,4BAA4B,EAAE,kCAAkC,GACjE,GAAG,YAAY,CAAC,uBAAuB,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;YAErE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,oBAAoB,EAAE,GAC/E,MAAM,YAAY,CAAC,cAAc,CAC/B,MAAM,EACN,YAAY,EACZ,eAAe,EACf,aAAa,CAAC,OAAO,EACrB,UAAU,EACV,cAAc,CAAC,OAAO,CACvB,CAAC;YACJ,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAE/F,IAAI,uBAAkC,CAAC;YACvC,IAAI,4BAAuC,CAAC;YAC5C,IAAI,iCAA4C,CAAC;YACjD,IAAI,aAAwB,CAAC;YAC7B,IAAI,WAAsB,CAAC;YAE3B,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;gBAC3B,uBAAuB,GAAG,8BAA8B,CAAC;gBACzD,4BAA4B,GAAG,mCAAmC,CAAC;gBACnE,iCAAiC,GAAG,6BAA6B,CAAC;gBAClE,WAAW,GAAG,gBAAgB,CAAC;gBAC/B,aAAa,GAAG,eAAe,CAAC;YAClC,CAAC;iBAAM,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gBACzC,uBAAuB,GAAG,6BAA6B,CAAC;gBACxD,4BAA4B,GAAG,kCAAkC,CAAC;gBAClE,iCAAiC,GAAG,8BAA8B,CAAC;gBACnE,WAAW,GAAG,eAAe,CAAC;gBAC9B,aAAa,GAAG,gBAAgB,CAAC;YACnC,CAAC;iBAAM,IAAI,MAAM,KAAK,kBAAkB,EAAE,CAAC;gBACzC,WAAW,GAAG,eAAe,CAAC;gBAC9B,aAAa,GAAG,gBAAgB,CAAC;gBACjC,uBAAuB,GAAG,6BAA6B,CAAC;gBACxD,4BAA4B,GAAG,mCAAmC,CAAC;gBACnE,iCAAiC,GAAG,8BAA8B,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;YACpC,CAAC;YAED,OAAO,IAAI,YAAY,CACrB,YAAY,EACZ,KAAK,EACL,gBAAgB,IAAI,UAAU,EAC9B,uBAAuB,EACvB,4BAA4B,EAC5B,WAAW,EACX,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,aAAa,EACb,WAAW,EACX,aAAa,EACb,iCAAiC,EACjC,cAAc,EACd,aAAa,EACb,WAAW,CACZ,CAAC;QACJ,CAAC;KAAA;IAED,MAAM,CAAO,8BAA8B;6DACzC,IAAe,EACf,KAAgB,EAChB,YAA0B,EAC1B,cAAsB,CAAC;YAEvB,MAAM,OAAO,GAAG,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,wBAAwB,YAAY,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACjG,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,IAAA,sCAA8B,EACnE,YAAY,CAAC,aAAa,EAAE,EAC5B,KAAK,EACL,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,EAC5B,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CACrC,CAAC;YAEF,MAAM,uBAAuB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAExC,OAAO;gBACL,GAAG,EAAE,IAAI,YAAY,CACnB,YAAY,EACZ,KAAK,EACL,IAAI,kCAAiB,CAAC,YAAY,CAAC,SAAS,CAAC,EAC7C,uBAAuB,EACvB,mBAAS,CAAC,OAAO,EACjB,IAAI,EACJ,CAAC,EACD,IAAI,eAAE,CAAC,CAAC,CAAC,EACT,EAAE,EACF,EAAE,EACF,OAAO,EACP,WAAW,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,CACV;gBACD,cAAc;aACf,CAAC;QACJ,CAAC;KAAA;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,UAAU;YACpB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB;YACnC,CAAC,CAAC,IAAI,CAAC,cAAe,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7E,CAAC;IAED,gCAAgC;QAC9B,MAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,CAAC;QAEjD,iGAAiG;QACjG,uCAAuC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,8BAA8B,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpE,MAAM,uBAAuB,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC;YAEvE,kFAAkF;YAClF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,EAAE;gBACzD,OAAO,cAAc,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YAEH,sFAAsF;YACtF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAEO,MAAM,CAAO,cAAc,CACjC,YAA0B,EAC1B,KAAgB,EAChB,gBAAyC,EACzC,QAAmB;;YAEnB,IAAI,WAAW,GAAG,QAAQ,CAAC;YAC3B,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,CAAC,mBAAS,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;oBAC9B,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;oBACpE,IAAI,YAAY,EAAE,CAAC;wBACjB,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC;oBACtC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAChD,CAAC;YACH,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC;KAAA;CACF;AA1sFD,oCA0sFC","sourcesContent":["import {\n Connection,\n PublicKey,\n RpcResponseAndContext,\n SimulatedTransactionResponse,\n SystemProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n Transaction,\n TransactionInstruction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n NATIVE_MINT,\n TOKEN_PROGRAM_ID,\n createCloseAccountInstruction,\n} from '@solana/spl-token';\nimport BN from 'bn.js';\nimport Decimal from 'decimal.js';\nimport {\n borrowObligationLiquidity,\n depositObligationCollateral,\n depositReserveLiquidity,\n depositReserveLiquidityAndObligationCollateral,\n initObligation,\n initObligationFarmsForReserve,\n InitObligationFarmsForReserveAccounts,\n InitObligationFarmsForReserveArgs,\n initReferrerTokenState,\n initUserMetadata,\n liquidateObligationAndRedeemReserveCollateral,\n redeemReserveCollateral,\n refreshObligation,\n refreshObligationFarmsForReserve,\n RefreshObligationFarmsForReserveAccounts,\n RefreshObligationFarmsForReserveArgs,\n refreshReserve,\n repayObligationLiquidity,\n requestElevationGroup,\n RequestElevationGroupAccounts,\n RequestElevationGroupArgs,\n withdrawObligationCollateralAndRedeemReserveCollateral,\n withdrawReferrerFees,\n} from '../idl_codegen/instructions';\nimport {\n buildComputeBudgetIx,\n createAssociatedTokenAccountIdempotentInstruction,\n ObligationType,\n syncNative,\n U64_MAX,\n referrerTokenStatePda,\n userMetadataPda,\n getAtasWithCreateIxnsIfMissing,\n checkIfAccountExists,\n createLookupTableIx,\n isNotNullPubkey,\n PublicKeySet,\n WRAPPED_SOL_MINT,\n getAssociatedTokenAddress,\n ScopeRefresh,\n} from '../utils';\nimport { KaminoMarket } from './market';\nimport { KaminoObligation } from './obligation';\nimport { KaminoReserve } from './reserve';\nimport { ReserveFarmKind } from '../idl_codegen/types';\nimport { farmsId } from '@hubbleprotocol/farms-sdk';\nimport { Reserve } from '../idl_codegen/accounts';\nimport { VanillaObligation } from '../utils/ObligationType';\nimport { PROGRAM_ID } from '../lib';\nimport { U16_MAX } from '@hubbleprotocol/scope-sdk';\n\nexport const POSITION_LIMIT = 10;\nexport const BORROWS_LIMIT = 5;\nexport const DEPOSITS_LIMIT = 8;\n\nconst SOL_PADDING_FOR_INTEREST = new BN('1000000');\n\nexport type ActionType =\n | 'deposit'\n | 'borrow'\n | 'withdraw'\n | 'repay'\n | 'mint'\n | 'redeem'\n | 'depositCollateral'\n | 'liquidate'\n | 'depositAndBorrow'\n | 'repayAndWithdraw'\n | 'refreshObligation'\n | 'requestElevationGroup'\n | 'withdrawReferrerFees';\n\nexport type AuxiliaryIx = 'setup' | 'inBetween' | 'cleanup';\n\nexport class KaminoAction {\n kaminoMarket: KaminoMarket;\n\n reserve: KaminoReserve;\n\n outflowReserve: KaminoReserve | undefined;\n\n owner: PublicKey;\n payer: PublicKey;\n\n obligation: KaminoObligation | null = null;\n\n referrer: PublicKey;\n\n userTokenAccountAddress: PublicKey;\n\n userCollateralAccountAddress: PublicKey;\n\n additionalTokenAccountAddress?: PublicKey;\n\n /**\n * Null unless the obligation is not passed\n */\n obligationType: ObligationType | null = null;\n\n mint: PublicKey;\n\n secondaryMint?: PublicKey;\n\n positions?: number;\n\n amount: BN;\n outflowAmount?: BN;\n\n setupIxs: Array<TransactionInstruction>;\n setupIxsLabels: Array<string>;\n\n inBetweenIxs: Array<TransactionInstruction>;\n inBetweenIxsLabels: Array<string>;\n\n lendingIxs: Array<TransactionInstruction>;\n lendingIxsLabels: Array<string>;\n\n cleanupIxs: Array<TransactionInstruction>;\n cleanupIxsLabels: Array<string>;\n\n preTxnIxs: Array<TransactionInstruction>;\n preTxnIxsLabels: Array<string>;\n\n postTxnIxs: Array<TransactionInstruction>;\n postTxnIxsLabels: Array<string>;\n\n refreshFarmsCleanupTxnIxs: Array<TransactionInstruction>;\n refreshFarmsCleanupTxnIxsLabels: Array<string>;\n\n depositReserves: Array<PublicKey>;\n borrowReserves: Array<PublicKey>;\n\n preLoadedDepositReservesSameTx: Array<PublicKey>;\n preLoadedBorrowReservesSameTx: Array<PublicKey>;\n\n currentSlot: number;\n\n private constructor(\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType | null,\n userTokenAccountAddress: PublicKey,\n userCollateralAccountAddress: PublicKey,\n mint: PublicKey,\n positions: number,\n amount: string | BN,\n depositReserves: Array<PublicKey>,\n borrowReserves: Array<PublicKey>,\n reserveState: KaminoReserve,\n currentSlot: number,\n secondaryMint?: PublicKey,\n additionalTokenAccountAddress?: PublicKey,\n outflowReserveState?: KaminoReserve,\n outflowAmount?: string | BN,\n referrer?: PublicKey,\n payer?: PublicKey\n ) {\n if (obligation instanceof KaminoObligation) {\n this.obligation = obligation;\n } else if (obligation !== null) {\n this.obligationType = obligation;\n }\n\n this.kaminoMarket = kaminoMarket;\n this.owner = owner;\n this.payer = payer ?? owner;\n this.amount = new BN(amount);\n this.mint = mint;\n this.positions = positions;\n this.userTokenAccountAddress = userTokenAccountAddress;\n this.userCollateralAccountAddress = userCollateralAccountAddress;\n this.setupIxs = [];\n this.setupIxsLabels = [];\n this.inBetweenIxs = [];\n this.inBetweenIxsLabels = [];\n this.lendingIxs = [];\n this.lendingIxsLabels = [];\n this.cleanupIxs = [];\n this.cleanupIxsLabels = [];\n this.preTxnIxs = [];\n this.preTxnIxsLabels = [];\n this.postTxnIxs = [];\n this.postTxnIxsLabels = [];\n this.refreshFarmsCleanupTxnIxs = [];\n this.refreshFarmsCleanupTxnIxsLabels = [];\n this.depositReserves = depositReserves;\n this.borrowReserves = borrowReserves;\n this.additionalTokenAccountAddress = additionalTokenAccountAddress;\n this.secondaryMint = secondaryMint;\n this.reserve = reserveState;\n this.outflowReserve = outflowReserveState;\n this.outflowAmount = outflowAmount ? new BN(outflowAmount) : undefined;\n this.preLoadedDepositReservesSameTx = [];\n this.preLoadedBorrowReservesSameTx = [];\n this.referrer = referrer ? referrer : PublicKey.default;\n this.currentSlot = currentSlot;\n }\n\n static async initialize(\n action: ActionType,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n kaminoMarket: KaminoMarket,\n obligation: KaminoObligation | ObligationType,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n payer?: PublicKey\n ) {\n const reserve = kaminoMarket.getReserveByMint(mint);\n if (reserve === undefined) {\n throw new Error(`Reserve ${mint} not found in market ${kaminoMarket.getAddress().toBase58()}`);\n }\n\n const { userTokenAccountAddress, userCollateralAccountAddress } = KaminoAction.getUserAccountAddresses(\n payer ?? owner,\n reserve.state\n );\n\n const { kaminoObligation, depositReserves, borrowReserves, distinctReserveCount } =\n await KaminoAction.loadObligation(action, kaminoMarket, owner, reserve.address, obligation);\n\n const referrerKey = await this.getReferrerKey(kaminoMarket, owner, kaminoObligation, referrer);\n\n return new KaminoAction(\n kaminoMarket,\n owner,\n kaminoObligation || obligation,\n userTokenAccountAddress,\n userCollateralAccountAddress,\n mint,\n distinctReserveCount,\n amount,\n depositReserves,\n borrowReserves,\n reserve,\n currentSlot,\n undefined,\n undefined,\n undefined,\n undefined,\n referrerKey,\n payer\n );\n }\n\n private static getUserAccountAddresses(owner: PublicKey, reserve: Reserve) {\n const userTokenAccountAddress = getAssociatedTokenAddress(\n reserve.liquidity.mintPubkey,\n owner,\n true,\n reserve.liquidity.tokenProgram,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n const userCollateralAccountAddress = getAssociatedTokenAddress(\n reserve.collateral.mintPubkey,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n return { userTokenAccountAddress, userCollateralAccountAddress };\n }\n\n private static async loadObligation(\n action: ActionType,\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n reserve: PublicKey,\n obligation: KaminoObligation | ObligationType,\n outflowReserve?: PublicKey\n ) {\n let kaminoObligation: KaminoObligation | null;\n const depositReserves: Array<PublicKey> = [];\n const borrowReserves: Array<PublicKey> = [];\n if (obligation instanceof KaminoObligation) {\n kaminoObligation = obligation;\n } else {\n const obligationAddress = obligation.toPda(kaminoMarket.getAddress(), owner);\n kaminoObligation = await KaminoObligation.load(kaminoMarket, obligationAddress);\n }\n if (kaminoObligation !== null) {\n depositReserves.push(...[...kaminoObligation.deposits.keys()]);\n borrowReserves.push(...[...kaminoObligation.borrows.keys()]);\n }\n\n if (!outflowReserve && action === 'depositAndBorrow') {\n throw new Error(`Outflow reserve has not been set for depositAndBorrow`);\n }\n\n // Union of addresses\n const distinctReserveCount =\n new PublicKeySet<PublicKey>([\n ...borrowReserves.map((e) => e),\n ...(action === 'borrow' ? [reserve] : []),\n ...(action === 'depositAndBorrow' ? [reserve] : []),\n ]).toArray().length +\n new PublicKeySet<PublicKey>([\n ...depositReserves.map((e) => e),\n ...(action === 'deposit' ? [reserve] : []),\n ...(action === 'depositAndBorrow' ? [outflowReserve!] : []),\n ]).toArray().length;\n\n if (distinctReserveCount > POSITION_LIMIT) {\n throw Error(`Obligation already has max number of positions: ${POSITION_LIMIT}`);\n }\n\n return {\n kaminoObligation,\n depositReserves,\n borrowReserves,\n distinctReserveCount,\n };\n }\n\n static async buildRefreshObligationTxns(\n kaminoMarket: KaminoMarket,\n payer: PublicKey,\n obligation: KaminoObligation,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n currentSlot: number = 0\n ) {\n // placeholder for action initialization\n const firstReserve = obligation.state.deposits[0].depositReserve;\n const firstKaminoReserve = kaminoMarket.getReserveByAddress(firstReserve);\n if (!firstKaminoReserve) {\n throw new Error(`Reserve ${firstReserve.toBase58()} not found`);\n }\n const axn = await KaminoAction.initialize(\n 'refreshObligation',\n '0',\n firstKaminoReserve?.getLiquidityMint(),\n obligation.state.owner,\n kaminoMarket,\n obligation,\n undefined,\n currentSlot\n );\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n axn.addRefreshObligation(payer);\n\n return axn;\n }\n\n static async buildRequestElevationGroupTxns(\n kaminoMarket: KaminoMarket,\n payer: PublicKey,\n obligation: KaminoObligation,\n elevationGroup: number,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n currentSlot: number = 0\n ) {\n const firstReserve = obligation.state.deposits.find(\n (x) => !x.depositReserve.equals(PublicKey.default)\n )!.depositReserve;\n const firstKaminoReserve = kaminoMarket.getReserveByAddress(firstReserve);\n if (!firstKaminoReserve) {\n throw new Error(`Reserve ${firstReserve.toBase58()} not found`);\n }\n const axn = await KaminoAction.initialize(\n 'requestElevationGroup',\n '0',\n firstKaminoReserve?.getLiquidityMint(),\n obligation.state.owner,\n kaminoMarket,\n obligation,\n undefined,\n currentSlot\n );\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n axn.addRefreshObligation(payer);\n axn.addRequestElevationIx(elevationGroup, 'setup');\n\n return axn;\n }\n\n static async buildDepositTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' },\n overrideElevationGroupRequest: number | undefined = undefined // if set, when an elevationgroup request is made, it will use this value\n ) {\n const axn = await KaminoAction.initialize(\n 'deposit',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n await axn.addSupportIxs(\n 'deposit',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm,\n undefined,\n overrideElevationGroupRequest\n );\n axn.addDepositIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n getTokenIdsForScopeRefresh(kaminoMarket: KaminoMarket, reserves: PublicKey[]): number[] {\n const tokenIds: number[] = [];\n\n for (const reserveAddress of reserves) {\n const reserve = kaminoMarket.getReserveByAddress(reserveAddress);\n if (!reserve) {\n throw new Error(`Reserve not found for reserve ${reserveAddress.toBase58()}`);\n }\n\n if (!reserve.state.config.tokenInfo.scopeConfiguration.priceFeed.equals(PublicKey.default)) {\n reserve.state.config.tokenInfo.scopeConfiguration.priceChain.map((x) => {\n if (x !== U16_MAX) {\n tokenIds.push(x);\n }\n });\n reserve.state.config.tokenInfo.scopeConfiguration.twapChain.map((x) => {\n if (x !== U16_MAX) {\n tokenIds.push(x);\n }\n });\n }\n }\n\n return tokenIds;\n }\n\n async addScopeRefreshIxs(tokens: number[], feed: string = 'hubble') {\n this.preTxnIxsLabels.unshift(`refreshScopePrices`);\n this.preTxnIxs.unshift(\n await this.kaminoMarket.scope.refreshPriceListIx(\n {\n feed: feed,\n },\n tokens\n )\n );\n }\n\n static async buildBorrowTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' },\n overrideElevationGroupRequest: number | undefined = undefined // if set, when an elevationgroup request is made, it will use this value\n ) {\n const axn = await KaminoAction.initialize(\n 'borrow',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'borrow',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm,\n undefined,\n overrideElevationGroupRequest\n );\n axn.addBorrowIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildDepositReserveLiquidityTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'mint',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'mint',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositReserveLiquidityIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildRedeemReserveCollateralTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'redeem',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'redeem',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addRedeemReserveCollateralIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildDepositObligationCollateralTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'depositCollateral',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'depositCollateral',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositObligationCollateralIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildDepositAndBorrowTxns(\n kaminoMarket: KaminoMarket,\n depositAmount: string | BN,\n depositMint: PublicKey,\n borrowAmount: string | BN,\n borrowMint: PublicKey,\n payer: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'depositAndBorrow',\n depositAmount,\n depositMint,\n borrowMint,\n payer,\n payer,\n obligation,\n borrowAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarmForDeposit = true;\n const addInitObligationForFarmForBorrow = false;\n const twoTokenAction = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n axn.outflowReserve!.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'deposit',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarmForDeposit,\n twoTokenAction\n );\n await axn.addDepositAndBorrowIx();\n await axn.addInBetweenIxs(\n 'depositAndBorrow',\n includeAtaIxns,\n requestElevationGroup,\n addInitObligationForFarmForBorrow\n );\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildRepayAndWithdrawTxns(\n kaminoMarket: KaminoMarket,\n repayAmount: string | BN,\n repayMint: PublicKey,\n withdrawAmount: string | BN,\n withdrawMint: PublicKey,\n payer: PublicKey,\n currentSlot: number,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n isClosingPosition: boolean = false,\n referrer: PublicKey = PublicKey.default,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'repayAndWithdraw',\n repayAmount,\n repayMint,\n withdrawMint,\n payer,\n payer,\n obligation,\n withdrawAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarmForRepay = true;\n const addInitObligationForFarmForWithdraw = false;\n const twoTokenAction = true;\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n axn.outflowReserve!.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'repay',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarmForRepay,\n twoTokenAction\n );\n await axn.addRepayAndWithdrawIxs();\n await axn.addInBetweenIxs(\n 'repayAndWithdraw',\n includeAtaIxns,\n requestElevationGroup,\n addInitObligationForFarmForWithdraw,\n isClosingPosition\n );\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildWithdrawTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'withdraw',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'withdraw',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addWithdrawIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n /**\n *\n * @param kaminoMarket\n * @param amount\n * @param mint\n * @param owner\n * @param obligation - obligation to repay or the PDA seeds\n * @param currentSlot\n * @param payer - if not set then owner is used\n * @param extraComputeBudget - if > 0 then adds the ixn\n * @param includeAtaIxns - if true it includes create and close wsol and token atas\n * @param requestElevationGroup\n * @param includeUserMetadata - if true it includes user metadata\n * @param referrer\n */\n static async buildRepayTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n currentSlot: number,\n payer: PublicKey | undefined = undefined,\n extraComputeBudget: number = 1_000_000,\n includeAtaIxns: boolean = true,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true,\n referrer: PublicKey = PublicKey.default,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'repay',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot,\n payer\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'repay',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addRepayIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildLiquidateTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n minCollateralReceiveAmount: string | BN,\n repayTokenMint: PublicKey,\n withdrawTokenMint: PublicKey,\n liquidator: PublicKey,\n obligationOwner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas, and creates all other token atas if they don't exist\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n maxAllowedLtvOverridePercent: number = 0,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'liquidate',\n amount,\n repayTokenMint,\n withdrawTokenMint,\n liquidator,\n obligationOwner,\n obligation,\n minCollateralReceiveAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n axn.outflowReserve!.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'liquidate',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addLiquidateIx(maxAllowedLtvOverridePercent);\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildWithdrawReferrerFeeTxns(\n owner: PublicKey,\n tokenMint: PublicKey,\n kaminoMarket: KaminoMarket,\n currentSlot: number = 0\n ) {\n const { axn, createAtasIxns } = await KaminoAction.initializeWithdrawReferrerFees(\n tokenMint,\n owner,\n kaminoMarket,\n currentSlot\n );\n\n axn.preTxnIxs.push(...createAtasIxns);\n axn.preTxnIxsLabels.push(`createAtasIxs[${axn.userTokenAccountAddress.toString()}]`);\n\n axn.addRefreshReserveIxs([axn.reserve.address]);\n axn.addWithdrawReferrerFeesIxs();\n\n return axn;\n }\n\n async getTransactions() {\n const txns: {\n preLendingTxn: Transaction | null;\n lendingTxn: Transaction | null;\n postLendingTxn: Transaction | null;\n } = {\n preLendingTxn: null,\n lendingTxn: null,\n postLendingTxn: null,\n };\n\n if (this.preTxnIxs.length) {\n txns.preLendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.preTxnIxs);\n }\n\n if (this.lendingIxs.length === 2) {\n txns.lendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(\n ...this.setupIxs,\n ...[this.lendingIxs[0]],\n ...this.inBetweenIxs,\n ...[this.lendingIxs[1]],\n ...this.cleanupIxs\n );\n } else {\n txns.lendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.setupIxs, ...this.lendingIxs, ...this.cleanupIxs);\n }\n\n if (this.postTxnIxs.length) {\n txns.postLendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.postTxnIxs);\n }\n\n return txns;\n }\n\n async sendTransactions(sendTransaction: (txn: Transaction, connection: Connection) => Promise<TransactionSignature>) {\n const txns = await this.getTransactions();\n\n await this.sendSingleTransaction(txns.preLendingTxn, sendTransaction);\n\n const signature = await this.sendSingleTransaction(txns.lendingTxn, sendTransaction);\n\n await this.sendSingleTransaction(txns.postLendingTxn, sendTransaction);\n\n return signature;\n }\n\n private async sendSingleTransaction(\n txn: Transaction | null,\n sendTransaction: (txn: Transaction, connection: Connection) => Promise<TransactionSignature>\n ) {\n if (!txn) return '';\n\n const signature = await sendTransaction(txn, this.kaminoMarket.getConnection());\n await this.kaminoMarket.getConnection().confirmTransaction(signature);\n\n return signature;\n }\n\n async simulateTransactions(\n sendTransaction: (\n txn: Transaction,\n connection: Connection\n ) => Promise<RpcResponseAndContext<SimulatedTransactionResponse>>\n ) {\n const txns = await this.getTransactions();\n\n await this.simulateSingleTransaction(txns.preLendingTxn, sendTransaction);\n\n const signature = await this.simulateSingleTransaction(txns.lendingTxn, sendTransaction);\n\n await this.simulateSingleTransaction(txns.postLendingTxn, sendTransaction);\n\n return signature;\n }\n\n private async simulateSingleTransaction(\n txn: Transaction | null,\n sendTransaction: (\n txn: Transaction,\n connection: Connection\n ) => Promise<RpcResponseAndContext<SimulatedTransactionResponse>>\n ) {\n if (!txn) return '';\n return await sendTransaction(txn, this.kaminoMarket.getConnection());\n }\n\n addDepositIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidityAndObligationCollateral`);\n this.lendingIxs.push(\n depositReserveLiquidityAndObligationCollateral(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral\n userSourceLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addDepositReserveLiquidityIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidity`);\n this.lendingIxs.push(\n depositReserveLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n userDestinationCollateral: this.userCollateralAccountAddress,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addRedeemReserveCollateralIx() {\n this.lendingIxsLabels.push(`redeemReserveCollateral`);\n this.lendingIxs.push(\n redeemReserveCollateral(\n {\n collateralAmount: this.amount,\n },\n {\n owner: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n userSourceCollateral: this.userCollateralAccountAddress,\n userDestinationLiquidity: this.userTokenAccountAddress,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addDepositObligationCollateralIx() {\n this.lendingIxsLabels.push(`depositObligationCollateral`);\n this.lendingIxs.push(\n depositObligationCollateral(\n {\n collateralAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n depositReserve: this.reserve.address,\n reserveDestinationCollateral: this.reserve.state.collateral.supplyVault,\n userSourceCollateral: this.userCollateralAccountAddress,\n tokenProgram: TOKEN_PROGRAM_ID,\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addBorrowIx() {\n this.lendingIxsLabels.push(`borrowObligationLiquidity`);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowIx = borrowObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n borrowReserve: this.reserve.address,\n borrowReserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveSourceLiquidity: this.reserve.state.liquidity.supplyVault,\n userDestinationLiquidity: this.userTokenAccountAddress,\n borrowReserveLiquidityFeeReceiver: this.reserve.state.liquidity.feeVault,\n referrerTokenState: referrerTokenStatePda(this.referrer, this.reserve.address, this.kaminoMarket.programId)[0],\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n borrowIx.keys =\n this.obligation!.state.elevationGroup > 0 || this.obligation!.refreshedStats.potentialElevationGroupUpdate > 0\n ? borrowIx.keys.concat([...depositReserveAccountMetas])\n : borrowIx.keys;\n this.lendingIxs.push(borrowIx);\n }\n\n async addDepositAndBorrowIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidityAndObligationCollateral`);\n this.lendingIxsLabels.push(`borrowObligationLiquidity`);\n this.lendingIxs.push(\n depositReserveLiquidityAndObligationCollateral(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral\n userSourceLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n\n if (!this.outflowReserve) {\n throw new Error(`outflowReserve not set`);\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`additionalTokenAccountAddress not set`);\n }\n\n if (!this.outflowAmount) {\n throw new Error(`outflowAmount not set`);\n }\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n if (depositReservesList.length === 0) {\n depositReservesList.push(this.reserve.address);\n }\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowIx = borrowObligationLiquidity(\n {\n liquidityAmount: this.outflowAmount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n borrowReserve: this.outflowReserve.address,\n borrowReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n reserveSourceLiquidity: this.outflowReserve.state.liquidity.supplyVault,\n userDestinationLiquidity: this.additionalTokenAccountAddress,\n borrowReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,\n referrerTokenState: referrerTokenStatePda(\n this.referrer,\n this.outflowReserve.address,\n this.kaminoMarket.programId\n )[0],\n tokenProgram: this.outflowReserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n borrowIx.keys = borrowIx.keys.concat([...depositReserveAccountMetas]);\n\n this.lendingIxs.push(borrowIx);\n }\n\n async addRepayAndWithdrawIxs() {\n this.lendingIxsLabels.push(\n `repayObligationLiquidity(reserve=${this.reserve!.address})(obligation=${this.getObligationPda()})`\n );\n this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n const repayIx = repayObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n repayReserve: this.reserve!.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n repayIx.keys = repayIx.keys.concat([...depositReserveAccountMetas]);\n\n this.lendingIxs.push(repayIx);\n if (!this.outflowReserve) {\n throw new Error(`outflowReserve not set`);\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`additionalTokenAccountAddress not set`);\n }\n\n if (!this.outflowAmount) {\n throw new Error(`outflowAmount not set`);\n }\n\n const collateralExchangeRate = this.outflowReserve.getEstimatedCollateralExchangeRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n\n this.lendingIxs.push(\n withdrawObligationCollateralAndRedeemReserveCollateral(\n {\n collateralAmount: this.outflowAmount.eq(new BN(U64_MAX))\n ? this.outflowAmount\n : new BN(new Decimal(this.outflowAmount.toString()).mul(collateralExchangeRate).ceil().toString()),\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n withdrawReserve: this.outflowReserve.address,\n reserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n reserveCollateralMint: this.outflowReserve.getCTokenMint(),\n reserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,\n reserveSourceCollateral: this.outflowReserve.state.collateral.supplyVault,\n userDestinationLiquidity: this.additionalTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n async addWithdrawIx() {\n const collateralExchangeRate = this.reserve.getEstimatedCollateralExchangeRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n\n const collateralAmount = this.amount.eq(new BN(U64_MAX))\n ? this.amount\n : new BN(new Decimal(this.amount.toString()).mul(collateralExchangeRate).ceil().toString());\n\n this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);\n this.lendingIxs.push(\n withdrawObligationCollateralAndRedeemReserveCollateral(\n {\n collateralAmount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n withdrawReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveSourceCollateral: this.reserve.state.collateral.supplyVault,\n userDestinationLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n async addRepayIx() {\n this.lendingIxsLabels.push(\n `repayObligationLiquidity(reserve=${this.reserve.address})(obligation=${this.getObligationPda()})`\n );\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const repayIx = repayObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.payer,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n repayReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n repayIx.keys =\n this.obligation!.state.elevationGroup > 0 ? repayIx.keys.concat([...depositReserveAccountMetas]) : repayIx.keys;\n\n this.lendingIxs.push(repayIx);\n }\n\n async addLiquidateIx(maxAllowedLtvOverridePercent: number = 0) {\n this.lendingIxsLabels.push(`liquidateObligationAndRedeemReserveCollateral`);\n if (!this.outflowReserve) {\n throw Error(`Withdraw reserve during liquidation is not defined`);\n }\n if (!this.additionalTokenAccountAddress) {\n throw Error(`Liquidating token account address is not defined`);\n }\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const liquidateIx = liquidateObligationAndRedeemReserveCollateral(\n {\n liquidityAmount: this.amount,\n // TODO: Configure this when updating liquidator with new interface\n minAcceptableReceivedLiquidityAmount: this.outflowAmount || new BN(0),\n maxAllowedLtvOverridePercent: new BN(maxAllowedLtvOverridePercent),\n },\n {\n liquidator: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n repayReserve: this.reserve.address,\n repayReserveLiquidityMint: this.reserve.getLiquidityMint(),\n repayReserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n withdrawReserve: this.outflowReserve.address,\n withdrawReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n withdrawReserveCollateralMint: this.outflowReserve.getCTokenMint(),\n withdrawReserveCollateralSupply: this.outflowReserve.state.collateral.supplyVault,\n withdrawReserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,\n userSourceLiquidity: this.additionalTokenAccountAddress,\n userDestinationCollateral: this.userCollateralAccountAddress,\n userDestinationLiquidity: this.userTokenAccountAddress,\n withdrawReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n repayLiquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n withdrawLiquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n liquidateIx.keys =\n this.obligation!.state.elevationGroup > 0\n ? liquidateIx.keys.concat([...depositReserveAccountMetas])\n : liquidateIx.keys;\n this.lendingIxs.push(liquidateIx);\n }\n\n async addInBetweenIxs(\n action: ActionType,\n includeAtaIxns: boolean,\n requestElevationGroup: boolean,\n addInitObligationForFarm: boolean,\n isClosingPosition: boolean = false\n ) {\n await this.addSupportIxsWithoutInitObligation(\n action,\n includeAtaIxns,\n 'inBetween',\n requestElevationGroup,\n addInitObligationForFarm,\n isClosingPosition\n );\n }\n\n addRefreshObligation(crank: PublicKey) {\n const uniqueReserveAddresses = new PublicKeySet(this.depositReserves.concat(this.borrowReserves)).toArray();\n\n const addAllToSetupIxns = 'setup';\n // Union of addresses\n const allReservesExcludingCurrent = [...uniqueReserveAddresses];\n\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAllToSetupIxns);\n this.addRefreshFarmsForReserve(\n this.depositReserves.map((r) => this.kaminoMarket.getReserveByAddress(r)!),\n addAllToSetupIxns,\n ReserveFarmKind.Collateral,\n crank\n );\n this.addRefreshFarmsForReserve(\n this.borrowReserves.map((r) => this.kaminoMarket.getReserveByAddress(r)!),\n addAllToSetupIxns,\n ReserveFarmKind.Debt,\n crank\n );\n this.addRefreshObligationIx(addAllToSetupIxns, false);\n }\n\n async addSupportIxsWithoutInitObligation(\n action: ActionType,\n includeAtaIxns: boolean,\n addAsSupportIx: AuxiliaryIx = 'setup',\n requestElevationGroup: boolean = false,\n addInitObligationForFarm: boolean = false,\n isClosingPosition: boolean = false,\n twoTokenAction: boolean = false,\n overrideElevationGroupRequest?: number\n ) {\n // TODO: why are we not doing this first?\n if (includeAtaIxns) {\n await this.addAtaIxs(action);\n }\n\n if (\n [\n 'depositCollateral',\n 'deposit',\n 'withdraw',\n 'borrow',\n 'liquidate',\n 'repay',\n 'depositAndBorrow',\n 'repayAndWithdraw',\n 'refreshObligation',\n ].includes(action)\n ) {\n // The support ixns in order are:\n // 0. Init obligation ixn\n // 0. Token Ata ixns\n // 0. Init obligation for farm\n // 1. Ixns to refresh the reserves of the obligation not related to the current action\n // 2. Ixn to refresh the reserve of the current action\n // 3. Ixn to refresh the obligation\n // 4. Ixn to refresh the `debt` farm of the obligation\n // 5. Ixn to refresh the `collateral` farm of the obligation\n // 6. The instruction itself\n // 7. Ixn to refresh the `debt` farm of the obligation\n // 8. Ixn to refresh the `collateral` farm of the obligation\n\n let currentReserves: KaminoReserve[] = [];\n\n if (action === 'liquidate' || action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n if (!this.outflowReserve) {\n throw new Error('outflowReserve is undefined');\n }\n\n if (action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n currentReserves = [this.reserve, this.outflowReserve];\n if (this.obligation) {\n if (action === 'depositAndBorrow') {\n const deposit = this.obligation.state.deposits.find((deposit) =>\n deposit.depositReserve.equals(this.reserve.address)\n );\n\n if (!deposit) {\n this.preLoadedDepositReservesSameTx.push(this.reserve.address);\n }\n } else {\n const borrow = this.obligation.state.borrows.find((borrow) =>\n borrow.borrowReserve.equals(this.reserve.address)\n );\n\n if (!borrow) {\n throw Error(`Unable to find obligation borrow to repay for ${this.obligation.state.owner.toBase58()}`);\n }\n\n const cumulativeBorrowRateObligation = KaminoObligation.getCumulativeBorrowRate(borrow);\n\n const cumulativeBorrowRateReserve = this.reserve.getEstimatedCumulativeBorrowRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n const fullRepay = KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRateReserve)\n .div(cumulativeBorrowRateObligation);\n\n const amountDecimal = new Decimal(this.amount.toString());\n\n if (fullRepay.lte(amountDecimal)) {\n this.preLoadedBorrowReservesSameTx.push(this.reserve.address);\n }\n }\n } else {\n // Obligation doesn't exist yet, so we have to preload the deposit reserve\n this.preLoadedDepositReservesSameTx.push(this.reserve.address);\n }\n } else if (action === 'liquidate' && !this.outflowReserve.address.equals(this.reserve.address)) {\n currentReserves = [this.outflowReserve, this.reserve];\n } else {\n currentReserves = [this.reserve];\n }\n } else {\n currentReserves = [this.reserve];\n }\n\n const uniqueReserveAddresses = new PublicKeySet(this.depositReserves.concat(this.borrowReserves));\n const currentReserveAddresses = new PublicKeySet(currentReserves.map((reserve) => reserve.address));\n\n // Union of addresses\n const allReservesExcludingCurrent = [...uniqueReserveAddresses.toArray()].filter(\n (address) => !currentReserveAddresses.contains(address)\n );\n\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAsSupportIx);\n if (addInitObligationForFarm) {\n if (action === 'liquidate') {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addAsSupportIx);\n await this.addInitObligationForFarm(this.outflowReserve!, ReserveFarmKind.Collateral, addAsSupportIx);\n } else if (\n action === 'depositAndBorrow' ||\n action === 'depositCollateral' ||\n action === 'withdraw' ||\n action === 'deposit'\n ) {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addAsSupportIx);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Debt, addAsSupportIx);\n }\n } else if (action === 'repayAndWithdraw' || action === 'borrow' || action === 'repay') {\n // todo - probably don't need to add both debt and collateral for everything here\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addAsSupportIx);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addAsSupportIx);\n }\n } else {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addAsSupportIx);\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addAsSupportIx);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addAsSupportIx);\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Debt, addAsSupportIx);\n }\n }\n }\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addAsSupportIx);\n\n if (action === 'repayAndWithdraw' && addAsSupportIx === 'inBetween' && isClosingPosition) {\n // addToSetupIxs === addInBetween (same thing)\n // If this is a repay and withdraw, and it's not the first action, and it's closing a position\n // we don't need to include the repay reserve in the refresh obligation\n // I am ashamed of this code, we need to rewrite this entire thing\n this.addRefreshObligationIx(addAsSupportIx, true);\n } else {\n this.addRefreshObligationIx(addAsSupportIx, false);\n }\n\n if (action === 'repay' && requestElevationGroup) {\n const repayObligationLiquidity = this.obligation!.borrows.get(this.reserve.address);\n\n if (!repayObligationLiquidity) {\n throw new Error(`Could not find debt reserve ${this.reserve.address} in obligation`);\n }\n\n if (\n new Decimal(repayObligationLiquidity.amount).lte(new Decimal(this.amount.toString())) &&\n this.obligation!.borrows.size === 1 &&\n this.obligation?.state.elevationGroup !== 0\n ) {\n this.addRefreshReserveIxs(allReservesExcludingCurrent, 'cleanup');\n // Skip the borrow reserve, since we repay in the same tx\n this.addRefreshObligationIx('cleanup', true);\n this.addRequestElevationIx(overrideElevationGroupRequest ?? 0, 'cleanup', true);\n }\n }\n\n if ((action === 'depositAndBorrow' || action === 'borrow') && requestElevationGroup) {\n let emodeGroupsDebt = this.reserve.state.config.elevationGroups;\n let emodeGroupsColl = this.reserve.state.config.elevationGroups;\n let debtReserve = this.reserve.address;\n\n if (action === 'depositAndBorrow') {\n emodeGroupsDebt = this.outflowReserve!.state.config.elevationGroups;\n debtReserve = this.outflowReserve!.address;\n } else if (action === 'borrow') {\n const depositReserve = this.obligation!.state.deposits.find(\n (x) => !x.depositReserve.equals(PublicKey.default)\n )!.depositReserve;\n const collReserve = this.kaminoMarket.getReserveByAddress(depositReserve);\n emodeGroupsColl = collReserve!.state.config.elevationGroups;\n }\n const groups = this.kaminoMarket.state.elevationGroups;\n const commonElevationGroups = [...emodeGroupsColl].filter(\n (item) => emodeGroupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(debtReserve)\n );\n\n console.log(\n 'Groups of coll reserve',\n emodeGroupsColl,\n 'Groups of debt reserve',\n emodeGroupsDebt,\n 'Common groups',\n commonElevationGroups\n );\n\n if (commonElevationGroups.length === 0) {\n console.log('No common elevation groups found, staying with default');\n } else {\n const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {\n const prevGroup = groups.find((group) => group.id === prev);\n const currGroup = groups.find((group) => group.id === curr);\n return prevGroup!.ltvPct > currGroup!.ltvPct ? prev : curr;\n });\n\n const eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve)!.id;\n console.log('Setting eModeGroup to', overrideElevationGroupRequest ?? eModeGroup);\n\n let addAsSupportIx: AuxiliaryIx = 'inBetween';\n if (eModeGroup !== 0 && eModeGroup !== this.obligation?.state.elevationGroup) {\n if (action === 'borrow') {\n this.obligation!.refreshedStats.potentialElevationGroupUpdate = eModeGroup;\n addAsSupportIx = 'setup';\n }\n this.addRequestElevationIx(overrideElevationGroupRequest ?? eModeGroup, addAsSupportIx);\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAsSupportIx);\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addAsSupportIx);\n this.addRefreshObligationIx(addAsSupportIx);\n }\n }\n }\n if (addAsSupportIx === 'setup') {\n // If this is an setup ixn (therefore not an in-between), it means it's either a one off action\n // or the first of a two-token-action\n if (action === 'liquidate') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addAsSupportIx, ReserveFarmKind.Collateral);\n this.addRefreshFarmsForReserve([this.reserve], addAsSupportIx, ReserveFarmKind.Debt);\n } else if (\n action === 'depositAndBorrow' ||\n action === 'depositCollateral' ||\n action === 'withdraw' ||\n action === 'deposit'\n ) {\n this.addRefreshFarmsForReserve(\n currentReserves,\n addAsSupportIx,\n ReserveFarmKind.Collateral,\n undefined,\n twoTokenAction\n );\n } else if (action === 'repayAndWithdraw' || action === 'borrow' || action === 'repay') {\n this.addRefreshFarmsForReserve(\n currentReserves,\n addAsSupportIx,\n ReserveFarmKind.Debt,\n undefined,\n twoTokenAction\n );\n } else {\n throw new Error(`Could not decide on refresh farm for action ${action}`);\n }\n } else {\n // If this is an inbetween, it means it's part of a two-token-action\n // so we skip the refresh farm obligation of the first reserve as that operation already happened\n // add added to 'setup' ixns\n if (action === 'depositAndBorrow') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addAsSupportIx, ReserveFarmKind.Debt);\n } else if (action === 'repayAndWithdraw') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addAsSupportIx, ReserveFarmKind.Collateral);\n } else {\n throw new Error(`Could not decide on refresh farm for action ${action}`);\n }\n }\n }\n }\n\n async addSupportIxs(\n action: ActionType,\n includeAtaIxns: boolean,\n requestElevationGroup: boolean,\n includeUserMetadata: boolean,\n addInitObligationForFarm: boolean,\n twoTokenAction: boolean = false,\n overrideElevationGroupRequest?: number\n ) {\n if (!['mint', 'redeem'].includes(action)) {\n const [, ownerUserMetadata] = await this.kaminoMarket.getUserMetadata(this.owner);\n if (!ownerUserMetadata && includeUserMetadata) {\n await this.addInitUserMetadataIxs();\n }\n\n await this.addInitReferrerTokenStateIxs();\n await this.addInitObligationIxs();\n }\n\n await this.addSupportIxsWithoutInitObligation(\n action,\n includeAtaIxns,\n 'setup',\n requestElevationGroup,\n addInitObligationForFarm,\n false,\n twoTokenAction,\n overrideElevationGroupRequest\n );\n }\n\n private static optionalAccount(pubkey: PublicKey, programId: PublicKey = PROGRAM_ID): PublicKey {\n if (isNotNullPubkey(pubkey)) {\n return pubkey;\n } else {\n return programId;\n }\n }\n\n private addRefreshReserveIxs(reserves: PublicKey[], addAsSupportIx: AuxiliaryIx = 'setup') {\n reserves.forEach((reserveAddress) => {\n const foundReserve = this.kaminoMarket.getReserveByAddress(reserveAddress);\n if (!foundReserve) {\n throw new Error(`Could not find reserve ${reserveAddress} in reserves`);\n }\n\n const { state } = foundReserve;\n\n const refreshReserveIx = refreshReserve(\n {\n lendingMarket: this.kaminoMarket.getAddress(),\n reserve: reserveAddress,\n pythOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.pythConfiguration.price,\n this.kaminoMarket.programId\n ),\n switchboardPriceOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.priceAggregator,\n this.kaminoMarket.programId\n ),\n switchboardTwapOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.twapAggregator,\n this.kaminoMarket.programId\n ),\n scopePrices: KaminoAction.optionalAccount(\n state.config.tokenInfo.scopeConfiguration.priceFeed,\n this.kaminoMarket.programId\n ),\n },\n this.kaminoMarket.programId\n );\n\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(refreshReserveIx);\n this.setupIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(refreshReserveIx);\n this.inBetweenIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n } else {\n this.cleanupIxs.push(refreshReserveIx);\n this.cleanupIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n }\n });\n }\n\n public static getRefreshAllReserves(kaminoMarket: KaminoMarket, reserves: PublicKey[]): TransactionInstruction[] {\n return reserves.map((reserveAddress): TransactionInstruction => {\n const foundReserve = kaminoMarket.getReserveByAddress(reserveAddress);\n if (!foundReserve) {\n throw new Error(`Could not find reserve ${reserveAddress} in reserves`);\n }\n\n const { state } = foundReserve;\n return refreshReserve(\n {\n reserve: reserveAddress,\n lendingMarket: state.lendingMarket,\n pythOracle: this.optionalAccount(state.config.tokenInfo.pythConfiguration.price, kaminoMarket.programId),\n switchboardPriceOracle: this.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.priceAggregator,\n kaminoMarket.programId\n ),\n switchboardTwapOracle: this.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.twapAggregator,\n kaminoMarket.programId\n ),\n scopePrices: this.optionalAccount(\n state.config.tokenInfo.scopeConfiguration.priceFeed,\n kaminoMarket.programId\n ),\n },\n kaminoMarket.programId\n );\n });\n }\n\n private addRefreshObligationIx(addAsSupportIx: AuxiliaryIx = 'setup', skipBorrowObligations: boolean = false) {\n const marketAddress = this.kaminoMarket.getAddress();\n const obligationPda = this.getObligationPda();\n const refreshObligationIx = refreshObligation(\n {\n lendingMarket: marketAddress,\n obligation: obligationPda,\n },\n this.kaminoMarket.programId\n );\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const preloadedBorrowReservesString = this.preLoadedBorrowReservesSameTx.map((reserve) => reserve.toString());\n const borrowReservesList = this.borrowReserves.filter(\n (reserve) => !preloadedBorrowReservesString.includes(reserve.toString())\n );\n\n const borrowReserveAccountMetas = borrowReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowReservesReferrerTokenStates = borrowReservesList\n .map((reserve) => {\n if (this.referrer.equals(PublicKey.default)) {\n return { pubkey: this.kaminoMarket.programId, isSigner: false, isWritable: true };\n }\n const referrerTokenStateAddress = referrerTokenStatePda(this.referrer, reserve, this.kaminoMarket.programId)[0];\n return { pubkey: referrerTokenStateAddress, isSigner: false, isWritable: true };\n })\n .filter((x) => !x.pubkey.equals(this.kaminoMarket.programId));\n\n refreshObligationIx.keys = refreshObligationIx.keys.concat([\n ...depositReserveAccountMetas,\n ...(skipBorrowObligations ? [] : [...borrowReserveAccountMetas, ...borrowReservesReferrerTokenStates]),\n ]);\n\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(refreshObligationIx);\n this.setupIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(refreshObligationIx);\n this.inBetweenIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n } else {\n this.cleanupIxs.push(refreshObligationIx);\n this.cleanupIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n }\n }\n\n private addRequestElevationIx(\n elevationGroup: number,\n addAsSupportIx: AuxiliaryIx,\n skipBorrowObligations: boolean = false\n ) {\n const obligationPda = this.getObligationPda();\n const args: RequestElevationGroupArgs = {\n elevationGroup,\n };\n const accounts: RequestElevationGroupAccounts = {\n owner: this.owner,\n obligation: obligationPda,\n lendingMarket: this.kaminoMarket.getAddress(),\n };\n\n const requestElevationGroupIx = requestElevationGroup(args, accounts, this.kaminoMarket.programId);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const preloadedBorrowReservesString = this.preLoadedBorrowReservesSameTx.map((reserve) => reserve.toString());\n const borrowReservesList = this.borrowReserves.filter(\n (reserve) => !preloadedBorrowReservesString.includes(reserve.toString())\n );\n\n const borrowReserveAccountMetas = borrowReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowReservesReferrerTokenStates = borrowReservesList\n .map((reserve) => {\n if (this.referrer.equals(PublicKey.default)) {\n return { pubkey: this.kaminoMarket.programId, isSigner: false, isWritable: true };\n }\n const reserveState = this.kaminoMarket.getReserveByAddress(reserve)!;\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.referrer,\n reserveState.address,\n this.kaminoMarket.programId\n )[0];\n return { pubkey: referrerTokenStateAddress, isSigner: false, isWritable: true };\n })\n .filter((x) => !x.pubkey.equals(this.kaminoMarket.programId));\n\n requestElevationGroupIx.keys = requestElevationGroupIx.keys.concat([\n ...depositReserveAccountMetas,\n ...(skipBorrowObligations ? [] : [...borrowReserveAccountMetas, ...borrowReservesReferrerTokenStates]),\n ]);\n\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(requestElevationGroupIx);\n this.setupIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(requestElevationGroupIx);\n this.inBetweenIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n } else {\n this.cleanupIxs.push(requestElevationGroupIx);\n this.cleanupIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n }\n }\n\n private addRefreshFarmsForReserve(\n reserves: KaminoReserve[],\n addAsSupportIx: AuxiliaryIx = 'setup',\n mode: typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n crank: PublicKey = this.payer,\n twoTokenAction: boolean = false\n ) {\n const BASE_SEED_USER_STATE = Buffer.from('user');\n const getPda = (farm: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [BASE_SEED_USER_STATE, farm.toBytes(), this.getObligationPda().toBytes()],\n farmsId\n )[0];\n\n const farms: [\n typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n PublicKey,\n PublicKey,\n KaminoReserve\n ][] = [];\n\n for (const kaminoReserve of reserves) {\n if (mode === ReserveFarmKind.Collateral && !kaminoReserve.state.farmCollateral.equals(PublicKey.default)) {\n farms.push([\n ReserveFarmKind.Collateral,\n kaminoReserve.state.farmCollateral,\n getPda(kaminoReserve.state.farmCollateral),\n kaminoReserve,\n ]);\n }\n if (mode === ReserveFarmKind.Debt && !kaminoReserve.state.farmDebt.equals(PublicKey.default)) {\n farms.push([\n ReserveFarmKind.Debt,\n kaminoReserve.state.farmDebt,\n getPda(kaminoReserve.state.farmDebt),\n kaminoReserve,\n ]);\n }\n }\n\n farms.forEach(\n (arg: [typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt, PublicKey, PublicKey, KaminoReserve]) => {\n const args: RefreshObligationFarmsForReserveArgs = { mode: arg[0].discriminator };\n const accounts: RefreshObligationFarmsForReserveAccounts = {\n crank,\n obligation: this.getObligationPda(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: arg[3].address,\n reserveFarmState: arg[1],\n obligationFarmUserState: arg[2],\n lendingMarket: this.kaminoMarket.getAddress(),\n farmsProgram: farmsId,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n };\n const refreshFarmForObligationix = refreshObligationFarmsForReserve(\n args,\n accounts,\n this.kaminoMarket.programId\n );\n\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(refreshFarmForObligationix);\n this.setupIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n if (twoTokenAction) {\n // If two token action, this refresh needs to be the first inbetween ix\n this.inBetweenIxs.push(refreshFarmForObligationix);\n this.inBetweenIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n } else {\n this.refreshFarmsCleanupTxnIxs.push(refreshFarmForObligationix);\n this.refreshFarmsCleanupTxnIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n }\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(refreshFarmForObligationix);\n this.inBetweenIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n\n this.refreshFarmsCleanupTxnIxs.push(refreshFarmForObligationix);\n this.refreshFarmsCleanupTxnIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n }\n }\n );\n }\n\n private addRefreshFarmsCleanupTxnIxsToCleanupIxs() {\n this.cleanupIxs.splice(0, 0, ...this.refreshFarmsCleanupTxnIxs);\n this.cleanupIxsLabels.splice(0, 0, ...this.refreshFarmsCleanupTxnIxsLabels);\n }\n\n private async addInitObligationForFarm(\n reserve: KaminoReserve,\n mode: typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n addAsSupportIx: AuxiliaryIx = 'setup'\n ): Promise<void> {\n const BASE_SEED_USER_STATE = Buffer.from('user');\n const getPda = (farm: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [BASE_SEED_USER_STATE, farm.toBytes(), this.getObligationPda().toBytes()],\n farmsId\n )[0];\n\n const farms: [number, PublicKey, PublicKey][] = [];\n\n if (mode === ReserveFarmKind.Collateral && isNotNullPubkey(reserve.state.farmCollateral)) {\n const pda = getPda(reserve.state.farmCollateral);\n const account = await this.kaminoMarket.getConnection().getAccountInfo(pda);\n if (!account) {\n farms.push([ReserveFarmKind.Collateral.discriminator, reserve.state.farmCollateral, pda]);\n }\n }\n\n if (mode === ReserveFarmKind.Debt && isNotNullPubkey(reserve.state.farmDebt)) {\n const pda = getPda(reserve.state.farmDebt);\n const account = await this.kaminoMarket.getConnection().getAccountInfo(pda);\n if (!account) {\n farms.push([ReserveFarmKind.Debt.discriminator, reserve.state.farmDebt, getPda(reserve.state.farmDebt)]);\n }\n }\n\n farms.forEach((arg: [number, PublicKey, PublicKey]) => {\n const args: InitObligationFarmsForReserveArgs = { mode: arg[0] };\n const accounts: InitObligationFarmsForReserveAccounts = {\n owner: this.obligation ? this.obligation.state.owner : this.owner,\n payer: this.owner,\n obligation: this.getObligationPda(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: reserve.address,\n reserveFarmState: arg[1],\n obligationFarm: arg[2],\n lendingMarket: this.kaminoMarket.getAddress(),\n farmsProgram: farmsId,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n };\n const initObligationForFarm = initObligationFarmsForReserve(args, accounts, this.kaminoMarket.programId);\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(initObligationForFarm);\n this.setupIxsLabels.push(\n `InitObligationForFarm[${reserve.address.toString()}, ${this.getObligationPda().toString()}]`\n );\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(initObligationForFarm);\n this.inBetweenIxsLabels.push(\n `InitObligationForFarm[${reserve.address.toString()}, ${this.getObligationPda().toString()}]`\n );\n }\n });\n }\n\n private async addInitObligationIxs() {\n if (!this.obligation) {\n const obligationPda = this.getObligationPda();\n const [userMetadataAddress, _bump] = userMetadataPda(this.owner, this.kaminoMarket.programId);\n const initObligationIx = initObligation(\n {\n args: {\n tag: this.obligationType!.toArgs().tag,\n id: this.obligationType!.toArgs().id,\n },\n },\n {\n obligationOwner: this.owner,\n feePayer: this.payer,\n obligation: obligationPda,\n lendingMarket: this.kaminoMarket.getAddress(),\n seed1Account: this.obligationType!.toArgs().seed1,\n seed2Account: this.obligationType!.toArgs().seed2,\n ownerUserMetadata: userMetadataAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n this.setupIxs.push(initObligationIx);\n this.setupIxsLabels.push(`InitObligation[${obligationPda.toString()}]`);\n }\n }\n\n private async addInitUserMetadataIxs() {\n const [createLutIx, lookupTableAddress] = await createLookupTableIx(this.kaminoMarket.getConnection(), this.owner);\n this.setupIxs.push(createLutIx);\n this.setupIxsLabels.push(`createUserLutIx[${lookupTableAddress.toString()}]`);\n const [userMetadataAddress, _bump] = userMetadataPda(this.owner, this.kaminoMarket.programId);\n const referrerUserMetadataAddress = this.referrer.equals(PublicKey.default)\n ? this.kaminoMarket.programId\n : userMetadataPda(this.referrer, this.kaminoMarket.programId)[0];\n const initUserMetadataIx = initUserMetadata(\n {\n userLookupTable: lookupTableAddress,\n },\n {\n owner: this.owner,\n feePayer: this.payer,\n userMetadata: userMetadataAddress,\n referrerUserMetadata: referrerUserMetadataAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n this.setupIxs.push(initUserMetadataIx);\n this.setupIxsLabels.push(`initUserMetadata[${userMetadataAddress.toString()}]`);\n }\n\n private async addInitReferrerTokenStateIxs(reservesArr: KaminoReserve[] = []) {\n if (this.referrer.equals(PublicKey.default)) {\n return;\n }\n\n const outflowReserve = this.outflowReserve?.address ? [this.outflowReserve.address] : [];\n\n const reserves =\n reservesArr.length !== 0\n ? reservesArr.map((reserve) => reserve.address)\n : new PublicKeySet<PublicKey>([this.reserve.address, ...outflowReserve]).toArray();\n const tokenStatesToCreate: [PublicKey, PublicKey][] = [];\n for (const reserve of reserves) {\n if (!reserve) {\n continue;\n }\n\n const referrerTokenStateAddress = referrerTokenStatePda(this.referrer, reserve, this.kaminoMarket.programId)[0];\n\n if (!(await checkIfAccountExists(this.kaminoMarket.getConnection(), referrerTokenStateAddress))) {\n tokenStatesToCreate.push([referrerTokenStateAddress, reserve]);\n }\n }\n\n tokenStatesToCreate.forEach(([referrerTokenStateAddress, reserveAddress]) => {\n const initreferrerTokenStateIx = initReferrerTokenState(\n {\n referrer: this.referrer,\n },\n {\n lendingMarket: this.kaminoMarket.getAddress(),\n payer: this.owner,\n reserve: reserveAddress,\n referrerTokenState: referrerTokenStateAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n\n this.setupIxs.unshift(initreferrerTokenStateIx);\n this.setupIxsLabels.unshift(\n `InitReferrerTokenState[${referrerTokenStateAddress.toString()} res=${reserveAddress}]`\n );\n });\n }\n\n private addWithdrawReferrerFeesIxs() {\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.owner,\n this.reserve.address,\n this.kaminoMarket.programId\n )[0];\n\n const withdrawReferrerFeesIx = withdrawReferrerFees(\n {\n referrer: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n referrerTokenState: referrerTokenStateAddress,\n reserveSupplyLiquidity: this.reserve.state.liquidity.supplyVault,\n referrerTokenAccount: this.userTokenAccountAddress,\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n },\n this.kaminoMarket.programId\n );\n\n this.lendingIxs.push(withdrawReferrerFeesIx);\n this.lendingIxsLabels.push(`WithdrawReferrerFeesIx[${this.owner.toString()}]`);\n }\n\n private addComputeBudgetIxn(units: number) {\n this.setupIxs.push(buildComputeBudgetIx(units));\n this.setupIxsLabels.push(`AddComputeBudget[${units}]`);\n }\n\n private async addAtaIxs(action: ActionType) {\n if (this.mint.equals(WRAPPED_SOL_MINT) || this.secondaryMint?.equals(WRAPPED_SOL_MINT)) {\n await this.updateWSOLAccount(action);\n }\n\n if ((action === 'withdraw' || action === 'borrow' || action === 'redeem') && !this.mint.equals(WRAPPED_SOL_MINT)) {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.reserve.getLiquidityMint(),\n this.owner,\n this.reserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT) {\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateLiquidityUserAta[${this.owner}]`);\n } else {\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateLiquidityUserAta[${this.owner}]`);\n }\n }\n }\n\n if (action === 'liquidate') {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n if (!this.outflowReserve) {\n throw new Error(`Outflow reserve state not found ${this.mint}`);\n }\n\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getLiquidityMint(),\n this.owner,\n this.outflowReserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n } else {\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n }\n }\n\n const userCollateralAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.userCollateralAccountAddress);\n if (!userCollateralAccountInfo) {\n const [, createUserCollateralAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getCTokenMint(),\n this.owner,\n TOKEN_PROGRAM_ID,\n this.userCollateralAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserCollateralAccountIx);\n this.preTxnIxsLabels.push(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n } else {\n this.setupIxs.unshift(createUserCollateralAccountIx);\n this.setupIxsLabels.unshift(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n }\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.mint}`);\n }\n }\n\n if (\n action === 'depositAndBorrow' ||\n (action === 'repayAndWithdraw' && !this.secondaryMint?.equals(WRAPPED_SOL_MINT))\n ) {\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.secondaryMint}`);\n }\n\n if (!this.outflowReserve) {\n throw new Error(`Outflow reserve state not found ${this.mint}`);\n }\n\n const additionalUserTokenAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.additionalTokenAccountAddress);\n\n if (!additionalUserTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getLiquidityMint(),\n this.owner,\n this.outflowReserve.getLiquidityTokenProgram(),\n this.additionalTokenAccountAddress\n );\n\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateAdditionalUserTokenAta[${this.owner}]`);\n }\n }\n\n if (action === 'withdraw' || action === 'mint' || action === 'deposit' || action === 'repayAndWithdraw') {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n // TODO: Might need to remove this\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.reserve.getLiquidityMint(),\n this.owner,\n this.reserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n }\n }\n if (action === 'mint') {\n const userCollateralAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.userCollateralAccountAddress);\n\n if (!userCollateralAccountInfo) {\n const collateralMintPubkey = this.reserve.getCTokenMint();\n const [, createUserCollateralAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n collateralMintPubkey,\n this.owner,\n TOKEN_PROGRAM_ID,\n this.userCollateralAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserCollateralAccountIx);\n this.preTxnIxsLabels.push(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n } else {\n this.setupIxs.unshift(createUserCollateralAccountIx);\n this.setupIxsLabels.unshift(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n }\n }\n }\n }\n\n private async updateWSOLAccount(action: ActionType) {\n const preIxs: Array<TransactionInstruction> = [];\n const postIxs: Array<TransactionInstruction> = [];\n const preIxsLabels: Array<string> = [];\n const postIxsLabels: Array<string> = [];\n\n if (action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n return;\n }\n\n let safeRepay = new BN(this.amount);\n\n if (this.obligation && action === 'repay' && this.amount.eq(new BN(U64_MAX))) {\n const borrow = this.obligation.state.borrows.find(\n (borrow) => borrow.borrowReserve.toString() === this.reserve.address.toString()\n );\n\n if (!borrow) {\n throw Error(`Unable to find obligation borrow to repay for ${this.obligation.state.owner.toBase58()}`);\n }\n\n const cumulativeBorrowRateObligation = KaminoObligation.getCumulativeBorrowRate(borrow);\n const cumulativeBorrowRateReserve = this.reserve.getEstimatedCumulativeBorrowRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n // TODO: shouldn't this calc be added to all other stuff as well?\n safeRepay = new BN(\n Math.floor(\n KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRateReserve)\n .div(cumulativeBorrowRateObligation)\n .add(new Decimal(SOL_PADDING_FOR_INTEREST.toString()))\n .toNumber()\n ).toString()\n );\n }\n\n let userTokenAccountAddress = this.userTokenAccountAddress;\n if (this.secondaryMint?.equals(WRAPPED_SOL_MINT)) {\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.secondaryMint}`);\n }\n userTokenAccountAddress = this.additionalTokenAccountAddress;\n }\n\n const userWSOLAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(userTokenAccountAddress);\n\n const rentExempt = await this.kaminoMarket.getConnection().getMinimumBalanceForRentExemption(165);\n\n // Add rent exemption lamports for WSOL accounts that need to be pre-funded for inflow/send transactions\n const sendAction =\n action === 'deposit' ||\n action === 'repay' ||\n action === 'mint' ||\n (action === 'liquidate' && this.secondaryMint?.equals(WRAPPED_SOL_MINT)); // only sync WSOL amount if liquidator repays SOL which is secondaryMint\n\n const transferLamportsIx = SystemProgram.transfer({\n fromPubkey: this.owner,\n toPubkey: userTokenAccountAddress,\n lamports: (userWSOLAccountInfo ? 0 : rentExempt) + (sendAction ? parseInt(safeRepay.toString(), 10) : 0),\n });\n preIxs.push(transferLamportsIx);\n preIxsLabels.push(`TransferLamportsToUserAtaSOL[${userTokenAccountAddress}]`);\n\n const closeWSOLAccountIx = createCloseAccountInstruction(\n userTokenAccountAddress,\n this.owner,\n this.owner,\n [],\n TOKEN_PROGRAM_ID\n );\n\n const syncIx = syncNative(userTokenAccountAddress);\n if (userWSOLAccountInfo) {\n if (sendAction) {\n preIxs.push(syncIx);\n preIxsLabels.push(`SyncUserAtaSOL[${userTokenAccountAddress}]`);\n } else {\n postIxs.push(closeWSOLAccountIx);\n postIxsLabels.push(`CloseUserAtaSOL[${userTokenAccountAddress}]`);\n }\n } else {\n const [, createUserWSOLAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n NATIVE_MINT,\n this.owner,\n TOKEN_PROGRAM_ID,\n userTokenAccountAddress\n );\n preIxs.push(createUserWSOLAccountIx);\n preIxsLabels.push(`CreateUserAtaSOL[${userTokenAccountAddress}]`);\n preIxs.push(syncIx);\n preIxsLabels.push(`SyncUserAtaSOL[${userTokenAccountAddress}]`);\n postIxs.push(closeWSOLAccountIx);\n postIxsLabels.push(`CloseUserAtaSOL[${userTokenAccountAddress}]`);\n }\n\n // TODO: Consider for liquidations and other types of actions if we have to split up some ixs in 2-3 txs\n // if (this.positions && this.positions >= POSITION_LIMIT) {\n // this.preTxnIxs.push(...preIxs);\n // this.preTxnIxsLabels.push(...preIxsLabels);\n // this.postTxnIxs.push(...postIxs);\n // this.postTxnIxsLabels.push(...postIxsLabels);\n // } else {\n // }\n this.setupIxs.unshift(...preIxs);\n this.setupIxsLabels.unshift(...preIxsLabels);\n this.cleanupIxs.push(...postIxs);\n this.cleanupIxsLabels.push(...postIxsLabels);\n }\n\n static async initializeMultiTokenAction(\n kaminoMarket: KaminoMarket,\n action: ActionType,\n inflowAmount: string | BN,\n inflowTokenMint: PublicKey,\n outflowTokenMint: PublicKey,\n payer: PublicKey,\n obligationOwner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n outflowAmount?: string | BN,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const inflowReserve = kaminoMarket.getReserveByMint(inflowTokenMint);\n const outflowReserve = kaminoMarket.getReserveByMint(outflowTokenMint);\n\n if (!outflowReserve || !inflowReserve) {\n throw new Error('reserve states are not fetched');\n }\n\n const {\n userTokenAccountAddress: userOutflowTokenAccountAddress,\n userCollateralAccountAddress: userOutflowCollateralAccountAddress,\n } = KaminoAction.getUserAccountAddresses(payer, outflowReserve.state);\n\n const {\n userTokenAccountAddress: userInflowTokenAccountAddress,\n userCollateralAccountAddress: userInflowCollateralAccountAddress,\n } = KaminoAction.getUserAccountAddresses(payer, inflowReserve.state);\n\n const { kaminoObligation, depositReserves, borrowReserves, distinctReserveCount } =\n await KaminoAction.loadObligation(\n action,\n kaminoMarket,\n obligationOwner,\n inflowReserve.address,\n obligation,\n outflowReserve.address\n );\n const referrerKey = await this.getReferrerKey(kaminoMarket, payer, kaminoObligation, referrer);\n\n let userTokenAccountAddress: PublicKey;\n let userCollateralAccountAddress: PublicKey;\n let additionalUserTokenAccountAddress: PublicKey;\n let secondaryMint: PublicKey;\n let primaryMint: PublicKey;\n\n if (action === 'liquidate') {\n userTokenAccountAddress = userOutflowTokenAccountAddress;\n userCollateralAccountAddress = userOutflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userInflowTokenAccountAddress;\n primaryMint = outflowTokenMint;\n secondaryMint = inflowTokenMint;\n } else if (action === 'depositAndBorrow') {\n userTokenAccountAddress = userInflowTokenAccountAddress;\n userCollateralAccountAddress = userInflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userOutflowTokenAccountAddress;\n primaryMint = inflowTokenMint;\n secondaryMint = outflowTokenMint;\n } else if (action === 'repayAndWithdraw') {\n primaryMint = inflowTokenMint;\n secondaryMint = outflowTokenMint;\n userTokenAccountAddress = userInflowTokenAccountAddress;\n userCollateralAccountAddress = userOutflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userOutflowTokenAccountAddress;\n } else {\n throw new Error('Invalid action');\n }\n\n return new KaminoAction(\n kaminoMarket,\n payer,\n kaminoObligation || obligation,\n userTokenAccountAddress,\n userCollateralAccountAddress,\n primaryMint,\n distinctReserveCount,\n inflowAmount,\n depositReserves,\n borrowReserves,\n inflowReserve,\n currentSlot,\n secondaryMint,\n additionalUserTokenAccountAddress,\n outflowReserve,\n outflowAmount,\n referrerKey\n );\n }\n\n static async initializeWithdrawReferrerFees(\n mint: PublicKey,\n owner: PublicKey,\n kaminoMarket: KaminoMarket,\n currentSlot: number = 0\n ) {\n const reserve = kaminoMarket.getReserveByMint(mint);\n if (reserve === undefined) {\n throw new Error(`Reserve ${mint} not found in market ${kaminoMarket.getAddress().toBase58()}`);\n }\n\n const { atas, createAtasIxns } = await getAtasWithCreateIxnsIfMissing(\n kaminoMarket.getConnection(),\n owner,\n [reserve.getLiquidityMint()],\n [reserve.getLiquidityTokenProgram()]\n );\n\n const userTokenAccountAddress = atas[0];\n\n return {\n axn: new KaminoAction(\n kaminoMarket,\n owner,\n new VanillaObligation(kaminoMarket.programId),\n userTokenAccountAddress,\n PublicKey.default,\n mint,\n 0,\n new BN(0),\n [],\n [],\n reserve,\n currentSlot,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined\n ),\n createAtasIxns,\n };\n }\n\n getObligationPda(): PublicKey {\n return this.obligation\n ? this.obligation.obligationAddress\n : this.obligationType!.toPda(this.kaminoMarket.getAddress(), this.owner);\n }\n\n getAdditionalDepositReservesList(): PublicKey[] {\n const depositReservesList = this.depositReserves;\n\n // check if there's any member in the preloadedDepositReserves that is not in the depositReserves\n // if so, add it to the depositReserves\n for (let i = 0; i < this.preLoadedDepositReservesSameTx.length; i++) {\n const preloadedDepositReserve = this.preLoadedDepositReservesSameTx[i];\n\n // Check if the depositReserves array contains the current preloadedDepositReserve\n const found = this.depositReserves.some((depositReserve) => {\n return depositReserve.equals(preloadedDepositReserve);\n });\n\n // If not found, push the current preloadedDepositReserve to the depositReserves array\n if (!found) {\n depositReservesList.push(this.preLoadedDepositReservesSameTx[i]);\n }\n }\n\n return depositReservesList;\n }\n\n private static async getReferrerKey(\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n kaminoObligation: KaminoObligation | null,\n referrer: PublicKey\n ) {\n let referrerKey = referrer;\n if (!referrer || referrer.equals(PublicKey.default)) {\n if (kaminoObligation === null) {\n const [_, userMetadata] = await kaminoMarket.getUserMetadata(owner);\n if (userMetadata) {\n referrerKey = userMetadata.referrer;\n }\n } else {\n referrerKey = kaminoObligation.state.referrer;\n }\n }\n return referrerKey;\n }\n}\n"]}
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/classes/action.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Connection,\n PublicKey,\n RpcResponseAndContext,\n SimulatedTransactionResponse,\n SystemProgram,\n SYSVAR_INSTRUCTIONS_PUBKEY,\n SYSVAR_RENT_PUBKEY,\n Transaction,\n TransactionInstruction,\n TransactionSignature,\n} from '@solana/web3.js';\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n NATIVE_MINT,\n TOKEN_PROGRAM_ID,\n createCloseAccountInstruction,\n} from '@solana/spl-token';\nimport BN from 'bn.js';\nimport Decimal from 'decimal.js';\nimport {\n borrowObligationLiquidity,\n depositObligationCollateral,\n depositReserveLiquidity,\n depositReserveLiquidityAndObligationCollateral,\n initObligation,\n initObligationFarmsForReserve,\n InitObligationFarmsForReserveAccounts,\n InitObligationFarmsForReserveArgs,\n initReferrerTokenState,\n initUserMetadata,\n liquidateObligationAndRedeemReserveCollateral,\n redeemReserveCollateral,\n refreshObligation,\n refreshObligationFarmsForReserve,\n RefreshObligationFarmsForReserveAccounts,\n RefreshObligationFarmsForReserveArgs,\n refreshReserve,\n repayObligationLiquidity,\n requestElevationGroup,\n RequestElevationGroupAccounts,\n RequestElevationGroupArgs,\n withdrawObligationCollateralAndRedeemReserveCollateral,\n withdrawReferrerFees,\n} from '../idl_codegen/instructions';\nimport {\n buildComputeBudgetIx,\n createAssociatedTokenAccountIdempotentInstruction,\n ObligationType,\n syncNative,\n U64_MAX,\n referrerTokenStatePda,\n userMetadataPda,\n getAtasWithCreateIxnsIfMissing,\n checkIfAccountExists,\n createLookupTableIx,\n isNotNullPubkey,\n PublicKeySet,\n WRAPPED_SOL_MINT,\n getAssociatedTokenAddress,\n ScopeRefresh,\n} from '../utils';\nimport { KaminoMarket } from './market';\nimport { KaminoObligation } from './obligation';\nimport { KaminoReserve } from './reserve';\nimport { ReserveFarmKind } from '../idl_codegen/types';\nimport { farmsId } from '@hubbleprotocol/farms-sdk';\nimport { Reserve } from '../idl_codegen/accounts';\nimport { VanillaObligation } from '../utils/ObligationType';\nimport { PROGRAM_ID } from '../lib';\nimport { U16_MAX } from '@hubbleprotocol/scope-sdk';\n\nexport const POSITION_LIMIT = 10;\nexport const BORROWS_LIMIT = 5;\nexport const DEPOSITS_LIMIT = 8;\n\nconst SOL_PADDING_FOR_INTEREST = new BN('1000000');\n\nexport type ActionType =\n | 'deposit'\n | 'borrow'\n | 'withdraw'\n | 'repay'\n | 'mint'\n | 'redeem'\n | 'depositCollateral'\n | 'liquidate'\n | 'depositAndBorrow'\n | 'repayAndWithdraw'\n | 'refreshObligation'\n | 'requestElevationGroup'\n | 'withdrawReferrerFees';\n\nexport type AuxiliaryIx = 'setup' | 'inBetween' | 'cleanup';\n\nexport class KaminoAction {\n kaminoMarket: KaminoMarket;\n\n reserve: KaminoReserve;\n\n outflowReserve: KaminoReserve | undefined;\n\n owner: PublicKey;\n payer: PublicKey;\n\n obligation: KaminoObligation | null = null;\n\n referrer: PublicKey;\n\n userTokenAccountAddress: PublicKey;\n\n userCollateralAccountAddress: PublicKey;\n\n additionalTokenAccountAddress?: PublicKey;\n\n /**\n * Null unless the obligation is not passed\n */\n obligationType: ObligationType | null = null;\n\n mint: PublicKey;\n\n secondaryMint?: PublicKey;\n\n positions?: number;\n\n amount: BN;\n outflowAmount?: BN;\n\n setupIxs: Array<TransactionInstruction>;\n setupIxsLabels: Array<string>;\n\n inBetweenIxs: Array<TransactionInstruction>;\n inBetweenIxsLabels: Array<string>;\n\n lendingIxs: Array<TransactionInstruction>;\n lendingIxsLabels: Array<string>;\n\n cleanupIxs: Array<TransactionInstruction>;\n cleanupIxsLabels: Array<string>;\n\n preTxnIxs: Array<TransactionInstruction>;\n preTxnIxsLabels: Array<string>;\n\n postTxnIxs: Array<TransactionInstruction>;\n postTxnIxsLabels: Array<string>;\n\n refreshFarmsCleanupTxnIxs: Array<TransactionInstruction>;\n refreshFarmsCleanupTxnIxsLabels: Array<string>;\n\n depositReserves: Array<PublicKey>;\n borrowReserves: Array<PublicKey>;\n\n preLoadedDepositReservesSameTx: Array<PublicKey>;\n preLoadedBorrowReservesSameTx: Array<PublicKey>;\n\n currentSlot: number;\n\n private constructor(\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType | null,\n userTokenAccountAddress: PublicKey,\n userCollateralAccountAddress: PublicKey,\n mint: PublicKey,\n positions: number,\n amount: string | BN,\n depositReserves: Array<PublicKey>,\n borrowReserves: Array<PublicKey>,\n reserveState: KaminoReserve,\n currentSlot: number,\n secondaryMint?: PublicKey,\n additionalTokenAccountAddress?: PublicKey,\n outflowReserveState?: KaminoReserve,\n outflowAmount?: string | BN,\n referrer?: PublicKey,\n payer?: PublicKey\n ) {\n if (obligation instanceof KaminoObligation) {\n this.obligation = obligation;\n } else if (obligation !== null) {\n this.obligationType = obligation;\n }\n\n this.kaminoMarket = kaminoMarket;\n this.owner = owner;\n this.payer = payer ?? owner;\n this.amount = new BN(amount);\n this.mint = mint;\n this.positions = positions;\n this.userTokenAccountAddress = userTokenAccountAddress;\n this.userCollateralAccountAddress = userCollateralAccountAddress;\n this.setupIxs = [];\n this.setupIxsLabels = [];\n this.inBetweenIxs = [];\n this.inBetweenIxsLabels = [];\n this.lendingIxs = [];\n this.lendingIxsLabels = [];\n this.cleanupIxs = [];\n this.cleanupIxsLabels = [];\n this.preTxnIxs = [];\n this.preTxnIxsLabels = [];\n this.postTxnIxs = [];\n this.postTxnIxsLabels = [];\n this.refreshFarmsCleanupTxnIxs = [];\n this.refreshFarmsCleanupTxnIxsLabels = [];\n this.depositReserves = depositReserves;\n this.borrowReserves = borrowReserves;\n this.additionalTokenAccountAddress = additionalTokenAccountAddress;\n this.secondaryMint = secondaryMint;\n this.reserve = reserveState;\n this.outflowReserve = outflowReserveState;\n this.outflowAmount = outflowAmount ? new BN(outflowAmount) : undefined;\n this.preLoadedDepositReservesSameTx = [];\n this.preLoadedBorrowReservesSameTx = [];\n this.referrer = referrer ? referrer : PublicKey.default;\n this.currentSlot = currentSlot;\n }\n\n static async initialize(\n action: ActionType,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n kaminoMarket: KaminoMarket,\n obligation: KaminoObligation | ObligationType,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n payer?: PublicKey\n ) {\n const reserve = kaminoMarket.getReserveByMint(mint);\n if (reserve === undefined) {\n throw new Error(`Reserve ${mint} not found in market ${kaminoMarket.getAddress().toBase58()}`);\n }\n\n const { userTokenAccountAddress, userCollateralAccountAddress } = KaminoAction.getUserAccountAddresses(\n payer ?? owner,\n reserve.state\n );\n\n const { kaminoObligation, depositReserves, borrowReserves, distinctReserveCount } =\n await KaminoAction.loadObligation(action, kaminoMarket, owner, reserve.address, obligation);\n\n const referrerKey = await this.getReferrerKey(kaminoMarket, owner, kaminoObligation, referrer);\n\n return new KaminoAction(\n kaminoMarket,\n owner,\n kaminoObligation || obligation,\n userTokenAccountAddress,\n userCollateralAccountAddress,\n mint,\n distinctReserveCount,\n amount,\n depositReserves,\n borrowReserves,\n reserve,\n currentSlot,\n undefined,\n undefined,\n undefined,\n undefined,\n referrerKey,\n payer\n );\n }\n\n private static getUserAccountAddresses(owner: PublicKey, reserve: Reserve) {\n const userTokenAccountAddress = getAssociatedTokenAddress(\n reserve.liquidity.mintPubkey,\n owner,\n true,\n reserve.liquidity.tokenProgram,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n const userCollateralAccountAddress = getAssociatedTokenAddress(\n reserve.collateral.mintPubkey,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID\n );\n\n return { userTokenAccountAddress, userCollateralAccountAddress };\n }\n\n private static async loadObligation(\n action: ActionType,\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n reserve: PublicKey,\n obligation: KaminoObligation | ObligationType,\n outflowReserve?: PublicKey\n ) {\n let kaminoObligation: KaminoObligation | null;\n const depositReserves: Array<PublicKey> = [];\n const borrowReserves: Array<PublicKey> = [];\n if (obligation instanceof KaminoObligation) {\n kaminoObligation = obligation;\n } else {\n const obligationAddress = obligation.toPda(kaminoMarket.getAddress(), owner);\n kaminoObligation = await KaminoObligation.load(kaminoMarket, obligationAddress);\n }\n if (kaminoObligation !== null) {\n depositReserves.push(...[...kaminoObligation.deposits.keys()]);\n borrowReserves.push(...[...kaminoObligation.borrows.keys()]);\n }\n\n if (!outflowReserve && action === 'depositAndBorrow') {\n throw new Error(`Outflow reserve has not been set for depositAndBorrow`);\n }\n\n // Union of addresses\n const distinctReserveCount =\n new PublicKeySet<PublicKey>([\n ...borrowReserves.map((e) => e),\n ...(action === 'borrow' ? [reserve] : []),\n ...(action === 'depositAndBorrow' ? [reserve] : []),\n ]).toArray().length +\n new PublicKeySet<PublicKey>([\n ...depositReserves.map((e) => e),\n ...(action === 'deposit' ? [reserve] : []),\n ...(action === 'depositAndBorrow' ? [outflowReserve!] : []),\n ]).toArray().length;\n\n if (distinctReserveCount > POSITION_LIMIT) {\n throw Error(`Obligation already has max number of positions: ${POSITION_LIMIT}`);\n }\n\n return {\n kaminoObligation,\n depositReserves,\n borrowReserves,\n distinctReserveCount,\n };\n }\n\n static async buildRefreshObligationTxns(\n kaminoMarket: KaminoMarket,\n payer: PublicKey,\n obligation: KaminoObligation,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n currentSlot: number = 0\n ) {\n // placeholder for action initialization\n const firstReserve = obligation.state.deposits[0].depositReserve;\n const firstKaminoReserve = kaminoMarket.getReserveByAddress(firstReserve);\n if (!firstKaminoReserve) {\n throw new Error(`Reserve ${firstReserve.toBase58()} not found`);\n }\n const axn = await KaminoAction.initialize(\n 'refreshObligation',\n '0',\n firstKaminoReserve?.getLiquidityMint(),\n obligation.state.owner,\n kaminoMarket,\n obligation,\n undefined,\n currentSlot\n );\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n axn.addRefreshObligation(payer);\n\n return axn;\n }\n\n static async buildRequestElevationGroupTxns(\n kaminoMarket: KaminoMarket,\n payer: PublicKey,\n obligation: KaminoObligation,\n elevationGroup: number,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n currentSlot: number = 0\n ) {\n const firstReserve = obligation.state.deposits.find(\n (x) => !x.depositReserve.equals(PublicKey.default)\n )!.depositReserve;\n const firstKaminoReserve = kaminoMarket.getReserveByAddress(firstReserve);\n if (!firstKaminoReserve) {\n throw new Error(`Reserve ${firstReserve.toBase58()} not found`);\n }\n const axn = await KaminoAction.initialize(\n 'requestElevationGroup',\n '0',\n firstKaminoReserve?.getLiquidityMint(),\n obligation.state.owner,\n kaminoMarket,\n obligation,\n undefined,\n currentSlot\n );\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n axn.addRefreshObligation(payer);\n axn.addRequestElevationIx(elevationGroup, 'setup');\n\n return axn;\n }\n\n static async buildDepositTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' },\n overrideElevationGroupRequest: number | undefined = undefined // if set, when an elevationgroup request is made, it will use this value\n ) {\n const axn = await KaminoAction.initialize(\n 'deposit',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n await axn.addSupportIxs(\n 'deposit',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm,\n undefined,\n overrideElevationGroupRequest\n );\n axn.addDepositIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n getTokenIdsForScopeRefresh(kaminoMarket: KaminoMarket, reserves: PublicKey[]): number[] {\n const tokenIds: number[] = [];\n\n for (const reserveAddress of reserves) {\n const reserve = kaminoMarket.getReserveByAddress(reserveAddress);\n if (!reserve) {\n throw new Error(`Reserve not found for reserve ${reserveAddress.toBase58()}`);\n }\n\n if (!reserve.state.config.tokenInfo.scopeConfiguration.priceFeed.equals(PublicKey.default)) {\n reserve.state.config.tokenInfo.scopeConfiguration.priceChain.map((x) => {\n if (x !== U16_MAX) {\n tokenIds.push(x);\n }\n });\n reserve.state.config.tokenInfo.scopeConfiguration.twapChain.map((x) => {\n if (x !== U16_MAX) {\n tokenIds.push(x);\n }\n });\n }\n }\n\n return tokenIds;\n }\n\n async addScopeRefreshIxs(tokens: number[], feed: string = 'hubble') {\n this.preTxnIxsLabels.unshift(`refreshScopePrices`);\n this.preTxnIxs.unshift(\n await this.kaminoMarket.scope.refreshPriceListIx(\n {\n feed: feed,\n },\n tokens\n )\n );\n }\n\n static async buildBorrowTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' },\n overrideElevationGroupRequest: number | undefined = undefined // if set, when an elevationgroup request is made, it will use this value\n ) {\n const axn = await KaminoAction.initialize(\n 'borrow',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'borrow',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm,\n undefined,\n overrideElevationGroupRequest\n );\n axn.addBorrowIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildDepositReserveLiquidityTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'mint',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'mint',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositReserveLiquidityIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildRedeemReserveCollateralTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'redeem',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'redeem',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addRedeemReserveCollateralIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildDepositObligationCollateralTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'depositCollateral',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'depositCollateral',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n axn.addDepositObligationCollateralIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildDepositAndBorrowTxns(\n kaminoMarket: KaminoMarket,\n depositAmount: string | BN,\n depositMint: PublicKey,\n borrowAmount: string | BN,\n borrowMint: PublicKey,\n payer: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'depositAndBorrow',\n depositAmount,\n depositMint,\n borrowMint,\n payer,\n payer,\n obligation,\n borrowAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarmForDeposit = true;\n const addInitObligationForFarmForBorrow = false;\n const twoTokenAction = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n axn.outflowReserve!.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'deposit',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarmForDeposit,\n twoTokenAction\n );\n await axn.addDepositAndBorrowIx();\n await axn.addInBetweenIxs(\n 'depositAndBorrow',\n includeAtaIxns,\n requestElevationGroup,\n addInitObligationForFarmForBorrow\n );\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildRepayAndWithdrawTxns(\n kaminoMarket: KaminoMarket,\n repayAmount: string | BN,\n repayMint: PublicKey,\n withdrawAmount: string | BN,\n withdrawMint: PublicKey,\n payer: PublicKey,\n currentSlot: number,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata,\n isClosingPosition: boolean = false,\n referrer: PublicKey = PublicKey.default,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'repayAndWithdraw',\n repayAmount,\n repayMint,\n withdrawMint,\n payer,\n payer,\n obligation,\n withdrawAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarmForRepay = true;\n const addInitObligationForFarmForWithdraw = false;\n const twoTokenAction = true;\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n axn.outflowReserve!.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'repay',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarmForRepay,\n twoTokenAction\n );\n await axn.addRepayAndWithdrawIxs();\n await axn.addInBetweenIxs(\n 'repayAndWithdraw',\n includeAtaIxns,\n requestElevationGroup,\n addInitObligationForFarmForWithdraw,\n isClosingPosition\n );\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n return axn;\n }\n\n static async buildWithdrawTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'withdraw',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'withdraw',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addWithdrawIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n /**\n *\n * @param kaminoMarket\n * @param amount\n * @param mint\n * @param owner\n * @param obligation - obligation to repay or the PDA seeds\n * @param currentSlot\n * @param payer - if not set then owner is used\n * @param extraComputeBudget - if > 0 then adds the ixn\n * @param includeAtaIxns - if true it includes create and close wsol and token atas\n * @param requestElevationGroup\n * @param includeUserMetadata - if true it includes user metadata\n * @param referrer\n */\n static async buildRepayTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n mint: PublicKey,\n owner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n currentSlot: number,\n payer: PublicKey | undefined = undefined,\n extraComputeBudget: number = 1_000_000,\n includeAtaIxns: boolean = true,\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true,\n referrer: PublicKey = PublicKey.default,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initialize(\n 'repay',\n amount,\n mint,\n owner,\n kaminoMarket,\n obligation,\n referrer,\n currentSlot,\n payer\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'repay',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addRepayIx();\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildLiquidateTxns(\n kaminoMarket: KaminoMarket,\n amount: string | BN,\n minCollateralReceiveAmount: string | BN,\n repayTokenMint: PublicKey,\n withdrawTokenMint: PublicKey,\n liquidator: PublicKey,\n obligationOwner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n extraComputeBudget: number = 1_000_000, // if > 0 then adds the ixn\n includeAtaIxns: boolean = true, // if true it includes create and close wsol and token atas, and creates all other token atas if they don't exist\n requestElevationGroup: boolean = false,\n includeUserMetadata: boolean = true, // if true it includes user metadata\n referrer: PublicKey = PublicKey.default,\n maxAllowedLtvOverridePercent: number = 0,\n currentSlot: number = 0,\n scopeRefresh: ScopeRefresh = { includeScopeRefresh: false, scopeFeed: 'hubble' }\n ) {\n const axn = await KaminoAction.initializeMultiTokenAction(\n kaminoMarket,\n 'liquidate',\n amount,\n repayTokenMint,\n withdrawTokenMint,\n liquidator,\n obligationOwner,\n obligation,\n minCollateralReceiveAmount,\n referrer,\n currentSlot\n );\n const addInitObligationForFarm = true;\n\n if (extraComputeBudget > 0) {\n axn.addComputeBudgetIxn(extraComputeBudget);\n }\n\n const allReserves = new PublicKeySet<PublicKey>([\n ...axn.depositReserves,\n ...axn.borrowReserves,\n axn.reserve.address,\n axn.outflowReserve!.address,\n ]).toArray();\n const tokenIds = axn.getTokenIdsForScopeRefresh(kaminoMarket, allReserves);\n\n if (tokenIds.length > 0 && scopeRefresh.includeScopeRefresh) {\n await axn.addScopeRefreshIxs(tokenIds, scopeRefresh.scopeFeed);\n }\n\n await axn.addSupportIxs(\n 'liquidate',\n includeAtaIxns,\n requestElevationGroup,\n includeUserMetadata,\n addInitObligationForFarm\n );\n await axn.addLiquidateIx(maxAllowedLtvOverridePercent);\n axn.addRefreshFarmsCleanupTxnIxsToCleanupIxs();\n\n return axn;\n }\n\n static async buildWithdrawReferrerFeeTxns(\n owner: PublicKey,\n tokenMint: PublicKey,\n kaminoMarket: KaminoMarket,\n currentSlot: number = 0\n ) {\n const { axn, createAtasIxns } = await KaminoAction.initializeWithdrawReferrerFees(\n tokenMint,\n owner,\n kaminoMarket,\n currentSlot\n );\n\n axn.preTxnIxs.push(...createAtasIxns);\n axn.preTxnIxsLabels.push(`createAtasIxs[${axn.userTokenAccountAddress.toString()}]`);\n\n axn.addRefreshReserveIxs([axn.reserve.address]);\n axn.addWithdrawReferrerFeesIxs();\n\n return axn;\n }\n\n async getTransactions() {\n const txns: {\n preLendingTxn: Transaction | null;\n lendingTxn: Transaction | null;\n postLendingTxn: Transaction | null;\n } = {\n preLendingTxn: null,\n lendingTxn: null,\n postLendingTxn: null,\n };\n\n if (this.preTxnIxs.length) {\n txns.preLendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.preTxnIxs);\n }\n\n if (this.lendingIxs.length === 2) {\n txns.lendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(\n ...this.setupIxs,\n ...[this.lendingIxs[0]],\n ...this.inBetweenIxs,\n ...[this.lendingIxs[1]],\n ...this.cleanupIxs\n );\n } else {\n txns.lendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.setupIxs, ...this.lendingIxs, ...this.cleanupIxs);\n }\n\n if (this.postTxnIxs.length) {\n txns.postLendingTxn = new Transaction({\n feePayer: this.owner,\n recentBlockhash: (await this.kaminoMarket.getConnection().getLatestBlockhash()).blockhash,\n }).add(...this.postTxnIxs);\n }\n\n return txns;\n }\n\n async sendTransactions(sendTransaction: (txn: Transaction, connection: Connection) => Promise<TransactionSignature>) {\n const txns = await this.getTransactions();\n\n await this.sendSingleTransaction(txns.preLendingTxn, sendTransaction);\n\n const signature = await this.sendSingleTransaction(txns.lendingTxn, sendTransaction);\n\n await this.sendSingleTransaction(txns.postLendingTxn, sendTransaction);\n\n return signature;\n }\n\n private async sendSingleTransaction(\n txn: Transaction | null,\n sendTransaction: (txn: Transaction, connection: Connection) => Promise<TransactionSignature>\n ) {\n if (!txn) return '';\n\n const signature = await sendTransaction(txn, this.kaminoMarket.getConnection());\n await this.kaminoMarket.getConnection().confirmTransaction(signature);\n\n return signature;\n }\n\n async simulateTransactions(\n sendTransaction: (\n txn: Transaction,\n connection: Connection\n ) => Promise<RpcResponseAndContext<SimulatedTransactionResponse>>\n ) {\n const txns = await this.getTransactions();\n\n await this.simulateSingleTransaction(txns.preLendingTxn, sendTransaction);\n\n const signature = await this.simulateSingleTransaction(txns.lendingTxn, sendTransaction);\n\n await this.simulateSingleTransaction(txns.postLendingTxn, sendTransaction);\n\n return signature;\n }\n\n private async simulateSingleTransaction(\n txn: Transaction | null,\n sendTransaction: (\n txn: Transaction,\n connection: Connection\n ) => Promise<RpcResponseAndContext<SimulatedTransactionResponse>>\n ) {\n if (!txn) return '';\n return await sendTransaction(txn, this.kaminoMarket.getConnection());\n }\n\n addDepositIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidityAndObligationCollateral`);\n this.lendingIxs.push(\n depositReserveLiquidityAndObligationCollateral(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral\n userSourceLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addDepositReserveLiquidityIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidity`);\n this.lendingIxs.push(\n depositReserveLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n userDestinationCollateral: this.userCollateralAccountAddress,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addRedeemReserveCollateralIx() {\n this.lendingIxsLabels.push(`redeemReserveCollateral`);\n this.lendingIxs.push(\n redeemReserveCollateral(\n {\n collateralAmount: this.amount,\n },\n {\n owner: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n userSourceCollateral: this.userCollateralAccountAddress,\n userDestinationLiquidity: this.userTokenAccountAddress,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addDepositObligationCollateralIx() {\n this.lendingIxsLabels.push(`depositObligationCollateral`);\n this.lendingIxs.push(\n depositObligationCollateral(\n {\n collateralAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n depositReserve: this.reserve.address,\n reserveDestinationCollateral: this.reserve.state.collateral.supplyVault,\n userSourceCollateral: this.userCollateralAccountAddress,\n tokenProgram: TOKEN_PROGRAM_ID,\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n addBorrowIx() {\n this.lendingIxsLabels.push(`borrowObligationLiquidity`);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowIx = borrowObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n borrowReserve: this.reserve.address,\n borrowReserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveSourceLiquidity: this.reserve.state.liquidity.supplyVault,\n userDestinationLiquidity: this.userTokenAccountAddress,\n borrowReserveLiquidityFeeReceiver: this.reserve.state.liquidity.feeVault,\n referrerTokenState: referrerTokenStatePda(this.referrer, this.reserve.address, this.kaminoMarket.programId)[0],\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n borrowIx.keys =\n this.obligation!.state.elevationGroup > 0 || this.obligation!.refreshedStats.potentialElevationGroupUpdate > 0\n ? borrowIx.keys.concat([...depositReserveAccountMetas])\n : borrowIx.keys;\n this.lendingIxs.push(borrowIx);\n }\n\n async addDepositAndBorrowIx() {\n this.lendingIxsLabels.push(`depositReserveLiquidityAndObligationCollateral`);\n this.lendingIxsLabels.push(`borrowObligationLiquidity`);\n this.lendingIxs.push(\n depositReserveLiquidityAndObligationCollateral(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveDestinationDepositCollateral: this.reserve.state.collateral.supplyVault, // destinationCollateral\n userSourceLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n\n if (!this.outflowReserve) {\n throw new Error(`outflowReserve not set`);\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`additionalTokenAccountAddress not set`);\n }\n\n if (!this.outflowAmount) {\n throw new Error(`outflowAmount not set`);\n }\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n if (depositReservesList.length === 0) {\n depositReservesList.push(this.reserve.address);\n }\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowIx = borrowObligationLiquidity(\n {\n liquidityAmount: this.outflowAmount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n borrowReserve: this.outflowReserve.address,\n borrowReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n reserveSourceLiquidity: this.outflowReserve.state.liquidity.supplyVault,\n userDestinationLiquidity: this.additionalTokenAccountAddress,\n borrowReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,\n referrerTokenState: referrerTokenStatePda(\n this.referrer,\n this.outflowReserve.address,\n this.kaminoMarket.programId\n )[0],\n tokenProgram: this.outflowReserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n borrowIx.keys = borrowIx.keys.concat([...depositReserveAccountMetas]);\n\n this.lendingIxs.push(borrowIx);\n }\n\n async addRepayAndWithdrawIxs() {\n this.lendingIxsLabels.push(\n `repayObligationLiquidity(reserve=${this.reserve!.address})(obligation=${this.getObligationPda()})`\n );\n this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n const repayIx = repayObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n repayReserve: this.reserve!.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n repayIx.keys = repayIx.keys.concat([...depositReserveAccountMetas]);\n\n this.lendingIxs.push(repayIx);\n if (!this.outflowReserve) {\n throw new Error(`outflowReserve not set`);\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`additionalTokenAccountAddress not set`);\n }\n\n if (!this.outflowAmount) {\n throw new Error(`outflowAmount not set`);\n }\n\n const collateralExchangeRate = this.outflowReserve.getEstimatedCollateralExchangeRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n\n this.lendingIxs.push(\n withdrawObligationCollateralAndRedeemReserveCollateral(\n {\n collateralAmount: this.outflowAmount.eq(new BN(U64_MAX))\n ? this.outflowAmount\n : new BN(new Decimal(this.outflowAmount.toString()).mul(collateralExchangeRate).ceil().toString()),\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n withdrawReserve: this.outflowReserve.address,\n reserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n reserveCollateralMint: this.outflowReserve.getCTokenMint(),\n reserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,\n reserveSourceCollateral: this.outflowReserve.state.collateral.supplyVault,\n userDestinationLiquidity: this.additionalTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n async addWithdrawIx() {\n const collateralExchangeRate = this.reserve.getEstimatedCollateralExchangeRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n\n const collateralAmount = this.amount.eq(new BN(U64_MAX))\n ? this.amount\n : new BN(new Decimal(this.amount.toString()).mul(collateralExchangeRate).ceil().toString());\n\n this.lendingIxsLabels.push(`withdrawObligationCollateralAndRedeemReserveCollateral`);\n this.lendingIxs.push(\n withdrawObligationCollateralAndRedeemReserveCollateral(\n {\n collateralAmount,\n },\n {\n owner: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n withdrawReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n reserveCollateralMint: this.reserve.getCTokenMint(),\n reserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n reserveSourceCollateral: this.reserve.state.collateral.supplyVault,\n userDestinationLiquidity: this.userTokenAccountAddress,\n placeholderUserDestinationCollateral: this.kaminoMarket.programId,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n liquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n )\n );\n }\n\n async addRepayIx() {\n this.lendingIxsLabels.push(\n `repayObligationLiquidity(reserve=${this.reserve.address})(obligation=${this.getObligationPda()})`\n );\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const repayIx = repayObligationLiquidity(\n {\n liquidityAmount: this.amount,\n },\n {\n owner: this.payer,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n repayReserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n userSourceLiquidity: this.userTokenAccountAddress,\n reserveDestinationLiquidity: this.reserve.state.liquidity.supplyVault,\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n\n repayIx.keys =\n this.obligation!.state.elevationGroup > 0 ? repayIx.keys.concat([...depositReserveAccountMetas]) : repayIx.keys;\n\n this.lendingIxs.push(repayIx);\n }\n\n async addLiquidateIx(maxAllowedLtvOverridePercent: number = 0) {\n this.lendingIxsLabels.push(`liquidateObligationAndRedeemReserveCollateral`);\n if (!this.outflowReserve) {\n throw Error(`Withdraw reserve during liquidation is not defined`);\n }\n if (!this.additionalTokenAccountAddress) {\n throw Error(`Liquidating token account address is not defined`);\n }\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const liquidateIx = liquidateObligationAndRedeemReserveCollateral(\n {\n liquidityAmount: this.amount,\n // TODO: Configure this when updating liquidator with new interface\n minAcceptableReceivedLiquidityAmount: this.outflowAmount || new BN(0),\n maxAllowedLtvOverridePercent: new BN(maxAllowedLtvOverridePercent),\n },\n {\n liquidator: this.owner,\n obligation: this.getObligationPda(),\n lendingMarket: this.kaminoMarket.getAddress(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n repayReserve: this.reserve.address,\n repayReserveLiquidityMint: this.reserve.getLiquidityMint(),\n repayReserveLiquiditySupply: this.reserve.state.liquidity.supplyVault,\n withdrawReserve: this.outflowReserve.address,\n withdrawReserveLiquidityMint: this.outflowReserve.getLiquidityMint(),\n withdrawReserveCollateralMint: this.outflowReserve.getCTokenMint(),\n withdrawReserveCollateralSupply: this.outflowReserve.state.collateral.supplyVault,\n withdrawReserveLiquiditySupply: this.outflowReserve.state.liquidity.supplyVault,\n userSourceLiquidity: this.additionalTokenAccountAddress,\n userDestinationCollateral: this.userCollateralAccountAddress,\n userDestinationLiquidity: this.userTokenAccountAddress,\n withdrawReserveLiquidityFeeReceiver: this.outflowReserve.state.liquidity.feeVault,\n collateralTokenProgram: TOKEN_PROGRAM_ID,\n repayLiquidityTokenProgram: this.reserve.getLiquidityTokenProgram(),\n withdrawLiquidityTokenProgram: this.outflowReserve.getLiquidityTokenProgram(),\n instructionSysvarAccount: SYSVAR_INSTRUCTIONS_PUBKEY,\n },\n this.kaminoMarket.programId\n );\n liquidateIx.keys =\n this.obligation!.state.elevationGroup > 0\n ? liquidateIx.keys.concat([...depositReserveAccountMetas])\n : liquidateIx.keys;\n this.lendingIxs.push(liquidateIx);\n }\n\n async addInBetweenIxs(\n action: ActionType,\n includeAtaIxns: boolean,\n requestElevationGroup: boolean,\n addInitObligationForFarm: boolean,\n isClosingPosition: boolean = false\n ) {\n await this.addSupportIxsWithoutInitObligation(\n action,\n includeAtaIxns,\n 'inBetween',\n requestElevationGroup,\n addInitObligationForFarm,\n isClosingPosition\n );\n }\n\n addRefreshObligation(crank: PublicKey) {\n const uniqueReserveAddresses = new PublicKeySet(this.depositReserves.concat(this.borrowReserves)).toArray();\n\n const addAllToSetupIxns = 'setup';\n // Union of addresses\n const allReservesExcludingCurrent = [...uniqueReserveAddresses];\n\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAllToSetupIxns);\n this.addRefreshFarmsForReserve(\n this.depositReserves.map((r) => this.kaminoMarket.getReserveByAddress(r)!),\n addAllToSetupIxns,\n ReserveFarmKind.Collateral,\n crank\n );\n this.addRefreshFarmsForReserve(\n this.borrowReserves.map((r) => this.kaminoMarket.getReserveByAddress(r)!),\n addAllToSetupIxns,\n ReserveFarmKind.Debt,\n crank\n );\n this.addRefreshObligationIx(addAllToSetupIxns, false);\n }\n\n async addSupportIxsWithoutInitObligation(\n action: ActionType,\n includeAtaIxns: boolean,\n addAsSupportIx: AuxiliaryIx = 'setup',\n requestElevationGroup: boolean = false,\n addInitObligationForFarm: boolean = false,\n isClosingPosition: boolean = false,\n twoTokenAction: boolean = false,\n overrideElevationGroupRequest?: number\n ) {\n // TODO: why are we not doing this first?\n if (includeAtaIxns) {\n await this.addAtaIxs(action);\n }\n\n if (\n [\n 'depositCollateral',\n 'deposit',\n 'withdraw',\n 'borrow',\n 'liquidate',\n 'repay',\n 'depositAndBorrow',\n 'repayAndWithdraw',\n 'refreshObligation',\n ].includes(action)\n ) {\n // The support ixns in order are:\n // 0. Init obligation ixn\n // 0. Token Ata ixns\n // 0. Init obligation for farm\n // 1. Ixns to refresh the reserves of the obligation not related to the current action\n // 2. Ixn to refresh the reserve of the current action\n // 3. Ixn to refresh the obligation\n // 4. Ixn to refresh the `debt` farm of the obligation\n // 5. Ixn to refresh the `collateral` farm of the obligation\n // 6. The instruction itself\n // 7. Ixn to refresh the `debt` farm of the obligation\n // 8. Ixn to refresh the `collateral` farm of the obligation\n\n let currentReserves: KaminoReserve[] = [];\n\n if (action === 'liquidate' || action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n if (!this.outflowReserve) {\n throw new Error('outflowReserve is undefined');\n }\n\n if (action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n currentReserves = [this.reserve, this.outflowReserve];\n if (this.obligation) {\n if (action === 'depositAndBorrow') {\n const deposit = this.obligation.state.deposits.find((deposit) =>\n deposit.depositReserve.equals(this.reserve.address)\n );\n\n if (!deposit) {\n this.preLoadedDepositReservesSameTx.push(this.reserve.address);\n }\n } else {\n const borrow = this.obligation.state.borrows.find((borrow) =>\n borrow.borrowReserve.equals(this.reserve.address)\n );\n\n if (!borrow) {\n throw Error(`Unable to find obligation borrow to repay for ${this.obligation.state.owner.toBase58()}`);\n }\n\n const cumulativeBorrowRateObligation = KaminoObligation.getCumulativeBorrowRate(borrow);\n\n const cumulativeBorrowRateReserve = this.reserve.getEstimatedCumulativeBorrowRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n const fullRepay = KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRateReserve)\n .div(cumulativeBorrowRateObligation);\n\n const amountDecimal = new Decimal(this.amount.toString());\n\n if (fullRepay.lte(amountDecimal)) {\n this.preLoadedBorrowReservesSameTx.push(this.reserve.address);\n }\n }\n } else {\n // Obligation doesn't exist yet, so we have to preload the deposit reserve\n this.preLoadedDepositReservesSameTx.push(this.reserve.address);\n }\n } else if (action === 'liquidate' && !this.outflowReserve.address.equals(this.reserve.address)) {\n currentReserves = [this.outflowReserve, this.reserve];\n } else {\n currentReserves = [this.reserve];\n }\n } else {\n currentReserves = [this.reserve];\n }\n\n const uniqueReserveAddresses = new PublicKeySet(this.depositReserves.concat(this.borrowReserves));\n const currentReserveAddresses = new PublicKeySet(currentReserves.map((reserve) => reserve.address));\n\n // Union of addresses\n const allReservesExcludingCurrent = [...uniqueReserveAddresses.toArray()].filter(\n (address) => !currentReserveAddresses.contains(address)\n );\n\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAsSupportIx);\n if (addInitObligationForFarm) {\n if (action === 'liquidate') {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addAsSupportIx);\n await this.addInitObligationForFarm(this.outflowReserve!, ReserveFarmKind.Collateral, addAsSupportIx);\n } else if (\n action === 'depositAndBorrow' ||\n action === 'depositCollateral' ||\n action === 'withdraw' ||\n action === 'deposit'\n ) {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addAsSupportIx);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Debt, addAsSupportIx);\n }\n } else if (action === 'repayAndWithdraw' || action === 'borrow' || action === 'repay') {\n // todo - probably don't need to add both debt and collateral for everything here\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addAsSupportIx);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addAsSupportIx);\n }\n } else {\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Collateral, addAsSupportIx);\n await this.addInitObligationForFarm(this.reserve, ReserveFarmKind.Debt, addAsSupportIx);\n if (this.outflowReserve) {\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Collateral, addAsSupportIx);\n await this.addInitObligationForFarm(this.outflowReserve, ReserveFarmKind.Debt, addAsSupportIx);\n }\n }\n }\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addAsSupportIx);\n\n if (action === 'repayAndWithdraw' && addAsSupportIx === 'inBetween' && isClosingPosition) {\n // addToSetupIxs === addInBetween (same thing)\n // If this is a repay and withdraw, and it's not the first action, and it's closing a position\n // we don't need to include the repay reserve in the refresh obligation\n // I am ashamed of this code, we need to rewrite this entire thing\n this.addRefreshObligationIx(addAsSupportIx, true);\n } else {\n this.addRefreshObligationIx(addAsSupportIx, false);\n }\n\n if (requestElevationGroup) {\n if (action === 'repay') {\n const repayObligationLiquidity = this.obligation!.borrows.get(this.reserve.address);\n\n if (!repayObligationLiquidity) {\n throw new Error(`Could not find debt reserve ${this.reserve.address} in obligation`);\n }\n\n if (\n new Decimal(repayObligationLiquidity.amount).lte(new Decimal(this.amount.toString())) &&\n this.obligation!.borrows.size === 1 &&\n this.obligation?.state.elevationGroup !== 0\n ) {\n this.addRefreshReserveIxs(allReservesExcludingCurrent, 'cleanup');\n // Skip the borrow reserve, since we repay in the same tx\n this.addRefreshObligationIx('cleanup', true);\n this.addRequestElevationIx(overrideElevationGroupRequest ?? 0, 'cleanup', true);\n }\n } else if (action === 'depositAndBorrow' || action === 'borrow') {\n let newElevationGroup: number = -1;\n let addAsSupportIx: AuxiliaryIx = 'setup';\n\n if (overrideElevationGroupRequest !== undefined) {\n newElevationGroup = overrideElevationGroupRequest;\n } else {\n let emodeGroupsDebt = this.reserve.state.config.elevationGroups;\n let emodeGroupsColl = this.reserve.state.config.elevationGroups;\n let debtReserve = this.reserve.address;\n\n if (action === 'depositAndBorrow') {\n emodeGroupsDebt = this.outflowReserve!.state.config.elevationGroups;\n debtReserve = this.outflowReserve!.address;\n addAsSupportIx = 'inBetween';\n } else if (action === 'borrow') {\n const depositReserve = this.obligation!.state.deposits.find(\n (x) => !x.depositReserve.equals(PublicKey.default)\n )!.depositReserve;\n const collReserve = this.kaminoMarket.getReserveByAddress(depositReserve);\n emodeGroupsColl = collReserve!.state.config.elevationGroups;\n addAsSupportIx = 'setup';\n }\n\n const groups = this.kaminoMarket.state.elevationGroups;\n const commonElevationGroups = [...emodeGroupsColl].filter(\n (item) => emodeGroupsDebt.includes(item) && item !== 0 && groups[item - 1].debtReserve.equals(debtReserve)\n );\n\n console.log(\n 'Groups of coll reserve',\n emodeGroupsColl,\n 'Groups of debt reserve',\n emodeGroupsDebt,\n 'Common groups',\n commonElevationGroups\n );\n\n if (commonElevationGroups.length === 0) {\n console.log('No common elevation groups found, staying with default');\n } else {\n const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {\n const prevGroup = groups.find((group) => group.id === prev);\n const currGroup = groups.find((group) => group.id === curr);\n return prevGroup!.ltvPct > currGroup!.ltvPct ? prev : curr;\n });\n\n const eModeGroup = groups.find((group) => group.id === eModeGroupWithMaxLtvAndDebtReserve)!.id;\n console.log('Setting eModeGroup to', eModeGroup);\n\n if (eModeGroup !== 0 && eModeGroup !== this.obligation?.state.elevationGroup) {\n newElevationGroup = eModeGroup;\n }\n }\n }\n\n console.log('newElevationGroup', newElevationGroup, addAsSupportIx);\n if (newElevationGroup >= 0 && newElevationGroup !== this.obligation?.state.elevationGroup) {\n this.addRequestElevationIx(newElevationGroup, addAsSupportIx);\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAsSupportIx);\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addAsSupportIx);\n this.addRefreshObligationIx(addAsSupportIx);\n\n if (action === 'borrow') {\n this.obligation!.refreshedStats.potentialElevationGroupUpdate = newElevationGroup;\n }\n }\n } else if (\n action === 'deposit' &&\n overrideElevationGroupRequest !== undefined &&\n overrideElevationGroupRequest !== this.obligation?.state.elevationGroup\n ) {\n const addAsSupportIx: AuxiliaryIx = 'setup';\n console.log('Deposit: Requesting elevation group', overrideElevationGroupRequest);\n this.addRequestElevationIx(overrideElevationGroupRequest, addAsSupportIx);\n this.addRefreshReserveIxs(allReservesExcludingCurrent, addAsSupportIx);\n this.addRefreshReserveIxs(currentReserveAddresses.toArray(), addAsSupportIx);\n this.addRefreshObligationIx(addAsSupportIx);\n }\n }\n\n if (addAsSupportIx === 'setup') {\n // If this is an setup ixn (therefore not an in-between), it means it's either a one off action\n // or the first of a two-token-action\n if (action === 'liquidate') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addAsSupportIx, ReserveFarmKind.Collateral);\n this.addRefreshFarmsForReserve([this.reserve], addAsSupportIx, ReserveFarmKind.Debt);\n } else if (\n action === 'depositAndBorrow' ||\n action === 'depositCollateral' ||\n action === 'withdraw' ||\n action === 'deposit'\n ) {\n this.addRefreshFarmsForReserve(\n currentReserves,\n addAsSupportIx,\n ReserveFarmKind.Collateral,\n undefined,\n twoTokenAction\n );\n } else if (action === 'repayAndWithdraw' || action === 'borrow' || action === 'repay') {\n this.addRefreshFarmsForReserve(\n currentReserves,\n addAsSupportIx,\n ReserveFarmKind.Debt,\n undefined,\n twoTokenAction\n );\n } else {\n throw new Error(`Could not decide on refresh farm for action ${action}`);\n }\n } else {\n // If this is an inbetween, it means it's part of a two-token-action\n // so we skip the refresh farm obligation of the first reserve as that operation already happened\n // add added to 'setup' ixns\n if (action === 'depositAndBorrow') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addAsSupportIx, ReserveFarmKind.Debt);\n } else if (action === 'repayAndWithdraw') {\n this.addRefreshFarmsForReserve([this.outflowReserve!], addAsSupportIx, ReserveFarmKind.Collateral);\n } else {\n throw new Error(`Could not decide on refresh farm for action ${action}`);\n }\n }\n }\n }\n\n async addSupportIxs(\n action: ActionType,\n includeAtaIxns: boolean,\n requestElevationGroup: boolean,\n includeUserMetadata: boolean,\n addInitObligationForFarm: boolean,\n twoTokenAction: boolean = false,\n overrideElevationGroupRequest?: number\n ) {\n if (!['mint', 'redeem'].includes(action)) {\n const [, ownerUserMetadata] = await this.kaminoMarket.getUserMetadata(this.owner);\n if (!ownerUserMetadata && includeUserMetadata) {\n await this.addInitUserMetadataIxs();\n }\n\n await this.addInitReferrerTokenStateIxs();\n await this.addInitObligationIxs();\n }\n\n await this.addSupportIxsWithoutInitObligation(\n action,\n includeAtaIxns,\n 'setup',\n requestElevationGroup,\n addInitObligationForFarm,\n false,\n twoTokenAction,\n overrideElevationGroupRequest\n );\n }\n\n private static optionalAccount(pubkey: PublicKey, programId: PublicKey = PROGRAM_ID): PublicKey {\n if (isNotNullPubkey(pubkey)) {\n return pubkey;\n } else {\n return programId;\n }\n }\n\n private addRefreshReserveIxs(reserves: PublicKey[], addAsSupportIx: AuxiliaryIx = 'setup') {\n reserves.forEach((reserveAddress) => {\n const foundReserve = this.kaminoMarket.getReserveByAddress(reserveAddress);\n if (!foundReserve) {\n throw new Error(`Could not find reserve ${reserveAddress} in reserves`);\n }\n\n const { state } = foundReserve;\n\n const refreshReserveIx = refreshReserve(\n {\n lendingMarket: this.kaminoMarket.getAddress(),\n reserve: reserveAddress,\n pythOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.pythConfiguration.price,\n this.kaminoMarket.programId\n ),\n switchboardPriceOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.priceAggregator,\n this.kaminoMarket.programId\n ),\n switchboardTwapOracle: KaminoAction.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.twapAggregator,\n this.kaminoMarket.programId\n ),\n scopePrices: KaminoAction.optionalAccount(\n state.config.tokenInfo.scopeConfiguration.priceFeed,\n this.kaminoMarket.programId\n ),\n },\n this.kaminoMarket.programId\n );\n\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(refreshReserveIx);\n this.setupIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(refreshReserveIx);\n this.inBetweenIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n } else {\n this.cleanupIxs.push(refreshReserveIx);\n this.cleanupIxsLabels.push(`RefreshReserve[${reserveAddress}]`);\n }\n });\n }\n\n public static getRefreshAllReserves(kaminoMarket: KaminoMarket, reserves: PublicKey[]): TransactionInstruction[] {\n return reserves.map((reserveAddress): TransactionInstruction => {\n const foundReserve = kaminoMarket.getReserveByAddress(reserveAddress);\n if (!foundReserve) {\n throw new Error(`Could not find reserve ${reserveAddress} in reserves`);\n }\n\n const { state } = foundReserve;\n return refreshReserve(\n {\n reserve: reserveAddress,\n lendingMarket: state.lendingMarket,\n pythOracle: this.optionalAccount(state.config.tokenInfo.pythConfiguration.price, kaminoMarket.programId),\n switchboardPriceOracle: this.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.priceAggregator,\n kaminoMarket.programId\n ),\n switchboardTwapOracle: this.optionalAccount(\n state.config.tokenInfo.switchboardConfiguration.twapAggregator,\n kaminoMarket.programId\n ),\n scopePrices: this.optionalAccount(\n state.config.tokenInfo.scopeConfiguration.priceFeed,\n kaminoMarket.programId\n ),\n },\n kaminoMarket.programId\n );\n });\n }\n\n private addRefreshObligationIx(addAsSupportIx: AuxiliaryIx = 'setup', skipBorrowObligations: boolean = false) {\n const marketAddress = this.kaminoMarket.getAddress();\n const obligationPda = this.getObligationPda();\n const refreshObligationIx = refreshObligation(\n {\n lendingMarket: marketAddress,\n obligation: obligationPda,\n },\n this.kaminoMarket.programId\n );\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const preloadedBorrowReservesString = this.preLoadedBorrowReservesSameTx.map((reserve) => reserve.toString());\n const borrowReservesList = this.borrowReserves.filter(\n (reserve) => !preloadedBorrowReservesString.includes(reserve.toString())\n );\n\n const borrowReserveAccountMetas = borrowReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowReservesReferrerTokenStates = borrowReservesList\n .map((reserve) => {\n if (this.referrer.equals(PublicKey.default)) {\n return { pubkey: this.kaminoMarket.programId, isSigner: false, isWritable: true };\n }\n const referrerTokenStateAddress = referrerTokenStatePda(this.referrer, reserve, this.kaminoMarket.programId)[0];\n return { pubkey: referrerTokenStateAddress, isSigner: false, isWritable: true };\n })\n .filter((x) => !x.pubkey.equals(this.kaminoMarket.programId));\n\n refreshObligationIx.keys = refreshObligationIx.keys.concat([\n ...depositReserveAccountMetas,\n ...(skipBorrowObligations ? [] : [...borrowReserveAccountMetas, ...borrowReservesReferrerTokenStates]),\n ]);\n\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(refreshObligationIx);\n this.setupIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(refreshObligationIx);\n this.inBetweenIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n } else {\n this.cleanupIxs.push(refreshObligationIx);\n this.cleanupIxsLabels.push(`RefreshObligation[${obligationPda.toString()}]`);\n }\n }\n\n private addRequestElevationIx(\n elevationGroup: number,\n addAsSupportIx: AuxiliaryIx,\n skipBorrowObligations: boolean = false\n ) {\n const obligationPda = this.getObligationPda();\n const args: RequestElevationGroupArgs = {\n elevationGroup,\n };\n const accounts: RequestElevationGroupAccounts = {\n owner: this.owner,\n obligation: obligationPda,\n lendingMarket: this.kaminoMarket.getAddress(),\n };\n\n const requestElevationGroupIx = requestElevationGroup(args, accounts, this.kaminoMarket.programId);\n\n const depositReservesList = this.getAdditionalDepositReservesList();\n\n const depositReserveAccountMetas = depositReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const preloadedBorrowReservesString = this.preLoadedBorrowReservesSameTx.map((reserve) => reserve.toString());\n const borrowReservesList = this.borrowReserves.filter(\n (reserve) => !preloadedBorrowReservesString.includes(reserve.toString())\n );\n\n const borrowReserveAccountMetas = borrowReservesList.map((reserve) => {\n return { pubkey: reserve, isSigner: false, isWritable: true };\n });\n\n const borrowReservesReferrerTokenStates = borrowReservesList\n .map((reserve) => {\n if (this.referrer.equals(PublicKey.default)) {\n return { pubkey: this.kaminoMarket.programId, isSigner: false, isWritable: true };\n }\n const reserveState = this.kaminoMarket.getReserveByAddress(reserve)!;\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.referrer,\n reserveState.address,\n this.kaminoMarket.programId\n )[0];\n return { pubkey: referrerTokenStateAddress, isSigner: false, isWritable: true };\n })\n .filter((x) => !x.pubkey.equals(this.kaminoMarket.programId));\n\n requestElevationGroupIx.keys = requestElevationGroupIx.keys.concat([\n ...depositReserveAccountMetas,\n ...(skipBorrowObligations ? [] : [...borrowReserveAccountMetas, ...borrowReservesReferrerTokenStates]),\n ]);\n\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(requestElevationGroupIx);\n this.setupIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(requestElevationGroupIx);\n this.inBetweenIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n } else {\n this.cleanupIxs.push(requestElevationGroupIx);\n this.cleanupIxsLabels.push(`RequestElevation[${obligationPda}], elevation_group:${elevationGroup}`);\n }\n }\n\n private addRefreshFarmsForReserve(\n reserves: KaminoReserve[],\n addAsSupportIx: AuxiliaryIx = 'setup',\n mode: typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n crank: PublicKey = this.payer,\n twoTokenAction: boolean = false\n ) {\n const BASE_SEED_USER_STATE = Buffer.from('user');\n const getPda = (farm: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [BASE_SEED_USER_STATE, farm.toBytes(), this.getObligationPda().toBytes()],\n farmsId\n )[0];\n\n const farms: [\n typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n PublicKey,\n PublicKey,\n KaminoReserve\n ][] = [];\n\n for (const kaminoReserve of reserves) {\n if (mode === ReserveFarmKind.Collateral && !kaminoReserve.state.farmCollateral.equals(PublicKey.default)) {\n farms.push([\n ReserveFarmKind.Collateral,\n kaminoReserve.state.farmCollateral,\n getPda(kaminoReserve.state.farmCollateral),\n kaminoReserve,\n ]);\n }\n if (mode === ReserveFarmKind.Debt && !kaminoReserve.state.farmDebt.equals(PublicKey.default)) {\n farms.push([\n ReserveFarmKind.Debt,\n kaminoReserve.state.farmDebt,\n getPda(kaminoReserve.state.farmDebt),\n kaminoReserve,\n ]);\n }\n }\n\n farms.forEach(\n (arg: [typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt, PublicKey, PublicKey, KaminoReserve]) => {\n const args: RefreshObligationFarmsForReserveArgs = { mode: arg[0].discriminator };\n const accounts: RefreshObligationFarmsForReserveAccounts = {\n crank,\n obligation: this.getObligationPda(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: arg[3].address,\n reserveFarmState: arg[1],\n obligationFarmUserState: arg[2],\n lendingMarket: this.kaminoMarket.getAddress(),\n farmsProgram: farmsId,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n };\n const refreshFarmForObligationix = refreshObligationFarmsForReserve(\n args,\n accounts,\n this.kaminoMarket.programId\n );\n\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(refreshFarmForObligationix);\n this.setupIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n if (twoTokenAction) {\n // If two token action, this refresh needs to be the first inbetween ix\n this.inBetweenIxs.push(refreshFarmForObligationix);\n this.inBetweenIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n } else {\n this.refreshFarmsCleanupTxnIxs.push(refreshFarmForObligationix);\n this.refreshFarmsCleanupTxnIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n }\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(refreshFarmForObligationix);\n this.inBetweenIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n\n this.refreshFarmsCleanupTxnIxs.push(refreshFarmForObligationix);\n this.refreshFarmsCleanupTxnIxsLabels.push(\n `RefreshFarmForObligation[${\n arg[0].kind\n }, res=${arg[3].address.toString()}, obl=${this.getObligationPda().toString()}]`\n );\n }\n }\n );\n }\n\n private addRefreshFarmsCleanupTxnIxsToCleanupIxs() {\n this.cleanupIxs.splice(0, 0, ...this.refreshFarmsCleanupTxnIxs);\n this.cleanupIxsLabels.splice(0, 0, ...this.refreshFarmsCleanupTxnIxsLabels);\n }\n\n private async addInitObligationForFarm(\n reserve: KaminoReserve,\n mode: typeof ReserveFarmKind.Collateral | typeof ReserveFarmKind.Debt,\n addAsSupportIx: AuxiliaryIx = 'setup'\n ): Promise<void> {\n const BASE_SEED_USER_STATE = Buffer.from('user');\n const getPda = (farm: PublicKey) =>\n PublicKey.findProgramAddressSync(\n [BASE_SEED_USER_STATE, farm.toBytes(), this.getObligationPda().toBytes()],\n farmsId\n )[0];\n\n const farms: [number, PublicKey, PublicKey][] = [];\n\n if (mode === ReserveFarmKind.Collateral && isNotNullPubkey(reserve.state.farmCollateral)) {\n const pda = getPda(reserve.state.farmCollateral);\n const account = await this.kaminoMarket.getConnection().getAccountInfo(pda);\n if (!account) {\n farms.push([ReserveFarmKind.Collateral.discriminator, reserve.state.farmCollateral, pda]);\n }\n }\n\n if (mode === ReserveFarmKind.Debt && isNotNullPubkey(reserve.state.farmDebt)) {\n const pda = getPda(reserve.state.farmDebt);\n const account = await this.kaminoMarket.getConnection().getAccountInfo(pda);\n if (!account) {\n farms.push([ReserveFarmKind.Debt.discriminator, reserve.state.farmDebt, getPda(reserve.state.farmDebt)]);\n }\n }\n\n farms.forEach((arg: [number, PublicKey, PublicKey]) => {\n const args: InitObligationFarmsForReserveArgs = { mode: arg[0] };\n const accounts: InitObligationFarmsForReserveAccounts = {\n owner: this.obligation ? this.obligation.state.owner : this.owner,\n payer: this.owner,\n obligation: this.getObligationPda(),\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n reserve: reserve.address,\n reserveFarmState: arg[1],\n obligationFarm: arg[2],\n lendingMarket: this.kaminoMarket.getAddress(),\n farmsProgram: farmsId,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n };\n const initObligationForFarm = initObligationFarmsForReserve(args, accounts, this.kaminoMarket.programId);\n if (addAsSupportIx === 'setup') {\n this.setupIxs.push(initObligationForFarm);\n this.setupIxsLabels.push(\n `InitObligationForFarm[${reserve.address.toString()}, ${this.getObligationPda().toString()}]`\n );\n } else if (addAsSupportIx === 'inBetween') {\n this.inBetweenIxs.push(initObligationForFarm);\n this.inBetweenIxsLabels.push(\n `InitObligationForFarm[${reserve.address.toString()}, ${this.getObligationPda().toString()}]`\n );\n }\n });\n }\n\n private async addInitObligationIxs() {\n if (!this.obligation) {\n const obligationPda = this.getObligationPda();\n const [userMetadataAddress, _bump] = userMetadataPda(this.owner, this.kaminoMarket.programId);\n const initObligationIx = initObligation(\n {\n args: {\n tag: this.obligationType!.toArgs().tag,\n id: this.obligationType!.toArgs().id,\n },\n },\n {\n obligationOwner: this.owner,\n feePayer: this.payer,\n obligation: obligationPda,\n lendingMarket: this.kaminoMarket.getAddress(),\n seed1Account: this.obligationType!.toArgs().seed1,\n seed2Account: this.obligationType!.toArgs().seed2,\n ownerUserMetadata: userMetadataAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n this.setupIxs.push(initObligationIx);\n this.setupIxsLabels.push(`InitObligation[${obligationPda.toString()}]`);\n }\n }\n\n private async addInitUserMetadataIxs() {\n const [createLutIx, lookupTableAddress] = await createLookupTableIx(this.kaminoMarket.getConnection(), this.owner);\n this.setupIxs.push(createLutIx);\n this.setupIxsLabels.push(`createUserLutIx[${lookupTableAddress.toString()}]`);\n const [userMetadataAddress, _bump] = userMetadataPda(this.owner, this.kaminoMarket.programId);\n const referrerUserMetadataAddress = this.referrer.equals(PublicKey.default)\n ? this.kaminoMarket.programId\n : userMetadataPda(this.referrer, this.kaminoMarket.programId)[0];\n const initUserMetadataIx = initUserMetadata(\n {\n userLookupTable: lookupTableAddress,\n },\n {\n owner: this.owner,\n feePayer: this.payer,\n userMetadata: userMetadataAddress,\n referrerUserMetadata: referrerUserMetadataAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n this.setupIxs.push(initUserMetadataIx);\n this.setupIxsLabels.push(`initUserMetadata[${userMetadataAddress.toString()}]`);\n }\n\n private async addInitReferrerTokenStateIxs(reservesArr: KaminoReserve[] = []) {\n if (this.referrer.equals(PublicKey.default)) {\n return;\n }\n\n const outflowReserve = this.outflowReserve?.address ? [this.outflowReserve.address] : [];\n\n const reserves =\n reservesArr.length !== 0\n ? reservesArr.map((reserve) => reserve.address)\n : new PublicKeySet<PublicKey>([this.reserve.address, ...outflowReserve]).toArray();\n const tokenStatesToCreate: [PublicKey, PublicKey][] = [];\n for (const reserve of reserves) {\n if (!reserve) {\n continue;\n }\n\n const referrerTokenStateAddress = referrerTokenStatePda(this.referrer, reserve, this.kaminoMarket.programId)[0];\n\n if (!(await checkIfAccountExists(this.kaminoMarket.getConnection(), referrerTokenStateAddress))) {\n tokenStatesToCreate.push([referrerTokenStateAddress, reserve]);\n }\n }\n\n tokenStatesToCreate.forEach(([referrerTokenStateAddress, reserveAddress]) => {\n const initreferrerTokenStateIx = initReferrerTokenState(\n {\n referrer: this.referrer,\n },\n {\n lendingMarket: this.kaminoMarket.getAddress(),\n payer: this.owner,\n reserve: reserveAddress,\n referrerTokenState: referrerTokenStateAddress,\n rent: SYSVAR_RENT_PUBKEY,\n systemProgram: SystemProgram.programId,\n },\n this.kaminoMarket.programId\n );\n\n this.setupIxs.unshift(initreferrerTokenStateIx);\n this.setupIxsLabels.unshift(\n `InitReferrerTokenState[${referrerTokenStateAddress.toString()} res=${reserveAddress}]`\n );\n });\n }\n\n private addWithdrawReferrerFeesIxs() {\n const referrerTokenStateAddress = referrerTokenStatePda(\n this.owner,\n this.reserve.address,\n this.kaminoMarket.programId\n )[0];\n\n const withdrawReferrerFeesIx = withdrawReferrerFees(\n {\n referrer: this.owner,\n lendingMarket: this.kaminoMarket.getAddress(),\n reserve: this.reserve.address,\n reserveLiquidityMint: this.reserve.getLiquidityMint(),\n referrerTokenState: referrerTokenStateAddress,\n reserveSupplyLiquidity: this.reserve.state.liquidity.supplyVault,\n referrerTokenAccount: this.userTokenAccountAddress,\n lendingMarketAuthority: this.kaminoMarket.getLendingMarketAuthority(),\n tokenProgram: this.reserve.getLiquidityTokenProgram(),\n },\n this.kaminoMarket.programId\n );\n\n this.lendingIxs.push(withdrawReferrerFeesIx);\n this.lendingIxsLabels.push(`WithdrawReferrerFeesIx[${this.owner.toString()}]`);\n }\n\n private addComputeBudgetIxn(units: number) {\n this.setupIxs.push(buildComputeBudgetIx(units));\n this.setupIxsLabels.push(`AddComputeBudget[${units}]`);\n }\n\n private async addAtaIxs(action: ActionType) {\n if (this.mint.equals(WRAPPED_SOL_MINT) || this.secondaryMint?.equals(WRAPPED_SOL_MINT)) {\n await this.updateWSOLAccount(action);\n }\n\n if ((action === 'withdraw' || action === 'borrow' || action === 'redeem') && !this.mint.equals(WRAPPED_SOL_MINT)) {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.reserve.getLiquidityMint(),\n this.owner,\n this.reserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT) {\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateLiquidityUserAta[${this.owner}]`);\n } else {\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateLiquidityUserAta[${this.owner}]`);\n }\n }\n }\n\n if (action === 'liquidate') {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n if (!this.outflowReserve) {\n throw new Error(`Outflow reserve state not found ${this.mint}`);\n }\n\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getLiquidityMint(),\n this.owner,\n this.outflowReserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n } else {\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n }\n }\n\n const userCollateralAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.userCollateralAccountAddress);\n if (!userCollateralAccountInfo) {\n const [, createUserCollateralAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getCTokenMint(),\n this.owner,\n TOKEN_PROGRAM_ID,\n this.userCollateralAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserCollateralAccountIx);\n this.preTxnIxsLabels.push(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n } else {\n this.setupIxs.unshift(createUserCollateralAccountIx);\n this.setupIxsLabels.unshift(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n }\n }\n\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.mint}`);\n }\n }\n\n if (\n action === 'depositAndBorrow' ||\n (action === 'repayAndWithdraw' && !this.secondaryMint?.equals(WRAPPED_SOL_MINT))\n ) {\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.secondaryMint}`);\n }\n\n if (!this.outflowReserve) {\n throw new Error(`Outflow reserve state not found ${this.mint}`);\n }\n\n const additionalUserTokenAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.additionalTokenAccountAddress);\n\n if (!additionalUserTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.outflowReserve.getLiquidityMint(),\n this.owner,\n this.outflowReserve.getLiquidityTokenProgram(),\n this.additionalTokenAccountAddress\n );\n\n this.setupIxs.unshift(createUserTokenAccountIx);\n this.setupIxsLabels.unshift(`CreateAdditionalUserTokenAta[${this.owner}]`);\n }\n }\n\n if (action === 'withdraw' || action === 'mint' || action === 'deposit' || action === 'repayAndWithdraw') {\n const userTokenAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(this.userTokenAccountAddress);\n\n // TODO: Might need to remove this\n if (!userTokenAccountInfo) {\n const [, createUserTokenAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n this.reserve.getLiquidityMint(),\n this.owner,\n this.reserve.getLiquidityTokenProgram(),\n this.userTokenAccountAddress\n );\n this.preTxnIxs.push(createUserTokenAccountIx);\n this.preTxnIxsLabels.push(`CreateUserAta[${this.userTokenAccountAddress.toBase58()}]`);\n }\n }\n if (action === 'mint') {\n const userCollateralAccountInfo = await this.kaminoMarket\n .getConnection()\n .getAccountInfo(this.userCollateralAccountAddress);\n\n if (!userCollateralAccountInfo) {\n const collateralMintPubkey = this.reserve.getCTokenMint();\n const [, createUserCollateralAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n collateralMintPubkey,\n this.owner,\n TOKEN_PROGRAM_ID,\n this.userCollateralAccountAddress\n );\n\n if (this.positions === POSITION_LIMIT && this.mint.equals(WRAPPED_SOL_MINT)) {\n this.preTxnIxs.push(createUserCollateralAccountIx);\n this.preTxnIxsLabels.push(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n } else {\n this.setupIxs.unshift(createUserCollateralAccountIx);\n this.setupIxsLabels.unshift(`CreateCollateralUserAta[${this.userCollateralAccountAddress.toString()}]`);\n }\n }\n }\n }\n\n private async updateWSOLAccount(action: ActionType) {\n const preIxs: Array<TransactionInstruction> = [];\n const postIxs: Array<TransactionInstruction> = [];\n const preIxsLabels: Array<string> = [];\n const postIxsLabels: Array<string> = [];\n\n if (action === 'depositAndBorrow' || action === 'repayAndWithdraw') {\n return;\n }\n\n let safeRepay = new BN(this.amount);\n\n if (this.obligation && action === 'repay' && this.amount.eq(new BN(U64_MAX))) {\n const borrow = this.obligation.state.borrows.find(\n (borrow) => borrow.borrowReserve.toString() === this.reserve.address.toString()\n );\n\n if (!borrow) {\n throw Error(`Unable to find obligation borrow to repay for ${this.obligation.state.owner.toBase58()}`);\n }\n\n const cumulativeBorrowRateObligation = KaminoObligation.getCumulativeBorrowRate(borrow);\n const cumulativeBorrowRateReserve = this.reserve.getEstimatedCumulativeBorrowRate(\n this.currentSlot,\n this.kaminoMarket.state.referralFeeBps\n );\n // TODO: shouldn't this calc be added to all other stuff as well?\n safeRepay = new BN(\n Math.floor(\n KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRateReserve)\n .div(cumulativeBorrowRateObligation)\n .add(new Decimal(SOL_PADDING_FOR_INTEREST.toString()))\n .toNumber()\n ).toString()\n );\n }\n\n let userTokenAccountAddress = this.userTokenAccountAddress;\n if (this.secondaryMint?.equals(WRAPPED_SOL_MINT)) {\n if (!this.additionalTokenAccountAddress) {\n throw new Error(`Additional token account address not found ${this.secondaryMint}`);\n }\n userTokenAccountAddress = this.additionalTokenAccountAddress;\n }\n\n const userWSOLAccountInfo = await this.kaminoMarket.getConnection().getAccountInfo(userTokenAccountAddress);\n\n const rentExempt = await this.kaminoMarket.getConnection().getMinimumBalanceForRentExemption(165);\n\n // Add rent exemption lamports for WSOL accounts that need to be pre-funded for inflow/send transactions\n const sendAction =\n action === 'deposit' ||\n action === 'repay' ||\n action === 'mint' ||\n (action === 'liquidate' && this.secondaryMint?.equals(WRAPPED_SOL_MINT)); // only sync WSOL amount if liquidator repays SOL which is secondaryMint\n\n const transferLamportsIx = SystemProgram.transfer({\n fromPubkey: this.owner,\n toPubkey: userTokenAccountAddress,\n lamports: (userWSOLAccountInfo ? 0 : rentExempt) + (sendAction ? parseInt(safeRepay.toString(), 10) : 0),\n });\n preIxs.push(transferLamportsIx);\n preIxsLabels.push(`TransferLamportsToUserAtaSOL[${userTokenAccountAddress}]`);\n\n const closeWSOLAccountIx = createCloseAccountInstruction(\n userTokenAccountAddress,\n this.owner,\n this.owner,\n [],\n TOKEN_PROGRAM_ID\n );\n\n const syncIx = syncNative(userTokenAccountAddress);\n if (userWSOLAccountInfo) {\n if (sendAction) {\n preIxs.push(syncIx);\n preIxsLabels.push(`SyncUserAtaSOL[${userTokenAccountAddress}]`);\n } else {\n postIxs.push(closeWSOLAccountIx);\n postIxsLabels.push(`CloseUserAtaSOL[${userTokenAccountAddress}]`);\n }\n } else {\n const [, createUserWSOLAccountIx] = createAssociatedTokenAccountIdempotentInstruction(\n this.owner,\n NATIVE_MINT,\n this.owner,\n TOKEN_PROGRAM_ID,\n userTokenAccountAddress\n );\n preIxs.push(createUserWSOLAccountIx);\n preIxsLabels.push(`CreateUserAtaSOL[${userTokenAccountAddress}]`);\n preIxs.push(syncIx);\n preIxsLabels.push(`SyncUserAtaSOL[${userTokenAccountAddress}]`);\n postIxs.push(closeWSOLAccountIx);\n postIxsLabels.push(`CloseUserAtaSOL[${userTokenAccountAddress}]`);\n }\n\n // TODO: Consider for liquidations and other types of actions if we have to split up some ixs in 2-3 txs\n // if (this.positions && this.positions >= POSITION_LIMIT) {\n // this.preTxnIxs.push(...preIxs);\n // this.preTxnIxsLabels.push(...preIxsLabels);\n // this.postTxnIxs.push(...postIxs);\n // this.postTxnIxsLabels.push(...postIxsLabels);\n // } else {\n // }\n this.setupIxs.unshift(...preIxs);\n this.setupIxsLabels.unshift(...preIxsLabels);\n this.cleanupIxs.push(...postIxs);\n this.cleanupIxsLabels.push(...postIxsLabels);\n }\n\n static async initializeMultiTokenAction(\n kaminoMarket: KaminoMarket,\n action: ActionType,\n inflowAmount: string | BN,\n inflowTokenMint: PublicKey,\n outflowTokenMint: PublicKey,\n payer: PublicKey,\n obligationOwner: PublicKey,\n obligation: KaminoObligation | ObligationType,\n outflowAmount?: string | BN,\n referrer: PublicKey = PublicKey.default,\n currentSlot: number = 0\n ) {\n const inflowReserve = kaminoMarket.getReserveByMint(inflowTokenMint);\n const outflowReserve = kaminoMarket.getReserveByMint(outflowTokenMint);\n\n if (!outflowReserve || !inflowReserve) {\n throw new Error('reserve states are not fetched');\n }\n\n const {\n userTokenAccountAddress: userOutflowTokenAccountAddress,\n userCollateralAccountAddress: userOutflowCollateralAccountAddress,\n } = KaminoAction.getUserAccountAddresses(payer, outflowReserve.state);\n\n const {\n userTokenAccountAddress: userInflowTokenAccountAddress,\n userCollateralAccountAddress: userInflowCollateralAccountAddress,\n } = KaminoAction.getUserAccountAddresses(payer, inflowReserve.state);\n\n const { kaminoObligation, depositReserves, borrowReserves, distinctReserveCount } =\n await KaminoAction.loadObligation(\n action,\n kaminoMarket,\n obligationOwner,\n inflowReserve.address,\n obligation,\n outflowReserve.address\n );\n const referrerKey = await this.getReferrerKey(kaminoMarket, payer, kaminoObligation, referrer);\n\n let userTokenAccountAddress: PublicKey;\n let userCollateralAccountAddress: PublicKey;\n let additionalUserTokenAccountAddress: PublicKey;\n let secondaryMint: PublicKey;\n let primaryMint: PublicKey;\n\n if (action === 'liquidate') {\n userTokenAccountAddress = userOutflowTokenAccountAddress;\n userCollateralAccountAddress = userOutflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userInflowTokenAccountAddress;\n primaryMint = outflowTokenMint;\n secondaryMint = inflowTokenMint;\n } else if (action === 'depositAndBorrow') {\n userTokenAccountAddress = userInflowTokenAccountAddress;\n userCollateralAccountAddress = userInflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userOutflowTokenAccountAddress;\n primaryMint = inflowTokenMint;\n secondaryMint = outflowTokenMint;\n } else if (action === 'repayAndWithdraw') {\n primaryMint = inflowTokenMint;\n secondaryMint = outflowTokenMint;\n userTokenAccountAddress = userInflowTokenAccountAddress;\n userCollateralAccountAddress = userOutflowCollateralAccountAddress;\n additionalUserTokenAccountAddress = userOutflowTokenAccountAddress;\n } else {\n throw new Error('Invalid action');\n }\n\n return new KaminoAction(\n kaminoMarket,\n payer,\n kaminoObligation || obligation,\n userTokenAccountAddress,\n userCollateralAccountAddress,\n primaryMint,\n distinctReserveCount,\n inflowAmount,\n depositReserves,\n borrowReserves,\n inflowReserve,\n currentSlot,\n secondaryMint,\n additionalUserTokenAccountAddress,\n outflowReserve,\n outflowAmount,\n referrerKey\n );\n }\n\n static async initializeWithdrawReferrerFees(\n mint: PublicKey,\n owner: PublicKey,\n kaminoMarket: KaminoMarket,\n currentSlot: number = 0\n ) {\n const reserve = kaminoMarket.getReserveByMint(mint);\n if (reserve === undefined) {\n throw new Error(`Reserve ${mint} not found in market ${kaminoMarket.getAddress().toBase58()}`);\n }\n\n const { atas, createAtasIxns } = await getAtasWithCreateIxnsIfMissing(\n kaminoMarket.getConnection(),\n owner,\n [reserve.getLiquidityMint()],\n [reserve.getLiquidityTokenProgram()]\n );\n\n const userTokenAccountAddress = atas[0];\n\n return {\n axn: new KaminoAction(\n kaminoMarket,\n owner,\n new VanillaObligation(kaminoMarket.programId),\n userTokenAccountAddress,\n PublicKey.default,\n mint,\n 0,\n new BN(0),\n [],\n [],\n reserve,\n currentSlot,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined\n ),\n createAtasIxns,\n };\n }\n\n getObligationPda(): PublicKey {\n return this.obligation\n ? this.obligation.obligationAddress\n : this.obligationType!.toPda(this.kaminoMarket.getAddress(), this.owner);\n }\n\n getAdditionalDepositReservesList(): PublicKey[] {\n const depositReservesList = this.depositReserves;\n\n // check if there's any member in the preloadedDepositReserves that is not in the depositReserves\n // if so, add it to the depositReserves\n for (let i = 0; i < this.preLoadedDepositReservesSameTx.length; i++) {\n const preloadedDepositReserve = this.preLoadedDepositReservesSameTx[i];\n\n // Check if the depositReserves array contains the current preloadedDepositReserve\n const found = this.depositReserves.some((depositReserve) => {\n return depositReserve.equals(preloadedDepositReserve);\n });\n\n // If not found, push the current preloadedDepositReserve to the depositReserves array\n if (!found) {\n depositReservesList.push(this.preLoadedDepositReservesSameTx[i]);\n }\n }\n\n return depositReservesList;\n }\n\n private static async getReferrerKey(\n kaminoMarket: KaminoMarket,\n owner: PublicKey,\n kaminoObligation: KaminoObligation | null,\n referrer: PublicKey\n ) {\n let referrerKey = referrer;\n if (!referrer || referrer.equals(PublicKey.default)) {\n if (kaminoObligation === null) {\n const [_, userMetadata] = await kaminoMarket.getUserMetadata(owner);\n if (userMetadata) {\n referrerKey = userMetadata.referrer;\n }\n } else {\n referrerKey = kaminoObligation.state.referrer;\n }\n }\n return referrerKey;\n }\n}\n"]}