{"version":3,"file":"assets/js/main.bundle.2d67998a5c107f4c64f7.js","mappings":"6BAAIA,E,62ECAJ,IAyBIC,EACAC,EACAC,EACAC,EACAC,EACAC,EA9BJC,EAAAC,EAAA,OACAC,EAAAC,EAAAF,EAAA,OACAG,EAAAH,EAAA,OAEAI,EAAAC,EAAAL,EAAA,OACAM,EAAAD,EAAAL,EAAA,QAIAO,EAAAL,EAAAF,EAAA,QACAQ,EAAAR,EAAA,OAIAS,EAAAP,EAAAF,EAAA,QACAU,EAAAR,EAAAF,EAAA,QACAW,EAAAT,EAAAF,EAAA,QACAY,EAAAZ,EAAA,OACAa,EAAAX,EAAAF,EAAA,QACAc,EAAAd,EAAA,OACAe,EAAAb,EAAAF,EAAA,OACAgB,EAAAd,EAAAF,EAAA,QAEWiB,EAAAA,QAA2B,GAC3BA,EAAAA,uBAAwB,EAOnC,IAAMC,EAAM,SAoEZ,SAAsBC,I,gGACpB,OAAIzB,GACF0B,QAAQC,IAAIH,EAAK,sBACjB,MAiLkB,EAAAN,EAAAU,kBAAiB,IAAIC,KAAQ5B,GAAgB,IAAI4B,KAAK,IAE9CnB,EAAAoB,QAAOC,0BA3KnC,GAAMC,MAJJN,QAAQC,IAAIH,EAAK,sCAAuCvB,GACxD,K,OAMF,GAHAgC,EAAAC,OAGIlC,EAEF,OADA0B,QAAQC,IAAIH,EAAK,sBACjB,IAGFxB,GAAqB,E,iBAGnB,O,sBAAA,GAAMmB,EAAYgB,uB,cAAlBF,EAAAC,O,gCAEA,EAAAd,EAAAgB,cAAaC,EAAO,mC,oBAGtBrC,GAAqB,EACrBC,EAAe,IAAI4B,K,WAoBrB,SAAsBS,EAAMC,G,gGACD,SAAMxB,EAAkByB,oBAAoBD,I,OAEjE,OAFEE,EAAmBR,EAAAC,OAErB,GAAM3B,EAAiBmC,qBAAqBH,EAAME,I,cAAlDR,EAAAC,QACFlB,EAAG2B,qC,QADD,M,OAEO,SAAMtB,EAAeuB,sBAAsBL,I,cAA3CN,EAAAC,QACTlB,EAAG6B,mB,QADM,M,OAEA,SAAM1B,EAAY2B,YAAYP,I,cAA9BN,EAAAC,QACTlB,EAAG+B,uB,QADM,M,OAEA,SAAMhC,EAAkBiC,kBAAkBT,I,cAA1CN,EAAAC,QACTlB,EAAGiC,8B,QADM,M,OAEA,SAAM1C,EAAiB2C,eAAeX,EAAME,I,eAA5CR,EAAAC,QACTlB,EAAG6B,mB,QADM,O,QAGT,SAAM7B,EAAGmC,4BAA4BZ,I,QAArCN,EAAAC,O,oCAiIJ,SAAeF,I,iGACNjC,GAAiBC,GAAsBG,GAC5CuB,QAAQC,IAAIH,EAAK,UAAWzB,EAAeC,EAAoBG,GAC/D,IAAM,EAAAM,EAAA2C,OAAM,MAF2C,M,cAEvDnB,EAAAC,O,8BApQJX,EAAAA,SAAA,SAA+BgB,G,gGAG7B,OAFAnC,EAAcmC,GAMd,GAAMP,KAHJ,I,OAKF,GAFAC,EAAAC,OAEI9B,GAAemC,EAEjB,OADAb,QAAQC,IAAIH,EAAK,0DACjB,IAGFrB,GAAc,E,iBAEZ,O,sBAAA,GAAMmC,EAAMC,I,cAAZN,EAAAC,O,0CAGqB7B,EAAAgD,mCACnB3B,QAAQC,IACNH,EACA,sFACA8B,GAEFtC,EAAGuC,4BACMnD,GAAemC,EACxBb,QAAQC,IACNH,EACA,2DACA8B,IAGF,EAAAlC,EAAAgB,cAAakB,EAAO,mC,oBAGxBnD,GAAc,E,YAGhBoB,EAAAA,mBAAA,SAAyCgB,G,0FACvC,OAAK7B,EAAAoB,QAAO0B,mBAKRtD,IACFwB,QAAQC,IAAIH,EAAK,2BAA4BtB,GAC7CuD,cAAcvD,GACdA,OAAkBwD,GAGK,GAAM3C,EAAkByB,oBAAoBD,MAVnEb,QAAQC,IAAIH,EAAK,sDACjB,K,OAWF,OAFyBS,EAAAC,QAGvBR,QAAQC,IAAIH,EAAK,+CACjB,KAGF,GAAMC,K,cAANQ,EAAAC,OAGAhC,EAAkByD,OAAOC,aAAY,WAAM,OAAAnC,GAAA,GAAoB,KAE/DC,QAAQC,IAAIH,EAAK,2BAA4BtB,G,YAG/CqB,EAAAA,iBAAAE,EA+BAF,EAAAA,eAAA,SAAqCgB,G,gGACnC,SAAMP,K,OAANC,EAAAC,OAEAnC,GAAgB,E,iBAEd,O,sBAAA,GAAMuB,EAAQuC,YAAYtB,I,cAA1BN,EAAAC,O,gCAEA,EAAAd,EAAAgB,cAAa0B,EAAO,2B,oBAGlB7C,EAAa8C,gBAmJjB9D,OAAeyD,GA/If3D,GAAgB,E,YAGlBwB,EAAAA,MAAAe,EAkBAf,EAAAA,qBAAA,SAA2CgB,G,sGAUhB,OATR,EAAA3B,EAAAkB,SAAE,uCAEVkC,MAAK,WACS,QAAjB,EAAApD,EAAAkB,SAAEmC,MAAMC,QACV,EAAAtD,EAAAkB,SAAEmC,MAAME,KAAK,WAAW,IAE1B,EAAAvD,EAAAkB,SAAEmC,MAAME,KAAK,WAAYlD,EAAa8C,cACxC,IAEyB,GAAMhD,EAAkByB,oBAAoBD,I,OAEf,OAFhDE,EAAmB2B,EAAAlC,OAE6B,GAAMmC,QAAQC,IAAI,EACtE,EAAAxD,EAAAyD,wBAAuBhC,EAAME,IAC7B,EAAA3B,EAAA0D,2BAA0BjC,EAAME,M,cAF5BR,EAAgDmC,EAAAlC,OAA/CuC,EAAmBxC,EAAA,GAAEyC,EAAsBzC,EAAA,GAKlDjB,EAAG2D,qBACDF,EACAC,EACAnC,EAAKqC,U,YAITrD,EAAAA,eAAA,W,kGACsB,SAAMV,EAAIgE,iB,cAAxBC,EAAc7C,EAAAC,OACpBX,EAAAA,QAAUuD,EAAYC,cACtBxD,EAAAA,sBAAwBuD,EAAYE,sBAE9BC,EAoCR,SAA8BC,GAC5B,IAAKA,EAAWC,wBAAyB,OAAO,KAEhD,IAAMC,EAAiBF,EAAWC,wBAAwBE,YACpDC,EAAwBJ,EAAWF,sBACnCO,EAAUL,EAAWH,cAEvBS,EAAgC,KAE9BC,EAA8B,GAoCpC,OAlCAF,EAAQG,SAAQ,SAAUC,GACpBL,EACFK,EAAOC,cAAcF,SAAQ,SAAUG,GACrCA,EAAaC,SAASJ,SAAQ,SAAUK,GACtCN,EAAaO,KAAK,CAChBC,SAAUN,EAAOO,GACjBC,eAAgBN,EAAaK,GAC7BE,UAAWL,EAAQG,GACnBH,QAASA,GAEb,GACF,IAEAJ,EAAOG,SAASJ,SAAQ,SAAUK,GAChCN,EAAaO,KAAK,CAChBC,SAAUN,EAAOO,GACjBC,eAAgB,KAChBC,UAAWL,EAAQG,GACnBH,QAASA,GAEb,GAEJ,IAEAN,EAAaY,MAAK,SAAUC,GACtBA,EAAYP,QAAQV,aAAeD,IACrCI,EAAmB,CACjBS,SAAUK,EAAYL,SACtBE,eAAgBG,EAAYH,eAC5BC,UAAWE,EAAYP,QAAQG,GAC/BH,QAASO,EAAYP,SAG3B,IACOP,CACT,CAlFkCe,CAAqBzB,GAErD9D,EAAGwF,eACD1B,EAAYC,cACZE,EACAH,EAAYE,uB,YAKhBzD,EAAAA,mBAAA,W,wHACsB,SAAMV,EAAIgE,iB,OAI9B,IAJMC,EAAc2B,EAAAvE,OACpBX,EAAAA,QAAUuD,EAAYC,cACtBxD,EAAAA,sBAAwBuD,EAAYE,sBAEpC0B,EAAA,EAAqBC,EAAApF,EAAAgE,QAAAmB,EAAAC,EAAAC,OAAAF,IAAS,CAC5B,IADSf,EAAMgB,EAAAD,GACfzE,EAAA,EAAsBmC,EAAAuB,EAAOG,SAAP7D,EAAAmC,EAAAwC,OAAA3E,IACpB,MAAO,CAAP,EADgBmC,EAAAnC,GACDiE,IAEjB,IAAAW,EAAA,EAAoBC,EAAAnB,EAAOC,cAAPiB,EAAAC,EAAAF,OAAAC,IAClB,IADSE,EAAKD,EAAAD,GACdG,EAAA,EAAsBC,EAAAF,EAAMjB,SAANkB,EAAAC,EAAAL,OAAAI,IACpB,MAAO,CAAP,EADgBC,EAAAD,GACDd,IAInB,IAAAgB,EAAA,EAAsBC,EAAAxB,EAAOG,SAAPoB,EAAAC,EAAAP,OAAAM,IACpB,MAAO,CAAP,EADgBC,EAAAD,GACDhB,G,mBAKrB3E,EAAAA,OAAA,WACE6F,aAAaC,QACbrG,EAAGsG,yBACL,C,88ECnOA,IAgLIC,EAhLJC,EAAAlH,EAAA,OACAI,EAAAC,EAAAL,EAAA,OAGAO,EAAAL,EAAAF,EAAA,QACAmH,EAAAjH,EAAAF,EAAA,QACAQ,EAAAR,EAAA,OACAY,EAAAZ,EAAA,OACAoH,EAAAlH,EAAAF,EAAA,QACAqH,EAAArH,EAAA,OACAsH,EAAAtH,EAAA,MAEAW,EAAAT,EAAAF,EAAA,QAEAuH,EAAArH,EAAAF,EAAA,OACAe,EAAAb,EAAAF,EAAA,OACAgB,EAAAd,EAAAF,EAAA,QAEMkB,EAAM,SA0EZ,SAAsBsG,I,kGACN,SAAMJ,EAASK,wBAAwBrH,EAAAoB,QAAOkG,mB,OAC3C,OADXjB,EAAQ9E,EAAAC,OACG,GAAMwF,EAASO,YAAYlB,EAAMmB,K,OAElD,OAFMC,EAAWlG,EAAAC,OACjBR,QAAQC,IAAIH,EAAK,kBAAmB2G,EAASvB,QACtC,CAAP,EAAOuB,G,OAGT,SAAeC,EAA2BC,G,gHACxC,IAAKA,EAAQC,eAAe,KAAOD,EAAQC,eAAe,GAAGC,QAC3D,MAAM,IAAIf,EAAAgB,qBACR,6DACEC,KAAKC,UAAUL,IAYrB,OARA3G,QAAQC,IACNH,EACA,8BACA6G,EAAQC,eAAe,GAAGC,SAwI9B,SAA6BI,GAE3B,GAAI1H,EAAa2H,iBAAmB3H,EAAa4H,YAC/C,GAAIF,EAAaG,UAAYH,EAAaI,UAAW,CACnD,GACEJ,EAAaG,WAAa7H,EAAa2H,iBACvCD,EAAaI,YAAc9H,EAAa4H,YAMxC,OAJAnH,QAAQC,IACNH,EACA,0EAEK,EAEPE,QAAQC,IAAIH,EAAK,8C,MAGnBE,QAAQC,IAAIH,EAAK,0CAGrB,OAAO,CACT,CAxJOwH,CAFCL,EAAed,EAAYoB,gBAAgBZ,KAS3Ca,EAAgBC,MAAMC,OAAOT,EAAaO,eAE5C,IAAIrH,KAAKwG,EAAQgB,sBADjBV,EAAaO,aAGjBxH,QAAQC,IACNH,EACA,+BACA6G,EAAQC,eAAe,GAAGC,QAC1BW,EACAP,GAGIW,EAiFR,SAAqBC,EAAeL,GA2BlC,OA1BwB3B,EAAeiC,QAAO,SAACC,GAG7C,IAAMC,EAAQ,IAAI7H,KAAKqH,GACjBS,EAAuB,IAAI9H,KAC/B6H,EAAME,WAAWF,EAAMG,aAAe,IAGxC,QAAI,IAAIhI,KAAK4H,EAAEK,mBAAqBH,KAIhCF,EAAEM,KAAKC,cAAgBP,EAAEM,KAAKC,aAAazB,UAAYgB,MAItDE,EAAEQ,eAEWR,EAAEQ,aAAa5D,MAC/B,SAAC6D,GAAM,OAAAA,EAAEF,aAAazB,UAAYgB,CAA3B,KAKX,GAGF,CA7GmBY,CAAY9B,EAAQC,eAAe,GAAGC,QAASW,GAEhExH,QAAQC,IAAIH,EAAK,kBAAmB8H,EAAS1C,QAErB,IAApB0C,EAAS1C,OAAqB,CAAP,GAAO,IAE5BR,EAAYuC,EAAavC,UAC/BnF,EAAamJ,WAAWhE,GACxB,GAAMqB,EAAK4C,kBA1BF,CAAP,GAAO,G,OA4Ba,OAFtBpI,EAAAC,OAEsB,GAAMrB,EAAIyJ,gBAAgB3B,EAAa4B,c,cAAvDC,EAAgBvI,EAAAC,QAElB,MACF,GAAMwF,EAAS+C,cAAcpC,EAAQH,K,OACrC,MADAjG,EAAAC,OACM,IAAIsF,EAAAgB,qBACR,eAAAkC,OAAe/B,EAAa4B,YAAYI,MAAK,oBAAAD,OAAmBhK,EAAAoB,QAAO8I,QAAO,MAC5E,+D,OAIFC,GAAe,E,IAEGC,EAAAxB,E,wBAAA5C,EAAAoE,EAAAlE,OACD,GAAMmE,EADhBC,EAAOF,EAAApE,KAAY,O,cACTzE,EAAAC,OAEjB,GAAM+I,EAAgBD,EAASrC,EAAc6B,IAD3C,M,OAEF,OADAvI,EAAAC,OACA,GAAMb,EAAe6J,4BAA4BF,I,OAAjD/I,EAAAC,OAEA2I,GAAe,E,iBAKjB,SAAMhD,EAAYsD,gBAChB9C,EACA,IAAIxG,KAAKmJ,EAAQlB,oB,QAFnB7H,EAAAC,O,0BAXoBwE,I,cAiBtB,MAAO,CAAP,EAAOmE,G,OAOT,SAAeO,EAAgBjD,G,gHAE7B,IADMkD,EAAmB,IAAIC,IAC7B5E,EAAA,EAAsB6E,EAAApD,EAAAzB,EAAA6E,EAAA3E,OAAAF,IAAX2B,EAAOkD,EAAA7E,GACV8E,EAAS3D,EAAYoB,gBAAgBZ,GACrCa,EAAesC,EAAOtC,aAG1Bb,EAAQC,gBACRD,EAAQC,eAAe,IACvBD,EAAQC,eAAe,GAAGC,UAEpBA,EAAUF,EAAQC,eAAe,GAAGC,QAC1C8C,EAAiBI,IAAIlD,EAASW,IAMd,OAFpBxH,QAAQC,IAAIH,EAAK,kCAAmC6J,GAEhC,GAAM3D,EAASyC,YAAYkB,I,cAAzCK,EAAczJ,EAAAC,OAEdyJ,EAA2BD,EAAYE,MAAK,SAACC,EAAGC,GACpD,IAAMC,EAAQ,IAAIlK,KAAKgK,EAAE/B,kBACnBkC,EAAQ,IAAInK,KAAKiK,EAAEhC,kBAEzB,OAAIiC,EAAQC,EAAc,EACjBA,EAAQD,GAAe,EACzB,CACT,IAEAxE,EAAiBoE,E,WA4DnB,SAAeZ,EAAkBC,G,sGACP,SAAM3J,EAAe4K,wBAAwBjB,I,OACrE,OADwB/I,EAAAC,QAEtBR,QAAQC,IAAIH,EAAK,kCAAmCwJ,EAAQkB,SACrD,CAAP,GAAO,KAGHC,EAAoBtL,EAAIuL,gCAAgC,CAC5DC,QAASrB,EAAQkB,UAEbI,EAmBR,SAAiCtB,G,0FAC/B,OAAItK,EAAAoB,QAAOyK,wBAAgC,CAAP,GAAO,GAE1B,GAAM1L,EAAI2L,mBAAmB,CAC5CH,QAASrB,EAAQkB,QACjBO,eAAcC,EAAA,CACZ1B,EAAQjB,KAAKC,aAAazB,SACvByC,EAAQf,aAAa0C,KAAI,SAACC,GAAO,OAAAA,EAAG5C,aAAazB,OAAhB,KAAwB,GAE9DsE,QAAS7B,EAAQ8B,KAAKC,QACtBC,UAAU,EAAA9L,EAAA+L,mBAAkB,IAAIpL,KAAKmJ,EAAQlB,sB,OAE/C,MAAO,CAAP,EATiB7H,EAAAC,OASDgL,c,OA/BOC,CAAkBnC,GACtB,GAAMmB,I,OACD,OADlBiB,EAAanL,EAAAC,OACK,GAAMoK,G,OAE9B,OAFMe,EAAkBpL,EAAAC,OAEpBkL,GACF1L,QAAQC,IACNH,EACA,+DAEK,CAAP,GAAO,IAEL6L,GACF3L,QAAQC,IAAIH,EAAK,yCACV,CAAP,GAAO,IAGF,CAAP,GAAO,G,OAkBT,SAAeyJ,EACbD,EACArC,EACA6B,G,iGAEA9I,QAAQC,IAAIH,EAAK,kBAAmBwJ,EAAQkB,SACd,iBAA1BvD,EAAa2E,WAAiC3E,EAAa2E,UAA3D,MACF,GAAMC,EAAgBvC,EAASrC,EAAc6B,I,qBAE7CvI,EAAAC,O,mBADmC,aAA1ByG,EAAa2E,UAAb,MACT,GAAME,EAAcxC,EAASrC,EAAc6B,I,OAE3C,MAAM,IAAIhD,EAAAgB,qBACR,yCAA2CG,EAAa2E,W,wBAK9D,SAAeC,EACbvC,EACArC,EACA6B,G,oGAIuB,OAFvB9I,QAAQC,IAAIH,EAAK,sBAAuBwJ,EAAQkB,QAASvD,GAElC,GAAMrH,EAAQmM,2BACnCzC,EAAQ9C,GACR,eACAxE,I,OAGkB,OANdgK,EAAiBzL,EAAAC,OAMH,GAAMyL,EAA0B3C,EAASrC,I,OACvC,OADhBiF,EAAc3L,EAAAC,OACE,GAAMrB,EAAI0M,gBAAgBK,I,OAChD,OADMC,EAAgB5L,EAAAC,OACtB,GAAMrB,EAAIiN,8BAA8BD,EAAe,CAACrD,K,cAAxDvI,EAAAC,OACIwL,EAAe9G,OAAS,EAC1B,GAAM/F,EAAIkN,6BAA6BF,EAAeH,IADpD,M,OACFzL,EAAAC,O,iBAGF,SAAMrB,EAAImN,kBAAkB,CAAEC,UAAW,2B,cAAzChM,EAAAC,O,WAGF,SAAesL,EACbxC,EACArC,EACA6B,G,oGAIuB,OAFvB9I,QAAQC,IAAIH,EAAK,oBAAqBwJ,EAAQkB,SAEvB,GAAM5K,EAAQmM,2BACnCzC,EAAQ9C,GACR,eACAxE,I,OAGgB,OANZgK,EAAiBzL,EAAAC,OAML,GAAMgM,EAAwBlD,EAASrC,I,OACrC,OADdwF,EAAYlM,EAAAC,OACE,GAAMrB,EAAI2M,cAAcW,I,OAC5C,OADMC,EAAcnM,EAAAC,OACpB,GAAMrB,EAAIwN,4BAA4BD,EAAa,CAAC5D,K,cAApDvI,EAAAC,OACIwL,EAAe9G,OAAS,EAC1B,GAAM/F,EAAIyN,2BAA2BF,EAAaV,IADhD,M,OACFzL,EAAAC,O,iBAGF,SAAMrB,EAAImN,kBAAkB,CAAEC,UAAW,yB,cAAzChM,EAAAC,O,WAGF,SAAeyL,EACbpL,EACAoG,G,0GAQ+B,OANzBuD,EAAU3J,EAAK2J,QACfqC,GAAY,EAAA5G,EAAA6G,0BAAyBjM,GACrCkM,EAAW,IAAI5M,KAAKU,EAAKuH,kBACzBgD,EAAOvK,EAAKuK,KAAKC,QACjB2B,EAAW/F,EAAagG,sBAEC,GAAM9N,EAAI+N,uBAAuBL,I,OAehE,OAfMM,EAAyB5M,EAAAC,OAexB,CAAP,EAbiC,CAC/BmK,QAASH,EACT4C,SAAU,KACVC,mBAAmB,EAAA7N,EAAA+L,mBAAkBwB,GACrCO,OAAQ,CACNC,KAAM,SAERC,UAAWL,EACXhC,QAASC,EACTqC,aAAcT,EAASS,aACvBC,SAAU,O,OAMd,SAAelB,EACb3L,EACAoG,G,0GAQ+B,OANzBuD,EAAU3J,EAAK2J,QACfqC,GAAY,EAAA5G,EAAA6G,0BAAyBjM,GACrCkM,EAAW,IAAI5M,KAAKU,EAAKuH,kBACzBgD,EAAOvK,EAAKuK,KAAKC,QACjB2B,EAAW/F,EAAagG,sBAEC,GAAM9N,EAAI+N,uBAAuBL,I,OAgBhE,OAhBMM,EAAyB5M,EAAAC,OAgBxB,CAAP,EAd6B,CAC3BmK,QAASH,EACTmD,WAAYX,EAASW,WACrBC,YAAY,EAAApO,EAAA+L,mBAAkBwB,GAC9BO,OAAQ,CACNC,KAAM,SAERC,UAAWL,EACXhC,QAASC,EACTyC,SAAUb,EAASa,SACnBJ,aAAcT,EAASS,aACvBK,OAAQd,EAASc,S,OAvZrBjO,EAAAA,YAAA,SAAkCgB,G,gHAChC,OAAK7B,EAAAoB,QAAO0B,kBAEU,gBAAlBjB,EAAKqC,SAAmC,CAAP,GAAO,IAE5ClD,QAAQC,IAAIH,EAAK,kCACG,IAAM,EAAAoG,EAAA6H,wBAAuBlN,KALX,CAAP,GAAO,G,OAUrB,OALXmN,EAAczN,EAAAC,QAIRyN,gBAAgB,GACX,GAAM7H,K,OACF,OADfK,EAAWlG,EAAAC,OACI,IAAM,EAAApB,EAAA8O,oBAAmBrN,OAAMmB,I,OAIpD,IAJMmM,EAAe5N,EAAAC,OAGf4N,EAAyC,G,WACpCvF,GACT,IAAMlC,EAAUF,EAAS9B,MACvB,SAAC0J,GACC,OAAAA,EAAEzH,gBACFyH,EAAEzH,eAAe,IACjByH,EAAEzH,eAAe,GAAGC,UAAYgC,EAAYhB,KAF5C,IAIAlB,GACFyH,EAAa9J,KAAKqC,E,EARtB3B,EAAA,EAA0BsJ,EAAAH,EAAAnJ,EAAAsJ,EAAApJ,OAAAF,IAAf6D,EAAWyF,EAAAtJ,G,EAAX6D,GAaX,OAA4B,IAAxBuF,EAAalJ,QACflF,QAAQC,IAAIH,EAAK,2CACV,CAAP,GAAO,KAIHyO,EAA0BH,EAAaI,OAAM,SAACH,GAClDrO,QAAQC,IAAIH,EAAK,sCAAAkJ,OAAsCqF,EAAEI,YACzD,IAAMxH,EAAed,EAAYoB,gBAAgB8G,GAQjD,OAPArO,QAAQC,IACNH,EACA,8BAAAkJ,OAA8B/B,EAAaO,cAC3CE,OAAOT,EAAaO,eAEtBxH,QAAQC,IAAIH,EAAK,oBAAAkJ,OAAoBgF,GAAetG,OAAOsG,IAGzD/G,EAAaO,cAAgBwG,GAC7B/G,EAAayH,mBAAqBV,CAEtC,IAEAhO,QAAQC,IAAIH,EAAK,8BAA+ByO,GACzC,CAAP,EAAOA,I,QAGT1O,EAAAA,oBAAA,W,wGAGmB,OAFjBG,QAAQC,IAAIH,EAAK,8CAEA,GAAMsG,K,OACvB,SAAMsD,EADAjD,EAAW/D,EAAAlC,S,OACjBkC,EAAAlC,OAEI2I,GAAe,E,IAEGwF,EAAAlI,E,wBAAAzB,EAAA2J,EAAAzJ,QAAXyB,EAAOgI,EAAA3J,GAChBmE,EAAA,MAAiB,GAAMzC,EAA2BC,KADtB,M,OAC5BwC,EAAiBzG,EAAAlC,O,yCADGwE,I,oBAIlBmE,EACF,GAAMhK,EAAImN,kBAAkB,CAAEC,UAAW,uBADvC,M,OACF7J,EAAAlC,O,mCAIJX,EAAAA,oBAAAuG,C,qwEC5FA,IAAAN,EAAAlH,EAAA,OACAI,EAAAC,EAAAL,EAAA,OAGAoH,EAAAlH,EAAAF,EAAA,QACAW,EAAAT,EAAAF,EAAA,QACAgQ,EAAAhQ,EAAA,OAEMkB,EAAM,SA6DZ,SAAgB+O,EACdlI,EACAM,GAEAjH,QAAQC,IACNH,EACA,0BACA6G,EAAQC,eAAe,GAAGC,QAC1BI,GAGFN,EAAQmI,cAAgB/H,KAAKC,UAAUC,EACzC,CAEA,SAAgBM,EACdZ,GAEA,IAAM2B,EAAe3B,EAAQC,eAAe,GAAGC,QAE/C,IAEE,IAAMkI,EAASC,OAAOC,OACpB,IAAIL,EAAAM,oBACJnI,KAAKoI,MAAMxI,EAAQmI,gBAGrB,IAAKC,EAAOK,WACV,MAAM,IAAItJ,EAAAgB,qBAAqB,+BAKjC,OAFA9G,QAAQC,IAAIH,EAAK,uBAAwBwI,EAAcyG,GAEhDA,C,CACP,MAAOM,GACP,MAAM,IAAIvJ,EAAAgB,qBACR,6CAAAkC,OAA6CV,EAAY,aAAAU,OAAYrC,EAAQmI,cAAa,KAC1FO,E,CAGN,CAlGAxP,EAAAA,sBAAA,SACE6E,EACAkH,EACA/C,EACAoE,EACAqC,G,sGAIwB,OAFxBtP,QAAQC,IAAIH,EAAK,kBAAmB+I,EAAYI,OAExB,GAAMjD,EAASuJ,WACrC1G,EAAYI,MACZjK,EAAAoB,QAAOkG,mB,OA4CT,OA9CMkJ,EAAkBjP,EAAAC,OAKlBmG,EAAkC,CACtC8H,UAAW5F,EAAY4G,UACvBC,QAAS7G,EAAY8G,SACrB/I,eAAgB,CACd,CACEC,QAASgC,EAAYI,MACrB2G,KAAM/G,EAAY4G,UAAY,IAAM5G,EAAY8G,WAGpDE,SAAU,IAIRL,IAAiB7I,EAAQH,GAAKgJ,EAAgBhJ,KAE5CS,EAAe,IAAI2H,EAAAM,qBACZ7H,UAAY9H,EAAa4H,YACtCF,EAAaG,SAAW7H,EAAa2H,gBACrCD,EAAavC,UAAYA,EACzBuC,EAAa2E,UAAYA,EACzB3E,EAAa4B,YAAcA,EAC3B5B,EAAagG,sBAAwBA,EACrChG,EAAaO,aAAe8H,EAC5BrI,EAAayH,kBAAoBY,EAEjCtP,QAAQC,IACNH,EACA,qCACAmH,EAAaI,UACbJ,EAAaG,UAIXoI,IACIM,EAAuBvI,EAAgBiI,GAC7CvI,EAAayH,kBAAoBoB,EAAqBpB,mBAGxDG,EAAgBlI,EAASM,GAGzB,GAAMjB,EAAS+J,sBAAsBpJ,EAAS3H,EAAAoB,QAAOkG,mB,cAArD/F,EAAAC,OACAR,QAAQC,IAAIH,EAAK,uB,YAGnBD,EAAAA,gBAAAgP,EAcAhP,EAAAA,gBAAA0H,EA2BA1H,EAAAA,gBAAA,SACE8G,EACAqJ,G,gGAIA,OAFAhQ,QAAQC,IAAIH,EAAK,6BAA8BkQ,IACzC/I,EAAeM,EAAgBZ,KACjBM,EAAaO,aAAewI,GAC9ChQ,QAAQC,IAAIH,EAAK,gDAAiDkQ,GAClE,MAEF/I,EAAaO,aAAewI,EAC5BnB,EAAgBlI,EAASM,GACzB,GAAMjB,EAASiK,cAActJ,K,cAA7BpG,EAAAC,O,k0BC3HF,IAAA0P,EAAAtR,EAAA,OACAuR,EAAAvR,EAAA,OACAkH,EAAAlH,EAAA,OACAwR,EAAAxR,EAAA,OACAyR,EAAAzR,EAAA,OAEA0R,EAAA1R,EAAA,OACA2R,EAAAtR,EAAAL,EAAA,QACA4R,EAAA5R,EAAA,OACA6R,EAAA7R,EAAA,OACA8R,EAAA9R,EAAA,OACA+R,EAAA/R,EAAA,OACAgS,EAAAhS,EAAA,OACAD,EAAAC,EAAA,OACAU,EAAAR,EAAAF,EAAA,QAEAiB,EAAAA,aAAA,SAA6BwP,EAAkBwB,GAC7C7Q,QAAQC,IAAI,kBAAmB4Q,EAAiBxB,GAEhDwB,EAAkBA,GAAmB,GACrC,IAAMC,EAAezB,GAASA,EAAM/F,QAAU+F,EAAM/F,QAAU,GACxDyH,EAA2BF,EAC7BA,EAAkB,KAClB,GACEG,EACJH,GAAmBC,EACfC,EAA2BD,EAC3BD,EAAkBC,EAGpBzB,aAAiBe,EAAAa,wBACnB3R,EAAG4R,eACD,sLAGO7B,aAAiBgB,EAAAc,6BAC1B7R,EAAG4R,eACD,+DAEO7B,aAAiBuB,EAAAQ,wBAC1B9R,EAAG4R,eAAe,sCAIlB7B,aAAiBa,EAAAmB,mCACjBhC,aAAiBc,EAAAmB,cACjBjC,aAAiBvJ,EAAAgB,qBAEjBxH,EAAGiS,gBAAgBP,EAAiC3B,GAI7CA,aAAiBmB,EAAAgB,oBACxBlS,EAAGiS,gBACD,yDACAlC,GAGFA,aAAiBkB,EAAAnQ,SACjBiP,aAAiBiB,EAAAmB,eAEjBnS,EAAGoS,oBAAoB,gDACvBhM,aAAaC,SACJ0J,aAAiBoB,EAAAkB,mBAC1BrS,EAAGiS,gBACDR,EACE,oDACF1B,GAKKA,aAAiBqB,EAAAkB,oBACxBtS,EAAGiS,gBACDR,EACE,mCACA1B,EAAM/F,QACR+F,GAEOA,aAAiBsB,EAAAkB,iBAC1BvS,EAAGiS,gBACDR,EAA2B,+BAAiC1B,EAAM/F,QAClE+F,GAEOA,aAAiB1Q,EAAAgD,kCAE1BrC,EAAGiS,gBAAgBR,EAA2B1B,EAAM/F,QAAS+F,GAK7D/P,EAAGiS,gBACDR,EACE,wDACF1B,EAGN,C,myEChGA,IAAAyC,EAAAlT,EAAA,OAEAI,EAAAC,EAAAL,EAAA,OACAoH,EAAAlH,EAAAF,EAAA,QACAS,EAAAP,EAAAF,EAAA,QAEMkB,EAAM,SAEZD,EAAAA,sBAAA,SACEgB,G,kGAEA,OAAI7B,EAAAoB,QAAOyK,wBACF,CAAP,GAAO,IAGT7K,QAAQC,IAAIH,EAAK,wCAAyCe,EAAK2J,SAE5C,IAAM,EAAAsH,EAAAC,0BAAyBlR,K,OAKlD,OALMmR,EAAazR,EAAAC,OACbyR,EAAUD,EAAWE,IAAI,YAAAlJ,OAAYhK,EAAAoB,QAAO+R,YAElDnS,QAAQC,IAAIH,EAAK,+CAAgDmS,GAE1D,CAAP,EAAmB,MAAZA,G,QAGTpS,EAAAA,wBAAA,SAA8CyJ,G,gGAC5C,OAAItK,EAAAoB,QAAOyK,wBACF,CAAP,GAAO,IAGT7K,QAAQC,IAAIH,EAAK,gDAEA,GAAMkG,EAASoM,oBAC9B9I,EACA,YAAAN,OAAYhK,EAAAoB,QAAO+R,c,OASrB,OAXME,EAAW9R,EAAAC,OAKjBR,QAAQC,IACNH,EACA,sDACAuS,GAGK,CAAP,EAAoB,MAAbA,G,QAGTxS,EAAAA,0BAAA,SAAgDgB,G,gGAC9C,OAAI7B,EAAAoB,QAAOyK,wBACT,KAGF7K,QAAQC,IAAIH,EAAK,qCAEE,GAAMT,EAAkB0S,yBAAyBlR,K,OAEpE,OAFMmR,EAAazR,EAAAC,QACRuJ,IAAI,YAAAf,OAAYhK,EAAAoB,QAAO+R,WAAa,KAC/C,GAAM9S,EAAkBiT,0BAA0BN,I,cAAlDzR,EAAAC,O,YAGFX,EAAAA,4BAAA,SACEyJ,G,0FAEA,OAAItK,EAAAoB,QAAOyK,wBACT,KAGF7K,QAAQC,IAAIH,EAAK,2CAEjB,GAAMkG,EAASuM,oBACbjJ,EACA,YAAAN,OAAYhK,EAAAoB,QAAO+R,WACnB,O,cAHF5R,EAAAC,O,mzECpEF,IAAAtB,EAAAD,EAAAL,EAAA,QACAO,EAAAL,EAAAF,EAAA,QACAU,EAAAR,EAAAF,EAAA,QAEAiB,EAAAA,qBAAA,W,gGACwB,SAAMV,EAAIqT,oB,cAA1BC,EAAgBlS,EAAAC,OACtBlB,EAAGoT,cAAcD,EAAe,uBAAuB,IACvD,EAAAvT,EAAAkB,SAAE,cAAcuS,O,YAGlB9S,EAAAA,yBAAA,W,gGAC4B,SAAMV,EAAIyT,wB,cAA9BC,EAAoBtS,EAAAC,OAC1BlB,EAAGoT,cAAcG,EAAmB,sBAAsB,G,YAG5DhT,EAAAA,aAAA,W,gGACgB,SAAMV,EAAI2T,Y,cAAlBC,EAAQxS,EAAAC,OACdlB,EAAGoT,cAAcK,EAAO,qBAAqB,IAE7C,EAAA7T,EAAAkB,SAAE,uBAAuB4S,QAAQ,U,YAGnCnT,EAAAA,kBAAA,W,gGACqB,SAAMV,EAAI8T,iB,cAAvBC,EAAa3S,EAAAC,OACnBlB,EAAGoT,cAAcQ,EAAY,yBAAyB,IAEtD,EAAAhU,EAAAkB,SAAE,uBAAuB4S,QAAQ,U,YAGnCnT,EAAAA,yBAAA,W,gGACmB,SAAMV,EAAIgU,e,cAArBC,EAAW7S,EAAAC,OACjBlB,EAAGoT,cAAcU,EAAU,0BAA0B,IAErD,EAAAlU,EAAAkB,SAAE,uBAAuB4S,QAAQ,U,miFCjCnC,IAAAlN,EAAAlH,EAAA,OAGAI,EAAAC,EAAAL,EAAA,OACAM,EAAAD,EAAAL,EAAA,QACAsR,EAAAtR,EAAA,OAKAO,EAAAL,EAAAF,EAAA,QACAY,EAAAZ,EAAA,OACAS,EAAAP,EAAAF,EAAA,QACAkT,EAAAlT,EAAA,OACAC,EAAAC,EAAAF,EAAA,OAEAU,EAAAR,EAAAF,EAAA,QACAW,EAAAT,EAAAF,EAAA,QAEAuH,EAAArH,EAAAF,EAAA,OACAe,EAAAb,EAAAF,EAAA,OAEMkB,EAAM,SA0EZ,SAAe4K,EAAgC7J,G,oGAElC,OADc6B,GAAAnC,EAAApB,GAAIuL,gC,KAClB,GAAM7L,EAAiBwU,0BAA0BxS,I,OADzC,SAAM6B,EAAA4Q,MAAA/S,EAAA,EACvB4E,EAAAwF,QAASvF,EAAA5E,OAAsD,M,OAEjE,GAHmB4E,EAAA5E,OAIjB,MAAM,IAAIsF,EAAAgB,qBACR,+D,iBAKN,SAAeyM,EAAiBpF,G,gGAMN,OALlBqF,EAAqB,GAC3BrF,EAAanK,SAAQ,SAAU6E,GAC7B2K,EAAmBlP,KAAKmP,EAA0B5K,GACpD,IAEwB,GAAMlG,QAAQC,IAAI4Q,I,OAC1C,MAAO,CAAP,EADwBjT,EAAAC,Q,OAI1B,SAAsBqL,EACpBhL,EACAE,EACA2S,G,wGAMuB,OAJvB1T,QAAQC,IAAIH,EAAK,qBAAsBiB,GAIhB,GAAM4S,EAC3B9S,EACAE,I,OAGkB,OALdiL,EAAiBzL,EAAAC,OAKH,GAAMoT,EAAqB/S,EAAME,I,cAA/CmL,EAAc3L,EAAAC,OAEhBxB,EAAAoB,QAAO0B,mBAAuC,gBAAlBjB,EAAKqC,SACxB,GAAMrE,EAAiBgV,UAAUhT,EAAME,IADhD,M,OAGW,OAFPyF,EAAKjG,EAAAC,OAEE,GAAM3B,EAAiBiV,mBAClCtN,EACAzF,I,OAGF,GAAsB,kBALhBgT,EAAOxT,EAAAC,QAKJ0C,SACP,MAAM,IAAI4C,EAAAgB,qBACR,qFAIJ9G,QAAQC,IAAIH,EAAK,8BAA+BiU,EAAKC,KACrD9H,EAAY+H,WAAaF,EAAKC,IAC9B9H,EAAYgI,oBAAsBH,EAAKI,a,iBAGnB,SAAMhV,EAAI0M,gBAAgBK,I,OAEhD,OAFMC,EAAgB5L,EAAAC,OAEtB,GAAMrB,EAAIiN,8BAA8BD,EAAeuH,I,cAAvDnT,EAAAC,OACIwL,EAAe9G,OAAS,EAC1B,GAAM/F,EAAIkN,6BAA6BF,EAAeH,IADpD,M,OACFzL,EAAAC,O,iBAGF,SAAMrB,EAAImN,kBAAkB,CAAEC,UAAW,2B,QAEzC,OAFAhM,EAAAC,OAEO,CAAP,EAAO0L,G,OAGT,SAAsBJ,EACpBjL,EACAE,EACA2S,G,oGAMuB,OAJvB1T,QAAQC,IAAIH,EAAK,mBAAoBiB,GAId,GAAM4S,EAC3B9S,EACAE,I,OAGgB,OALZiL,EAAiBzL,EAAAC,OAKL,GAAM4T,EAAmBvT,EAAME,I,OAC3B,OADhB0L,EAAYlM,EAAAC,OACI,GAAMrB,EAAI2M,cAAcW,I,OAE9C,OAFMN,EAAgB5L,EAAAC,OAEtB,GAAMrB,EAAIwN,4BAA4BR,EAAeuH,I,cAArDnT,EAAAC,OACIwL,EAAe9G,OAAS,EAC1B,GAAM/F,EAAIyN,2BAA2BT,EAAeH,IADlD,M,OACFzL,EAAAC,O,iBAGF,SAAMrB,EAAImN,kBAAkB,CAAEC,UAAW,yB,OAEzC,OAFAhM,EAAAC,OAEO,CAAP,EAAOiM,G,OAkBT,SAAemH,EACb/S,EACAE,G,kHAEgB,SAAMlC,EAAiBwU,0BAA0BxS,I,OAChD,OADX2J,EAAUjK,EAAAC,OACC,GAAM3B,EAAiBwV,2BAA2BxT,I,OAKlD,OALXyT,EAAW/T,EAAAC,OACXqM,EAAYhO,EAAiB0V,4BACjC1T,EACAE,GAEe,GAAMlC,EAAiBkP,uBAAuBlN,I,OAC3C,OADdkM,EAAWxM,EAAAC,OACG,GAAM3B,EAAiB2V,0BAA0B3T,I,OAExD,OAFP4T,EAAclU,EAAAC,OACdkU,GAAW,EAAAlV,EAAAmV,gBAAeF,EAAa1H,GAChC,IAAM,EAAA+E,EAAA8C,cAAa/T,EAAKuK,O,OAQN,OARzBA,EAAO7K,EAAAC,OACPqU,GAAoB,EAAA3V,EAAAkB,SAAE,sBAAsBoC,MAE9CsS,EAAe,KACf9V,EAAAoB,QAAO2U,8BAAgCF,IACzCC,EAAe,CAAEE,MAAOH,IAGK,GAAM1V,EAAI+N,uBAAuBL,I,OAchE,OAdMM,EAAyB5M,EAAAC,OAcxB,CAAP,EAZiC,CAC/BmK,QAASH,EACT6C,mBAAmB,EAAA7N,EAAA+L,mBAAkBwB,GACrCO,OAAQ,CACNC,KAAM1O,EAAiBoW,oCAAoCpU,IAE7D2M,UAAWL,EACXC,SAAUkH,EACVnJ,QAASC,EACTqC,aAAcqH,GAAgB,KAC9BpH,SAAUgH,I,OAKd,SAAeN,EACbvT,EACAE,G,sHAEgB,SAAMlC,EAAiBwU,0BAA0BxS,I,OAKhD,OALX2J,EAAUjK,EAAAC,OACVqM,EAAYhO,EAAiB0V,4BACjC1T,EACAE,GAEe,GAAMlC,EAAiBkP,uBAAuBlN,I,OAClD,OADPkM,EAAWxM,EAAAC,OACJ,IAAM,EAAAsR,EAAA8C,cAAa/T,EAAKuK,O,OAEN,OAFzBA,EAAO7K,EAAAC,OAEkB,GAAMrB,EAAI+N,uBAAuBL,I,OA0ChE,OA1CMM,EAAyB5M,EAAAC,OAEzBqU,GAAoB,EAAA3V,EAAAkB,SAAE,sBAAsBoC,MAC5C0S,GAAgB,EAAAhW,EAAAkB,SAAE,yBAAyBoC,OAC7C,EAAAtD,EAAAkB,SAAE,yBAAyBoC,MAC3B,GACE2S,GAAa,EAAAjW,EAAAkB,SAAE,qBAAqBoC,OACtC,EAAAtD,EAAAkB,SAAE,qBAAqBoC,MACvB,GACE4S,GAAc,EAAAlW,EAAAkB,SAAE,0BAA0BoC,OAC5C,EAAAtD,EAAAkB,SAAE,0BAA0BoC,MAC5B,GAEAsS,EAAe,KACf9V,EAAAoB,QAAO2U,8BAAgCF,IACzCC,EAAe,CAAEE,MAAOH,IAEtBQ,EAAW,KACXH,IACFG,EAAW,CAAEL,MAAOE,EAAcI,aAEhCC,EAAS,KACTH,IACFG,EAAS,CAAEP,MAAOI,EAAYE,aAmBzB,CAAP,EAhB6B,CAC3B3K,QAASH,EACTmD,WAAY,CACVqH,MAAOG,EAAWG,YAEpB1H,YAAY,EAAApO,EAAA+L,mBAAkBwB,GAC9BO,OAAQ,CACNC,KAAM1O,EAAiBoW,oCAAoCpU,IAE7D2M,UAAWL,EACXhC,QAASC,EACTyC,SAAUwH,EACV5H,aAAcqH,EACdhH,OAAQyH,I,OAMZ,SAAe5B,EACb9S,EACAE,G,gGAGS,O,sBAAA,GAAMyU,EAAyB3U,EAAME,I,OAA5C,MAAO,CAAP,EAAOR,EAAAC,Q,OAEP,I,sBAAqB0P,EAAAmB,kCACnB,MAAO,CAAC,EAAD,IAEP,MAAMzP,E,wBAKZ,SAAsB4T,EACpB3U,EACAE,G,0FAEA,OAAK/B,EAAAoB,QAAOqV,sBAIVzV,QAAQC,IAAIH,EAAK,yBAGC,GAAMjB,EAAiB6W,+BACzC7U,EACAE,MARAf,QAAQC,IAAIH,EAAK,yCACV,CAAC,EAAD,K,OAUF,SAAM6V,EALOpV,EAAAC,S,OAKpB,MAAO,CAAP,EAAOD,EAAAC,Q,OAwBT,SAAemV,EAAwBC,G,4GACrC,GAA2B,IAAvBA,EAAY1Q,OACd,MAAO,CAAC,EAAD,I,IAGgB3E,EAAAyK,EAAA,GAAI4K,GAAW,G,wBAAf5Q,EAAAzE,EAAA2E,QAAd2Q,EAAUtV,EAAAyE,GACb8Q,EAAiBD,EAAWE,KAAO,EAAIF,EAAWE,KAAO,KAAO,EAChEC,EAA+B,CACnCC,SAAUJ,EAAWjG,KACrBsG,OAAQJ,GAGV9V,QAAQC,IACNH,EACA,wCACA+V,EAAWjG,KACXiG,EAAWE,MAGG,GAAM5W,EAAIgX,mBAAmBH,KAdN,M,OAcvBtT,EAAAlC,OAMdR,QAAQC,IAAIH,EAAK,wBAJXsW,EAAQR,EAAYS,QAAQR,GAClCD,EAAYU,OAAOF,EAAO,GAC1BpW,QAAQC,IAAIH,EAAK,0B,wBAlBIkF,I,aAwBR,SAAM7F,EAAIoX,yBAAyB,CAClDX,YAAaA,EAAY9N,QAAO,SAACqC,GAAM,OAACA,EAAEqM,QAAH,O,OAUzC,OAXMC,EAAW/T,EAAAlC,OAWV,CAAP,GANEiW,EAASC,uBAAyB,IAGjC5O,QAAO,SAACqC,GAAM,OAAAA,EAAEwM,SAAF,IACd1L,KAAI,SAACd,GAAM,OAAAA,EAAEyM,MAAF,K,OAKhB,SAAsBnD,EAA0B5K,G,gGAC1B,SAAM1J,EAAIyJ,gBAAgBC,I,aAIzB,MAJjBC,EAAgBvI,EAAAC,QAIhB,OAEFqI,EAAYrE,GAAKsE,EACjB,GAAM3J,EAAI0X,qBAAqBhO,K,cAA/BtI,EAAAC,O,aAEgB,SAAMrB,EAAI2X,gBAAgBjO,I,OAA1CC,EAAgBvI,EAAAC,O,iBAGlB,MAAO,CAAP,EAAOsI,G,OApYTjJ,EAAAA,YAAA,SAAkCgB,G,0GAMhC,OALMkW,EAAS,CAACrM,EAAgC7J,IAE1B,gBAAlBA,EAAKqC,UACP6T,EAAOzS,KA8CX,SAAyCzD,G,wGACvC,OAAI7B,EAAAoB,QAAOyK,wBAAyB,KAEbnI,GAAAnC,EAAApB,GAAI2L,mB,KAChB,GAAMjM,EAAiBwU,0BAA0BxS,K,OAKjD,OALTuE,EAAAuF,QAASrF,EAAA9E,OACT4E,EAAA2F,eAAcC,EAAA,CACZnK,EAAKwH,KAAKC,cACPzH,EAAKqK,GAAGD,KAAI,SAACC,GAAO,OAAAA,EAAG5C,YAAH,KAAgB,GAEhC,IAAM,EAAAwJ,EAAA8C,cAAa/T,EAAKuK,O,OAE/B,OAFFhG,EAAA+F,QAAS7F,EAAA9E,OACC2E,EAAA3F,EAAA+L,kBACR,GAAM1M,EAAiBkP,uBAAuBlN,I,OARjC,SAAM6B,EAAA4Q,MAAA/S,EAAA,EAOrB6E,EAAAkG,SAAUnG,EAAAmO,WAAA,GACRhO,EAAA9E,SACD,M,OAGH,IAZMiW,EAAWnR,EAAA9E,QAYJgL,aACX,MAAM,IAAI1F,EAAAgB,qBACR,8BAAAkC,OAA8BhK,EAAAoB,QAAO8I,QAAO,QAAAF,OAAOyN,EAASO,cAAYhO,OAAGyN,EAASQ,a,iBA/D1EC,CAA0BrW,IAExC,GAAM8B,QAAQC,IAAImU,I,OAEO,OAFzBxW,EAAAC,OAEyB,GAAMnB,EAAkByB,oBAAoBD,I,OAG7C,OAHlBE,EAAmBR,EAAAC,OAGD,GAAM+S,EADxBpF,EAAe7O,EAAG6X,0B,cAClBC,EAAkB7W,EAAAC,OAKP,kBAHXoL,GAAY,EAAA1M,EAAAkB,SAAE,uBAAuBoC,QAGNoJ,EAAjC,MACc,GAAMC,EACpBhL,EACAE,EACAqW,I,cAHFC,EAAgB9W,EAAAC,O,aAMA,SAAMsL,EACpBjL,EACAE,EACAqW,I,OAHFC,EAAgB9W,EAAAC,QAMhB,EAAAtB,EAAAkB,SAAE,iBAAiBqC,KAAK,gBAAiB,G,iBAG3C,SAAM9C,EAAe2X,0BAA0BzW,I,OAE/C,OAFAN,EAAAC,OAEA,GAAMrB,EAAImN,kBAAkB,CAAEC,UAAW,uB,cAAzChM,EAAAC,OAEAlB,EAAGiY,4BACH,EAAArY,EAAAkB,SAAE,cAAcoX,OAEZjY,EAAa8C,cACO,GAAMxD,EAAiBkP,uBAAuBlN,IADlE,O,SAgIN,SACEyO,EACA+H,EACAzL,EACA/C,G,mFAEA,SAAM1C,EAAYsR,sBAChBlY,EAAamY,aACb9L,EACA/C,EACAwO,EACA/H,I,cALF/O,EAAAC,O,YApIEmX,CADsBpX,EAAAC,OAGpB6W,EACAzL,EACAuC,EAAa,I,qCAgDnBtO,EAAAA,gBAAAgM,EA+CAhM,EAAAA,cAAAiM,EAwJAjM,EAAAA,yBAAA2V,EAmBA3V,EAAAA,2BAAA,SACE+X,EACA1U,EACAnC,G,0FAEA,OAAK/B,EAAAoB,QAAOqV,sBAIVzV,QAAQC,IAAIH,EAAK,yBAGC,GAAMjB,EAAiBgZ,iCACzCD,EACA1U,EACAnC,MATAf,QAAQC,IAAIH,EAAK,yCACV,CAAC,EAAD,K,OAWF,SAAM6V,EANOpV,EAAAC,S,OAMpB,MAAO,CAAP,EAAOD,EAAAC,Q,QA8CTX,EAAAA,0BAAA4T,C,8jBC/YA,IAEAnC,EAAA,SAAAwG,GACE,SAAAxG,EAAYhI,G,OACVwO,EAAAC,KAAA,KAAMzO,IAAQ,IAChB,CACF,OAJkC0O,EAAA1G,EAAAwG,GAIlCxG,CAAA,CAJA,CAFA1S,EAAA,OAEkCqZ,WAArBpY,EAAAA,aAAAyR,C,skBCFb,IAEAxK,EAAA,SAAAgR,GAEE,SAAAhR,EAAYwC,EAAiB4O,G,OAC3BJ,EAAAC,KAAA,KAAMzO,EAAS4O,IAAkB,IACnC,CACF,OAL0CF,EAAAlR,EAAAgR,GAK1ChR,CAAA,CALA,CAFAlI,EAAA,OAE0CqZ,WAA7BpY,EAAAA,qBAAAiH,C,ykBCFb,IACAmK,EAAA,SAAA6G,GACE,SAAA7G,I,OACE6G,EAAAC,KAAA,OAAO,IACT,CACF,OAJ6CC,EAAA/G,EAAA6G,GAI7C7G,CAAA,CAJA,CADArS,EAAA,OAC6CqZ,WAAhCpY,EAAAA,wBAAAoR,C,8kBCDb,IAEAE,EAAA,SAAA2G,GACE,SAAA3G,I,OACE2G,EAAAC,KAAA,OAAO,IACT,CACF,OAJkDC,EAAA7G,EAAA2G,GAIlD3G,CAAA,CAJA,CAFAvS,EAAA,OAEkDqZ,WAArCpY,EAAAA,6BAAAsR,C,+jBCFb,IACAM,EAAA,SAAAqG,GACE,SAAArG,EAAYnI,G,OACVwO,EAAAC,KAAA,KAAMzO,IAAQ,IAChB,CACF,OAJmC0O,EAAAvG,EAAAqG,GAInCrG,CAAA,CAJA,CADA7S,EAAA,OACmCqZ,WAAtBpY,EAAAA,cAAA4R,C,wiBCDb,IAEA0G,EAAA,SAAAL,GACE,SAAAK,EAAYD,G,OAEVJ,EAAAC,KAAA,KADgB,yDACDG,IAAkB,IACnC,CACF,OALuDF,EAAAG,EAAAL,GAKvDK,CAAA,CALA,CAFAvZ,EAAA,OAEuDqZ,W,glBCFvD,IACAzG,EAAA,SAAAsG,GACE,SAAAtG,EAAYlI,G,OACVwO,EAAAC,KAAA,KAAMzO,IAAQ,IAChB,CACF,OAJyC0O,EAAAxG,EAAAsG,GAIzCtG,CAAA,CAJA,CADA5S,EAAA,OACyCqZ,WAA5BpY,EAAAA,oBAAA2R,C,okBCDb,IAEAG,EAAA,SAAAmG,GACE,SAAAnG,EAAYrI,G,OACVwO,EAAAC,KAAA,KAAMzO,IAAQ,IAChB,CACF,OAJwC0O,EAAArG,EAAAmG,GAIxCnG,CAAA,CAJA,CAFA/S,EAAA,OAEwCqZ,WAA3BpY,EAAAA,mBAAA8R,C,ykBCFb,IAEAyG,EAAA,SAAAN,GACE,SAAAM,EAAYF,G,OACVJ,EAAAC,KAAA,UAAM/V,EAAWkW,IAAkB,IACrC,CACF,OAJ6CF,EAAAI,EAAAN,GAI7CM,CAAA,CAJA,CAFAxZ,EAAA,OAE6CqZ,WAAhCpY,EAAAA,wBAAAuY,C,skBCFb,IAEAC,EAAA,SAAAP,GACE,SAAAO,EAAYH,G,OACVJ,EAAAC,KAAA,UAAM/V,EAAWkW,IAAkB,IACrC,CACF,OAJ0CF,EAAAK,EAAAP,GAI1CO,CAAA,CAJA,CAFAzZ,EAAA,OAE0CqZ,WAA7BpY,EAAAA,qBAAAwY,C,qkBCFb,IAEAzG,EAAA,SAAAkG,GAEE,SAAAlG,EAAYtI,EAAiBgP,GAA7B,IAAAC,EACET,EAAAC,KAAA,KAAMzO,IAAQ,K,OACdiP,EAAKD,YAAcA,E,CACrB,CACF,OANyCN,EAAApG,EAAAkG,GAMzClG,CAAA,CANA,CAFAhT,EAAA,OAEyCqZ,WAA5BpY,EAAAA,oBAAA+R,C,kkBCFb,IAEAC,EAAA,SAAAiG,GACE,SAAAjG,EAAYvI,EAAiB+F,G,OAC3ByI,EAAAC,KAAA,KAAMzO,EAAS+F,IAAM,IACvB,CACF,OAJsC2I,EAAAnG,EAAAiG,GAItCjG,CAAA,CAJA,CAFAjT,EAAA,OAEsCqZ,WAAzBpY,EAAAA,iBAAAgS,C,ykBCFb,IACAT,EAAA,SAAA0G,GACE,SAAA1G,I,OACE0G,EAAAC,KAAA,OAAO,IACT,CACF,OAJ6CC,EAAA5G,EAAA0G,GAI7C1G,CAAA,CAJA,CADAxS,EAAA,OAC6CqZ,WAAhCpY,EAAAA,wBAAAuR,C,mlBCDb,IAMAzP,EAAA,SAAAmW,GACE,SAAAnW,EAAY0N,G,OAIVyI,EAAAC,KAAA,KAFE,kLAEa1I,IAAM,IACvB,CACF,OAPuD2I,EAAArW,EAAAmW,GAOvDnW,CAAA,CAPA,CANA/C,EAAA,OAMuDqZ,WAA1CpY,EAAAA,kCAAA8B,C,irECDb,IAAA3C,EAAAC,EAAAL,EAAA,OACAA,EAAA,OACA,IAAAM,EAAAD,EAAAL,EAAA,QACAA,EAAA,OACA,IAAA4Z,EAAA1Z,EAAAF,EAAA,QACAc,EAAAd,EAAA,OACA6Z,EAAA3Z,EAAAF,EAAA,QACAkH,EAAAlH,EAAA,OAEAA,EAAA,OACA,IAAAmH,EAAAjH,EAAAF,EAAA,QACA8Z,EAAA9Z,EAAA,OACAG,EAAAH,EAAA,OACAU,EAAAR,EAAAF,EAAA,QACAW,EAAAT,EAAAF,EAAA,QAGCqD,OAAe0W,EAAK1W,OAAe2W,OAAS1Z,EAAAkB,QAE7C,IA4HIyY,EA5HE/Y,EAAM,SAERgZ,EAAe,GAMfC,GAA0B,EAC1BC,GAA0B,EAwF9B,SAAeC,I,gGAWb,OAVA,EAAA/Z,EAAAkB,SAAE,WAAWuS,OAEb3S,QAAQC,IACNH,EACA,kCACAoZ,OAAOC,QAAQC,QAAQvY,KACnBqY,OAAOC,QAAQC,QAAQvY,KAAK2J,QAC5B,aAGDzE,EAAKsT,gBAOJxY,EAAOqY,OAAOC,QAAQC,QAAQvY,MACpC,EAAA3B,EAAAkB,SAAE,WAAWuS,OACbrT,EAAGga,2BACHha,EAAGia,YACH,GAAMf,EAAIgB,mBAAmB3Y,OAV3B,EAAA3B,EAAAkB,SAAE,WAAWoX,OACblY,EAAGia,aACH,EAAAra,EAAAkB,SAAE,eAAeuS,OACjB,K,OAQF,OADApS,EAAAC,OACA,GAAMgY,EAAIiB,SAAS5Y,I,cAAnBN,EAAAC,QACA,EAAAtB,EAAAkB,SAAE,WAAWoX,O,WAIf,SAASkC,IACP,IAAMC,GAAgB,EAAAza,EAAAkB,SAAE,wBAAwBoC,MAE3CmX,GAAkBA,EAAcrE,aAErCtV,QAAQC,IAAIH,EAAK,+BAAgC6Z,GACjDT,OAAOC,QAAQS,GAAGC,mBAChB7a,EAAAoB,QAAO0Z,KAAKC,OAAS,yBACrB,CAAEC,OAAQ,GAAIC,MAAO,GAAIC,kBAAkB,GAC3CC,GAEJ,CAEA,SAASA,EACPC,GAEApa,QAAQC,IAAIH,EAAK,gCACjB,IACE,GAAIsa,EAAY/K,MACd,MAAM,IAAIvJ,EAAAgB,qBACR,yCACAsT,EAAY/K,OAET,IAAK+K,EAAYC,MACtB,MAAM,IAAIvU,EAAAgB,qBACR,0EACAsT,EAAY/K,QAGdwJ,EAAmBuB,EAAYC,OACdC,gBACfpB,OAAOqB,UAAUC,sBACjBC,E,CAGJ,MAAOpL,IACP,EAAA3P,EAAAgB,cAAa2O,EAAO,mC,CAExB,CAEA,SAAeoL,EAAyBC,G,gGACtC1a,QAAQC,IAAIH,EAAK,sCAAuC4a,G,iBAItD,O,sBAFA7B,EAAiB8B,QAEjB,IAAM,EAAA5b,EAAA2C,OAAM,M,cAAZnB,EAAAC,OAC+BuG,KAAKoI,MAClCuL,EAAIpR,SAGqBsR,mBAQ/B,W,6FACE5a,QAAQC,IAAIH,EAAK,uDACjB,EAAAZ,EAAAkB,SAAE,WAAWuS,O,iBAaX,O,uBAXA,EAAAzT,EAAAkB,SAAE,wBAAwBya,KAAK,IAE/B/B,GAAe,EAAA5Z,EAAAkB,SAAE,wBAAwBoC,MAAM8S,YAE/CwD,GAAgB,KACCgC,SAAS,OACxBhC,EAAeA,EAAaiC,MAAM,EAAGjC,EAAa5T,OAAS,IAE7DlF,QAAQC,IAAIH,EAAK,kBAAmBgZ,GACpCvZ,EAAayb,UAAUlC,GAElBA,EAmBY,GAZK,IAAIJ,EAAAuC,cAAc,CACtCC,QAASpC,EACTqC,aAAc,aACd/T,SAAUpI,EAAAoB,QAAOgb,KAAKC,UACtBC,YAAatc,EAAAoB,QAAO0Z,KAAKyB,KACzBC,MAAO,SACPC,aAAc,OACdC,qBAAsB,CACpBC,WAAYzC,OAAOC,QAAQC,QAAQwC,YAAYtT,gBAIduT,kBAlBnC,EAAA3c,EAAAkB,SAAE,8BAA8Bya,KAAK,yBACrC,EAAA3b,EAAAkB,SAAE,wBAAwB0b,QAC1B,K,OAiBF,OADMrF,EAAWlW,EAAAC,OACjB,GAAMuF,EAAKgW,SAASjD,EAAcrC,EAASuF,O,OAE3C,OAFAzb,EAAAC,OAEA,GAAMuF,EAAKkW,qB,OAIO,OAJlB1b,EAAAC,OAIkB,GAAMgY,EAAI0D,sB,cAAtBxX,EAAYnE,EAAAC,SAEhBjB,EAAamJ,WAAWhE,GACxB,GAAMqB,EAAK4C,iBAFT,M,OAEFpI,EAAAC,O,oCASF,MANwB,U,YAAd2b,WACRnc,QAAQC,IAAIH,EAAK,sBAEjB,EAAAJ,EAAAgB,cAAa0B,EAAO,yBAEtB,EAAAlD,EAAAkB,SAAE,WAAWoX,OACb,I,OAGF,SAAMyB,K,eAAN1Y,EAAAC,QACA,EAAAtB,EAAAkB,SAAE,WAAWoX,O,WAhET4E,G,gCAGF,EAAA1c,EAAAgB,cAAaC,EAAO,8C,8BAgExB,SAAS0b,KACP,EAAAnd,EAAAkB,SAAE,cAAcoX,QAChB,EAAAtY,EAAAkB,SAAE,eAAeoX,QACjB,EAAAtY,EAAAkB,SAAE,gBAAgBuS,MACpB,CAGA,SAAe2J,EAA0BC,G,0FAEvC,OADAhd,EAAaid,YAA+B,cAAnBD,EAAEE,OAAOpC,OAClC,GAAMqC,K,cAANnc,EAAAC,O,WAGF,SAAekc,I,mGACb,EAAAxd,EAAAkB,SAAE,gBAAgBoX,QAClB,EAAAtY,EAAAkB,SAAE,iBAAiBuS,QAEnB,EAAAzT,EAAAkB,SAAE,WAAWuS,O,iBAKX,O,sBAAA,GAAM6F,EAAI1T,kB,cAAVvE,EAAAC,O,gCAEA,EAAAd,EAAAgB,cAAaic,EAAO,0C,oBAKjB3D,IACH,EAAA9Z,EAAAkB,SAAE,iBAAiB4S,QAAQ,WAEvBnS,EAAOqY,OAAOC,QAAQC,QAAQvY,MAElC,GAAM2X,EAAIvV,qBAAqBpC,IAD7B,M,OACFN,EAAAC,O,wBAEGuY,IACH,EAAA7Z,EAAAkB,SAAE,WAAWoX,O,WAKjB,SAASoF,EAAmBC,GAC1B,IAAMtY,EAAWsY,EAAMJ,OAAOpC,MACxByC,EAAiBtE,EAAI3U,QAAQc,MAAK,SAAUV,GAChD,OAAOA,EAAOO,IAAMD,CACtB,IACA,GAAIuY,EAGF,IAFA,EAAA5d,EAAAkB,SAAE,oBAAoBya,KAAK,KAC3B,EAAA3b,EAAAkB,SAAE,iBAAiBya,KAAK,IACpBrC,EAAI5U,sBAAuB,EAC7B,EAAA1E,EAAAkB,SAAE,0BAA0BuS,OAC5B,IAAIoK,EAAqB,GACnBC,EAA6D,IAAxCF,EAAe5Y,cAAcgB,OACnD8X,IACHD,EACE,oEAEJ,IAAK,IAAIE,EAAI,EAAGA,EAAIH,EAAe5Y,cAAcgB,OAAQ+X,IAAK,CAC5D,IAAM5X,EAAQyX,EAAe5Y,cAAc+Y,GAEtC5X,EAAMjB,UAAaiB,EAAMjB,SAASc,SACvC6X,GACE,kBACA1X,EAAMb,GACN,KACAa,EAAM6X,iBACN,Y,EAEJ,EAAAhe,EAAAkB,SAAE,oBAAoBya,KAAKkC,GAEvBC,GACF,EAAA9d,EAAAkB,SAAE,oBAAoB4S,QAAQ,WAK9B,EAAA9T,EAAAkB,SAAE,iBAAiBya,KADjB,6D,KAGC,EACL,EAAA3b,EAAAkB,SAAE,0BAA0BoX,OAC5B,IAAI2F,EAAgB,GACdC,EAAmD,IAAnCN,EAAe1Y,SAASc,OAC9C,IAAS+X,EAAI,EAAGA,EAAIH,EAAe1Y,SAASc,OAAQ+X,IAAK,CACvD,IAAMI,EAAcP,EAAe1Y,SAAS6Y,GAC5CE,GACE,kBACAE,EAAY7Y,GACZ,KACA6Y,EAAY1Z,YACZ,W,EAEJ,EAAAzE,EAAAkB,SAAE,iBAAiBya,KAAKsC,GACpBC,IACF,EAAAle,EAAAkB,SAAE,iBAAiB4S,QAAQ,S,CAInC,CAEA,SAAesK,EAAqBT,G,oGAOlC,IALA,EAAA3d,EAAAkB,SAAE,iBAAiBmd,OAEb7Y,EAAYmY,EAAMJ,OAAOpC,MAGR,WAAnBrb,EAAAoB,QAAO8I,UAA2BxE,EAAW,UAEjDqU,GAA0B,GAE1B,EAAA7Z,EAAAkB,SAAE,WAAWuS,OAEbpT,EAAamJ,WAAWhE,G,iBAGtB,O,sBAAA,GAAMqB,EAAK4C,gB,OASX,OATApI,EAAAC,OAEMgd,EAAiB,CAAC/E,EAAWgF,wBAC/Bze,EAAAoB,QAAO2U,+BACTyI,EAAelZ,KAAKmU,EAAWiF,4BAC/BF,EAAelZ,KAAKmU,EAAWkF,gBAC/BH,EAAelZ,KAAKmU,EAAWmF,qBAC/BJ,EAAelZ,KAAKmU,EAAWoF,6BAEjC,GAAMlb,QAAQC,IAAI4a,I,cAAlBjd,EAAAC,O,gCAEA,EAAAd,EAAAgB,cAAaod,EAAO,iC,oBAGtB,EAAA5e,EAAAkB,SAAE,kBAAkBya,KAAK,KACzB,EAAA3b,EAAAkB,SAAE,WAAWoX,OACbuB,GAA0B,EAC1BC,GAA0B,E,WAI5B,SAAS+E,EAAyBlB,IAChC,EAAA3d,EAAAkB,SAAE,WAAWuS,QACb,EAAAzT,EAAAkB,SAAE,wBAAwBya,KAAK,IAC/B,IAAIsC,EAAgB,GACd9C,EAAQwC,EAAMJ,OAAOpC,MACvB+C,GAAgB,EACpB5E,EAAI3U,QAAQG,SAAQ,SAAUC,GAC5B,IAAM+Z,EAAuB/Z,EAAOC,cAAcS,MAAK,SACrDR,GAEA,OAAOA,EAAaK,IAAM6V,CAC5B,IACI2D,IAC2C,IAAzCA,EAAqB5Z,SAASc,OAChCkY,GAAgB,EAEhBD,EACE,6DAEJa,EAAqB5Z,SAASJ,SAAQ,SAAUK,GAC9C8Y,GACE,kBACA9Y,EAAQG,GACR,KACAH,EAAQV,YACR,WACJ,IAEJ,KACA,EAAAzE,EAAAkB,SAAE,WAAWoX,QACb,EAAAtY,EAAAkB,SAAE,iBAAiBya,KAAKsC,GACpBC,IACF,EAAAle,EAAAkB,SAAE,iBAAiB4S,QAAQ,SAE/B,CAGA,SAASiL,EAAsB1B,GACP,iBAAlBA,EAAEE,OAAOpC,QACX,EAAAnb,EAAAkB,SAAE,yBAAyBuS,QAC3B,EAAAzT,EAAAkB,SAAE,0BAA0BoX,QAC5B,EAAAtY,EAAAkB,SAAE,8BAA8BoX,QAChC,EAAAtY,EAAAkB,SAAE,4BAA4BoX,UAG9B,EAAAtY,EAAAkB,SAAE,0BAA0BuS,QAC5B,EAAAzT,EAAAkB,SAAE,2BAA2Bya,KAAK,KAClC,EAAA3b,EAAAkB,SAAE,+BAA+Bya,KAAK,KAClC,EAAA3b,EAAAkB,SAAE,yBAAyBya,SAC7B,EAAA3b,EAAAkB,SAAE,8BAA8BuS,QAChC,EAAAzT,EAAAkB,SAAE,4BAA4BuS,UAE9B,EAAAzT,EAAAkB,SAAE,8BAA8BoX,QAChC,EAAAtY,EAAAkB,SAAE,4BAA4BoX,QAGpC,CAEA,SAAS0G,KACP,EAAAhf,EAAAkB,SAAE,2BAA2Bya,KAAK,GACpC,CAEA,SAASsD,KACP,EAAAjf,EAAAkB,SAAE,+BAA+Bya,KAAK,GACxC,CAEA,SAASuD,IACgC,eAAnC,EAAAlf,EAAAkB,SAAEmC,MAAMoC,KAAK,aAAanC,QAC5B,EAAAtD,EAAAkB,SAAE,kCAAkCuS,QACpC,EAAAzT,EAAAkB,SAAE,cAAcie,SAASA,OAAO,eAAe7G,UAE/C,EAAAtY,EAAAkB,SAAE,kCAAkCoX,QACpC,EAAAtY,EAAAkB,SAAE,cAAcie,SAASA,OAAO,eAAe1L,OAEnD,CAEA,SAAS2L,IACP,IAAMC,GAAS,EAAArf,EAAAkB,SAAEmC,MAAM8b,SAASA,SAASA,SAASA,SACX,eAAnC,EAAAnf,EAAAkB,SAAEmC,MAAMoC,KAAK,aAAanC,OAC5B+b,EAAO5Z,KAAK,sBAAsBgO,OAClC4L,EAAO5Z,KAAK,qBAAqB6S,SAEjC+G,EAAO5Z,KAAK,sBAAsB6S,OAClC+G,EAAO5Z,KAAK,qBAAqBgO,OAErC,CAEA,SAAe6L,I,gGACb,OAAKlf,EAAGmf,iBAIF5d,EAAOqY,OAAOC,QAAQC,QAAQvY,QAElC,EAAA3B,EAAAkB,SAAE,WAAWuS,OACb,GAAM6F,EAAIkG,eAAe7d,KAFvB,MAJF,I,OAMAN,EAAAC,QACA,EAAAtB,EAAAkB,SAAE,WAAWoX,O,kCAIjB,SAASmH,KACP,EAAAzf,EAAAkB,SAAE,iBAAiBoX,QACnB,EAAAtY,EAAAkB,SAAE,gBAAgBuS,MACpB,CAEA,SAASiM,IACPpG,EAAIqG,QACN,CAEA,SAASC,KACP,EAAA5f,EAAAkB,SAAE,iBAAiBoX,MACrB,CAEA,SAASuH,KACP,EAAA7f,EAAAkB,SAAE,2BAA2BuS,QAC7B,EAAAzT,EAAAkB,SAAE,uBAAuBoX,MAC3B,CAEA,SAASwH,IACP1f,EAAG2f,gBACL,CAEA,SAASC,KACP,EAAAhgB,EAAAkB,SAAE,WAAWuS,QACb,EAAAzT,EAAAkB,SAAE,0BAA0BoX,OAC5BvV,OAAOqS,SAAS6K,QAClB,CAEA,SAAeC,I,0FAIb,OAHA9f,EAAGga,2BACHha,EAAG+f,0BAEH,GAAMpG,K,cAAN1Y,EAAAC,O,WAGF,SAAS8e,KACP,EAAApgB,EAAAkB,SAAE,WAAWuS,QACb,EAAAzT,EAAAkB,SAAE,sBAAsBoX,OACxBvV,OAAOqS,SAAS6K,QAClB,CA3fAjG,OAAOqG,WAEP,W,kGACE,GAAI7G,EAAAuC,cAAcuE,eAAgB,U,GAE5BC,EAAU,2BAChBzf,QAAQC,IAAIwf,GACRzgB,EAAAoB,QAAOsf,uBACT,EAAAxgB,EAAAkB,SAAE,YAAYya,KAAK4E,IACnB,EAAAvgB,EAAAkB,SAAE,YAAYuS,SAGhB,EAAAzT,EAAAkB,SAAE,aAAauS,OACfrT,EAAGqgB,WAAW3gB,EAAAoB,QAAO8I,SACrB5J,EAAGsgB,gBAAgB5gB,EAAAoB,QAAOyf,cAC1BvgB,EAAGwgB,QAAQ9gB,EAAAoB,QAAO2f,QAAS/gB,EAAAoB,QAAO4f,cAClC1gB,EAAG2gB,WACDjhB,EAAAoB,QAAO8f,oBACPlhB,EAAAoB,QAAO2U,8BAETxV,EAAaid,aAAY,GACzBld,EAAG6gB,YAAYnhB,EAAAoB,QAAOggB,SACtBtH,EAAevZ,EAAa4H,aAE5B,EAAAjI,EAAAkB,SAAE,kBAAkBigB,MAAM3G,IAItB3T,EAAKua,iBAAL,Y,iBAEA,O,sBAAA,GAAMva,EAAK4C,gB,cAAXpI,EAAAC,O,+BAGAR,QAAQC,IAAIH,EAAK,0BAA2BiH,KAAKC,UAAUpF,I,aAG/D,SAAMqX,K,cAAN1Y,EAAAC,O,YAGF0Y,OAAOqH,SAAQ,YAEb,EAAArhB,EAAAkB,SAAEogB,UAAUC,OAAM,WAMlBvH,OAAOC,QAAQC,QAAQsH,gBACrBxH,OAAOqB,UAAUoG,YACjB1H,IAGF,EAAA/Z,EAAAkB,SAAE,uBAAuBwgB,QAAQ,CAAE3G,MAAO,WAE1C,EAAA/a,EAAAkB,SAAE,WAAWygB,GAAG,QAASjC,IACzB,EAAA1f,EAAAkB,SAAE,oBAAoBigB,MAAMhE,IAC5B,EAAAnd,EAAAkB,SAAE,yCAAyCigB,MAAM1B,IAEjD,EAAAzf,EAAAkB,SAAEogB,UAAUK,GACV,SACA,0BACAzC,IAEF,EAAAlf,EAAAkB,SAAEogB,UAAUK,GACV,SACA,gCACAvC,IAEF,EAAApf,EAAAkB,SAAE,sBAAsBigB,MAAM7B,IAC9B,EAAAtf,EAAAkB,SAAE,uBAAuBigB,MAAM7B,IAC/B,EAAAtf,EAAAkB,SAAE,0BAA0BigB,MAAMjB,IAClC,EAAAlgB,EAAAkB,SAAE,4BAA4BigB,MAAMf,IACpC,EAAApgB,EAAAkB,SAAE,kBAAkBigB,MAAMvB,IAC1B,EAAA5f,EAAAkB,SAAE,uBAAuBigB,MAAMtB,IAC/B,EAAA7f,EAAAkB,SAAE,uBAAuBigB,MAAMrB,IAC/B,EAAA9f,EAAAkB,SAAE,iCAAiCigB,MAAMnB,IACzC,EAAAhgB,EAAAkB,SAAE,oBAAoBygB,GAAG,SAAU9C,IACnC,EAAA7e,EAAAkB,SAAE,gBAAgBygB,GAAG,SAAUjE,IAC/B,EAAA1d,EAAAkB,SAAE,iBAAiBygB,GAAG,SAAUvD,IAChC,EAAApe,EAAAkB,SAAE,qBAAqBygB,GAAG,SAAU3C,IACpC,EAAAhf,EAAAkB,SAAE,yBAAyBygB,GAAG,SAAU1C,IACxC,EAAAjf,EAAAkB,SAAE,0BAA0BygB,GAAG,QAASvE,IACxC,EAAApd,EAAAkB,SAAE,kBAAkBygB,GAAG,QAASnE,IAChC,EAAAxd,EAAAkB,SAAE,uBAAuBygB,GAAG,SAAU5C,EAxCtC,GACF,G,sGC/Eape,EAAAA,sBAAb,WACE,KAAA4N,aAAkC,KAClC,KAAAE,WAAgC,KAChC,KAAAE,SAA8B,KAC9B,KAAAC,OAA4B,IAC9B,C,sGCLA,IAAAtO,EAAAZ,EAAA,OACAkiB,EAAAliB,EAAA,OAEAsQ,EAAA,oBAAAA,IA0CA,QA/BEF,OAAA+R,eAAI7R,EAAA8R,UAAA,oBAAiB,C,IAArB,WACE,OAAOze,KAAK0e,UAAY,IAAI9gB,KAAKoC,KAAK0e,WAAa,IAAI9gB,KAAK,aAC9D,E,IAEA,SAAsBka,GACpB9X,KAAK0e,WAAY,EAAAzhB,EAAA+L,mBAAkB8O,EACrC,E,gCAEArL,OAAA+R,eAAI7R,EAAA8R,UAAA,eAAY,C,IAAhB,WACE,OAAO,IAAI7gB,KAAKoC,KAAK6M,WACvB,E,IAEA,SAAiBiL,GACf9X,KAAK6M,YAAa,EAAA5P,EAAA+L,mBAAkB8O,EACtC,E,gCAEArL,OAAA+R,eAAI7R,EAAA8R,UAAA,wBAAqB,C,IAAzB,WACE,OAAOze,KAAKyK,QACd,E,IAEA,SAA0BA,GACxB,IAAMkU,EAAgB,IAAIJ,EAAAK,sBAE1B,IAAK,IAAMC,KAAOF,EAEXA,EAAcG,eAAeD,IAASpU,EAASoU,KACpDF,EAAcE,GAAOpU,EAASoU,IAGhC7e,KAAKyK,SAAWkU,CAClB,E,gCACFhS,CAAA,CA1CA,GAAarP,EAAAA,oBAAAqP,C,4mFCHb,IAAAiB,EAAAvR,EAAA,OACAyR,EAAAzR,EAAA,OAoBA0iB,EAAAxiB,EAAAF,EAAA,QACAW,EAAAT,EAAAF,EAAA,QAEMkB,EAAM,SA4JZ,SAAsByhB,EAAavL,G,gGAChB,SAAMsL,EAAKE,KAC1BjiB,EAAa4H,YAAc,mBAC3B6O,I,OAEF,KAJMS,EAAWlW,EAAAC,QAIHihB,QACZ,MAAM,IAAItR,EAAAmB,aACR,mCAAAtI,OAAmCgN,EAAQ0L,eAAc,MACvDjL,EAAStL,S,iBA0EjB,SAAewW,EAAWC,G,gGACP,SAAMN,EAAKpP,IAAI3S,EAAa4H,YAAcya,GAAK,I,OAChE,OADMnL,EAAWlW,EAAAC,OACZqhB,MAAMC,QAAQrL,GAGZ,CAAP,EAAOA,GAFE,CAAC,EAAD,I,OA/OX5W,EAAAA,uBAAA,SAA6CkiB,G,gGAC1B,SAAMT,EAAKpP,IAC1B3S,EAAa4H,YAAc,uB,OAa7B,OAdMsP,EAAWlW,EAAAC,OAcV,CAAP,EAV4BiW,EAEgB9R,MAC1C,SAACqd,GAAc,OAAAA,EAAEzU,OAASwU,CAAX,KAGoB,CACnC/M,MAAO+M,I,QAMXliB,EAAAA,gCAAA,SACEmW,G,gGAGkB,OADlBhW,QAAQC,IAAIH,EAAK,2CAA4CkW,GAC3C,GAAMsL,EAAKE,KAC3BjiB,EAAa4H,YACX,+DACF6O,I,OAGF,KANMS,EAAYlW,EAAAC,QAMJihB,QACZ,MAAM,IAAItR,EAAAmB,aACR,oDAAsDmF,EAAStL,SAInE,MAAO,CAAP,EAAOsL,EAASwL,mB,QAGlBpiB,EAAAA,mBAAA,SAAyCmW,G,gGAErB,OADlBhW,QAAQC,IAAIH,EAAK,gCAAiCkW,GAChC,GAAMsL,EAAKE,KAC3BjiB,EAAa4H,YAAc,8CAC3B6O,I,OAGF,KALMS,EAAYlW,EAAAC,QAKJihB,QACZ,MAAM,IAAItR,EAAAmB,aACR,yCAA2CmF,EAAStL,SAIxD,MAAO,CAAP,EAAOsL,G,QAGT5W,EAAAA,qBAAA,SACEmW,G,gGAGkB,OADlBhW,QAAQC,IAAIH,EAAK,kCAAmCkW,GAClC,GAAMsL,EAAKE,KAC3BjiB,EAAa4H,YACX,kDACF6O,I,OAGF,KANMS,EAAYlW,EAAAC,QAMJihB,QACZ,MAAM,IAAItR,EAAAmB,aACR,2CAA6CmF,EAAStL,SAI1D,MAAO,CAAP,EAAOsL,G,QAGT5W,EAAAA,gBAAA,SAAsCqM,G,gGAEnB,OADjBlM,QAAQC,IAAIH,EAAK,sBAAuBoM,GACvB,GAAMoV,EAAKE,KAC1BjiB,EAAa4H,YAAc,oBAC3B+E,I,OAGF,KALMuK,EAAWlW,EAAAC,QAKHihB,QAAS,CACrB,GAA2B,qCAAvBhL,EAASyL,UACX,MAAM,IAAI7R,EAAAc,6BAEZ,MAAM,IAAIhB,EAAAmB,aAAa,+BAAiCmF,EAAStL,Q,CAGnE,MAAO,CAAP,EAAOsL,EAAS0L,U,QAGlBtiB,EAAAA,cAAA,SAAoC4M,G,gGAEjB,OADjBzM,QAAQC,IAAIH,EAAK,oBAAqB2M,GACrB,GAAM6U,EAAKE,KAC1BjiB,EAAa4H,YAAc,kBAC3BsF,I,OAGF,KALMgK,EAAWlW,EAAAC,QAKHihB,QACZ,MAAM,IAAItR,EAAAmB,aAAa,6BAA+BmF,EAAStL,SAEjE,MAAO,CAAP,EAAOsL,EAAS0L,U,QAGlBtiB,EAAAA,8BAAA,SACEsM,EACAiW,G,0FAQA,SAAMb,EAN+B,CACnCG,eAAgB,2BAChBW,OAAQlW,EACRmW,MAAOF,EACPG,2BAA2B,K,cAE7BhiB,EAAAC,O,YAGFX,EAAAA,4BAAA,SACE6M,EACA0V,G,0FAQA,SAAMb,EAN+B,CACnCG,eAAgB,yBAChBW,OAAQ3V,EACR4V,MAAOF,EACPG,2BAA2B,K,cAE7BhiB,EAAAC,O,YAGFX,EAAAA,6BAAA,SACEsM,EACAqW,G,0FAQA,SAAMjB,EAN+B,CACnCG,eAAgB,oBAChBW,OAAQlW,EACRmW,MAAOE,EACPD,2BAA2B,K,cAE7BhiB,EAAAC,O,YAGFX,EAAAA,2BAAA,SACEsM,EACAqW,G,0FAQA,SAAMjB,EAN+B,CACnCG,eAAgB,kBAChBW,OAAQlW,EACRmW,MAAOE,EACPD,2BAA2B,K,cAE7BhiB,EAAAC,O,YAGFX,EAAAA,aAAA0hB,EAYA1hB,EAAAA,mBAAA,SAAyCmW,G,gGACtB,SAAMsL,EAAKE,KAC1BjiB,EAAa4H,YAAc,yBAC3B6O,I,OAGF,KALMS,EAAWlW,EAAAC,QAKHihB,QAAS,CAIrB,IADG,IADAhL,EAAStL,QAAmBsX,cAAcpM,QAAQ,mBAGnD,MAAO,CAAP,GAAO,GAEP,MAAM,IAAIlG,EAAAmB,aACR,kCAAoCmF,EAAStL,Q,CAKnD,MAAO,CAAP,GAAO,G,QAGTtL,EAAAA,yBAAA,SACEmW,G,sGAEiB,SAAMsL,EAAKE,KAC1BjiB,EAAa4H,YAAc,qCAC3B6O,I,OAGF,KALMS,EAAWlW,EAAAC,QAKHihB,QACZ,MAAM,IAAItR,EAAAmB,aACR,iDAAmDmF,EAAStL,SAQhE,GALMuX,EAAwBjM,EAASC,uBAAyB,IAC1DiM,EAAoBD,EACvB5a,QAAO,SAACqC,GAAM,OAACA,EAAEwM,SAAH,IACd1L,KAAI,SAACd,GAAM,OAAAA,EAAE8L,QAAF,KAEQ/Q,OAAS,EAI7B,MAHMoE,EACJ,6BAA+BqZ,EAAkBC,KAAK,MAAQ,EAChE7b,KAAKC,UAAUyP,GACT,IAAItG,EAAAmB,aAAahI,GAGzB,MAAO,CAAP,EAAOmN,G,QAGT5W,EAAAA,iBAAA,W,0FACS,SAAM8hB,EAAW,0B,OAAxB,MAAO,CAAP,EAAOphB,EAAAC,Q,QAGTX,EAAAA,qBAAA,W,0FACS,SAAM8hB,EAAW,8B,OAAxB,MAAO,CAAP,EAAOphB,EAAAC,Q,QAGTX,EAAAA,YAAA,W,0FACS,SAAM8hB,EAAW,qC,OAAxB,MAAO,CAAP,EAAOphB,EAAAC,Q,QAGTX,EAAAA,SAAA,W,0FACS,SAAM8hB,EAAW,kB,OAAxB,MAAO,CAAP,EAAOphB,EAAAC,Q,QAGTX,EAAAA,cAAA,W,0FACS,SAAM8hB,EAAW,uB,OAAxB,MAAO,CAAP,EAAOphB,EAAAC,Q,QAWTX,EAAAA,cAAA,W,gGACmB,SAAMyhB,EAAKpP,IAC1B3S,EAAa4H,YAAc,sBAC3B,I,OAEF,KAJMsP,EAAWlW,EAAAC,QAIHihB,UAAYhL,EAASoM,WACjC,MAAM,IAAI1S,EAAAmB,aAAa,8BAAgCmF,EAAStL,SAElE,MAAO,CAAP,EAAOsL,EAASoM,Y,QAGlBhjB,EAAAA,cAAA,W,0FAOmB,OANjBG,QAAQC,IACNH,EACA,0BACAP,EAAa4H,YACb5H,EAAa4H,YAAc,gBAEZ,GAAMma,EAAKpP,IAC1B3S,EAAa4H,YAAc,gBAC3B,I,OAGF,MAAO,CAAP,EALiB5G,EAAAC,Q,QAQnBX,EAAAA,gBAAA,SAAsCgJ,G,kGAWnB,OAVbia,EAAWvjB,EAAa4H,YAAc,qBACb,IAAzB0B,EAAY4G,YACdqT,EAAWA,EAAW,aAAeja,EAAY4G,UAAY,KAEnC,IAAxB5G,EAAY8G,WACdmT,EAAWA,EAAW,YAAcja,EAAY8G,SAAW,KAG7DmT,GADAA,EAAWA,EAAW,SAAWja,EAAYI,OACvB,oBAAsBJ,EAAYka,gBAEvC,GAAMzB,EAAKpP,IAA0B4Q,I,OAEtD,IAFMrM,EAAWlW,EAAAC,kBAEOwO,OACtB,MAAM,IAAImB,EAAAmB,aACR,oCAAAtI,OAAoCH,EAAYI,MAAK,MACnDwN,EAAStL,SAIf,MAAO,CAAP,EAAOsL,G,QAGT5W,EAAAA,gBAAA,SAAsCgJ,G,gGACnB,SAAMyY,EAAKE,KAC1BjiB,EAAa4H,YAAc,oBAC3B0B,I,OAGF,KALM4N,EAAWlW,EAAAC,QAKHihB,QACZ,MAAM,IAAItR,EAAAmB,aACR,8BAAAtI,OAA8BH,EAAYI,MAAK,MAAOwN,EAAStL,SAInE,MAAO,CAAP,EAAOsL,EAAS0L,U,QAGlBtiB,EAAAA,qBAAA,SAA2CgJ,G,gGACxB,SAAMyY,EAAKE,KAC1BjiB,EAAa4H,YAAc,yBAC3B0B,I,OAGF,KALM4N,EAAWlW,EAAAC,QAKHihB,QACZ,MAAM,IAAItR,EAAAmB,aACR,8BAAAtI,OAA8BH,EAAYI,MAAK,MAAOwN,EAAStL,SAGnE,MAAO,CAAP,EAAOsL,EAAS0L,U,QAGlBtiB,EAAAA,kBAAA,SAAwCmjB,G,0FACtB,SAAM1B,EAAKE,KACzBjiB,EAAa4H,YAAc,iBAC3B6b,I,OAGF,MAAO,CAAP,EALgBziB,EAAAC,Q,6wEC7VlB,IAAAxB,EAAAC,EAAAL,EAAA,OACAO,EAAAL,EAAAF,EAAA,QACA0iB,EAAAxiB,EAAAF,EAAA,QACAG,EAAAH,EAAA,OACAW,EAAAT,EAAAF,EAAA,QAEMkB,EAAM,SAERmjB,GAAoB,EAMxB,SAAgB3C,IACd,SAAK/gB,EAAawc,YAIT,IAAI5b,KAAS,IAAIA,KAAKZ,EAAa2jB,kBAC9C,CAVArjB,EAAAA,aAAA,WACE,OAAON,EAAawc,aAAeuE,GACrC,EAEAzgB,EAAAA,eAAAygB,EAQAzgB,EAAAA,SAAA,SAA+BoE,EAAgB+X,G,kGAW5B,OAVjBhc,QAAQC,IAAIH,EAAK,oBAEXqjB,EAAU,CACdC,WAAY,qBACZ/H,UAAWrc,EAAAoB,QAAOgb,KAAKC,UACvBgI,cAAerkB,EAAAoB,QAAOgb,KAAKiI,cAC3BrH,KAAMA,EACNsH,aAActkB,EAAAoB,QAAO0Z,KAAKyB,MAGX,GAAM+F,EAAKiC,SAAStf,EAAS,SAAUkf,I,cAAlD1M,EAAWlW,EAAAC,OAEjBR,QAAQC,IAAIH,EAAK,oBAEjBP,EAAaikB,eAAe/M,EAAS,aACrClX,EAAakkB,SAAShN,EAAuB,cAC7ClX,EAAamkB,gBAAgBjN,EAAwB,e,YAGvD5W,EAAAA,aAAA,W,kGACEG,QAAQC,IAAIH,EAAK,gCAAiCP,EAAamY,c,wBAExDuL,GACLjjB,QAAQC,IAAIH,EAAK,yCACjB,IAAM,EAAAf,EAAA2C,OAAM,OAFU,M,cAEtBnB,EAAAC,O,aAGFyiB,GAAoB,E,iBAcD,O,sBAZXE,EAAU,CACdC,WAAY,gBACZ/H,UAAWrc,EAAAoB,QAAOgb,KAAKC,UACvBgI,cAAerkB,EAAAoB,QAAOgb,KAAKiI,cAC3BM,cAAepkB,EAAaqkB,kBAC5BN,aAActkB,EAAAoB,QAAO0Z,KAAKyB,MAGxBhc,EAAamY,eACfyL,EAAoB,WAAI5jB,EAAamY,cAGtB,GAAM4J,EAAKiC,SAC1BhkB,EAAa4H,YAAc,SAC3Bgc,I,cAFI1M,EAAWlW,EAAAC,OAKjBR,QAAQC,IAAIH,EAAK,oBAEjBP,EAAaikB,eAAe/M,EAAS,aACrClX,EAAakkB,SAAShN,EAAuB,cAC7ClX,EAAamkB,gBAAgBjN,EAAwB,e,oBAErDwM,GAAoB,E,6BAKxBpjB,EAAAA,kBAAA,W,kGAEuB,O,sBAAA,GAAMV,EAAI+H,iB,cAAvB2c,EAAatjB,EAAAC,OACnBR,QAAQC,IAAIH,EAAK,eAAgB+jB,GACjCtkB,EAAaukB,cAAcD,G,+BAE3B7jB,QAAQC,IAAIH,EAAK,iDAAkD8B,G,22DCrFvE,IAAAgP,EAAAhS,EAAA,OAEAkT,EAAAlT,EAAA,OACAsH,EAAAtH,EAAA,MAGA,SAAgBmlB,EAAyBC,GACvC,IAAIC,EAA0C,GAExC3a,EAAU0a,EAahB,OAZIA,EAAY3b,KAAKC,cACnB2b,EAAU3f,KAAK0f,EAAY3b,MAE7B4b,EAAU3f,KAAIgP,MAAd2Q,EAAkB3a,EAAQ4B,IAC1B+Y,EAAU3f,KAAIgP,MAAd2Q,EAAkB3a,EAAQ4a,IAOdC,EAAwBF,EAEtC,CAEA,SAAsBG,EACpBC,G,yHAEIJ,EAA0C,IAE1C,EAAA/d,EAAAoe,uBAAsBD,IAClBE,EAAkBF,EAExBJ,EAAU3f,KAAIgP,MAAd2Q,EAAkBM,EAAgBC,mBAClCP,EAAU3f,KAAIgP,MAAd2Q,EAAkBM,EAAgBE,mB,OAJhC,M,OASI,OAHAC,EAAqBL,E,GAE3B9jB,EAAA0jB,EAAU3f,MAAIgP,M,GAAd2Q,GACM,IAAM,EAAAnS,EAAA6S,oBAAmBD,EAAmBF,oB,OAG5C,OAJN9hB,EAAA4Q,MAAA/S,EAAA4E,EAAA6D,OAAA,CACMxD,EAAAhF,U,GAEN4E,EAAA6e,EAAU3f,MAAIgP,M,GAAd2Q,GACM,IAAM,EAAAnS,EAAA6S,oBAAmBD,EAAmBD,oB,cADlDnf,EAAAgO,MAAAlO,EAAAG,EAAAyD,OAAA,CACMxD,EAAAhF,UAOmB,IAArByjB,EAAU/e,QAAgBwf,EAAmBE,UAC7B,IAAM,EAAA9S,EAAA+S,mBAAkBH,EAAmBE,YAD3D,M,OACIA,EAAYpf,EAAAhF,OAClByjB,EAAU3f,KAAKsgB,G,iBAKnB,MAAO,CAAP,EADAX,EAAYE,EAAwBF,I,OA4CtC,SAAsB/V,EACpB4W,EAGA/jB,G,kGAIc,OAFRgkB,GAAY,EAAA7e,EAAA8e,cAAajkB,GAEjB,GAAMkkB,EAAcH,I,OAIlC,OAJII,EAAU3kB,EAAAC,QACF0E,OAAS,IACnBggB,EAAUA,EAAQpd,QAAO,SAACqC,GAAM,OAAAA,EAAEtC,QAAUkd,CAAZ,KAE3B,CAAP,EAAOG,G,OAGT,SAAeD,EACbH,G,sGAK4B,YAAxBA,EAAW5hB,SAAX,OACF+gB,EAAYF,EAAyBe,G,oBACN,gBAAxBA,EAAW5hB,SAAX,MACK,GAAMkhB,EAChBU,I,cADFb,EAAY1jB,EAAAC,O,aAIZ,MAAM,IAAIoQ,EAAAQ,wB,OAUZ,MAAO,CAAP,EAPgB6S,EAAUhZ,KAAI,SAACd,GAC7B,OAAAgb,EAAA,CACEtd,MAAOsC,EAAE7B,aACT8c,SAAUjb,EAAEkb,aACTC,EAAoBnb,EAAEkb,aAE7B,K,OAIF,SAASC,EAAoBD,GAG3B,IAAIE,EAAY,GACZC,EAAW,GACf,GAAIH,EAAYI,MAAM,KAAKvgB,OAAS,EAAG,CACrC,IAAMkR,EAAQiP,EAAYhP,QAAQ,KAClCkP,EAAYF,EAAYK,OAAO,EAAGtP,GAClCoP,EAAWH,EAAYK,OAAOtP,EAAQ,E,MAEtCmP,EAAYF,EACZG,EAAW,GAEb,MAAO,CAAED,UAAWA,EAAWC,SAAUA,EAC3C,CAEA,SAASrB,EAAwBF,GAO/B,OANAA,EAAUjgB,SAAQ,SAACmG,EAAGwb,GACD1B,EAAUnc,QAC3B,SAACka,GAAM,OAAAA,EAAE1Z,eAAiB6B,EAAE7B,cAAgB0Z,GAAK7X,CAA1C,IAEMjF,OAAS,GAAG+e,EAAU3N,OAAOqP,EAAG,EACjD,IACO1B,CACT,CA9JApkB,EAAAA,yBAAAkkB,EAmBAlkB,EAAAA,6BAAAukB,EAkCAvkB,EAAAA,uBAAA,SACEgB,EACAE,G,yGAEMgC,EAA0C,GAE1B,YAAlBlC,EAAKqC,SAAL,MACU,GAAMgL,EAAmBrN,EAAME,I,cAArC6B,EAAMrC,EAAAC,SACHuC,EAAoBuB,KAAK1B,EAAI,I,mBACX,gBAAlB/B,EAAKqC,SAAL,MACG,GAAM+hB,EAAcpkB,I,cAA1B+B,EAAMrC,EAAAC,OACZuC,EAAoBuB,KAAIgP,MAAxBvQ,EAA4BH,G,aAE5B,MAAM,IAAIgO,EAAAQ,wB,OAWZ,OARKrO,GACHA,EAAoBuB,KAAI6gB,EAAC,CACvBtd,MAAO,kBACPud,SAAU,mBACPE,EAAoB,MAIpB,CAAP,EAAOviB,G,QAGTlD,EAAAA,0BAAA,SACEilB,EAGA/jB,G,0FAEA,MAA4B,gBAAxB+jB,EAAW5hB,SACN,CAAC,EAAD,IAEY,GAAMgL,EAAmB4W,EAAY/jB,I,OAC1D,MAAO,CAAP,EADqBR,EAAAC,OACDua,MAAM,I,QAG5Blb,EAAAA,mBAAAqO,C,sICpGArO,EAAAA,kBAAA,SAAkCmQ,GAChC,IAAM4V,GAAO5V,EAAK6V,oBAChBC,EAAMF,GAAO,EAAI,IAAM,IACvBG,EAAM,SAAUC,GACd,IAAMC,EAAOC,KAAKC,MAAMD,KAAKE,IAAIJ,IACjC,OAAQC,EAAO,GAAK,IAAM,IAAMA,CAClC,EACF,OACEjW,EAAKqW,cACL,IACAN,EAAI/V,EAAKsW,WAAa,GACtB,IACAP,EAAI/V,EAAKuW,WACT,IACAR,EAAI/V,EAAKwW,YACT,IACAT,EAAI/V,EAAKyW,cACT,IACAV,EAAI/V,EAAK7H,cACT2d,EACAC,EAAIH,EAAM,IACV,IACAG,EAAIH,EAAM,GAEd,EAEA/lB,EAAAA,eAAA,SAA+B6mB,EAAaC,GAC1C,OAAKD,GAAUC,EACET,KAAKE,IACnBM,EAA+BC,GAGH,IAAO,GAAK,GALd,IAQ/B,EAEA9mB,EAAAA,iBAAA,SAAiC6mB,EAAaC,GAC5C,OAAKD,GAAUC,EACET,KAAKE,IACnBM,EAA+BC,GAGH,IAAO,GALT,IAQ/B,C,wjEC9CA,IAAAC,EAAAhoB,EAAA,OAQAwR,EAAAxR,EAAA,OACA8R,EAAA9R,EAAA,OACAgS,EAAAhS,EAAA,OAGAI,EAAAC,EAAAL,EAAA,OACAioB,EAAAjoB,EAAA,OACAkoB,EAAAloB,EAAA,OACAsH,EAAAtH,EAAA,MAEMkB,EAAM,SAENinB,EAA+B,2DAAA/d,OAA2DhK,EAAAoB,QAAO4mB,OAEjGC,EAA2B,gDAAAje,OAAgD+d,EAA4B,MAEvGG,EAAsB,IAAItd,IAEhC,SAASud,EAAyBC,GAChC,MACE,qCACA,iBAAApe,OAAiB+d,EAA4B,WAC1B/kB,IAAlBolB,EACG,4BAAApe,OAA4Boe,EAAa,MACzC,IACJ,GAEJ,CAEA,IAAMC,EAAST,EAAAU,OAAOC,mBAAmB,CACvCC,aAAc,IAAIV,EAAAW,8BAGpB,SAAsBphB,EAAwBuJ,G,gGAChC,SAAM8X,EAAgB9X,I,cAA9BvK,EAAQ9E,EAAAC,QACR,MACE0mB,EAAoBS,IAAI/X,IAC1BvK,EAAQ6hB,EAAoBhV,IAAItC,G,OAD9B,M,OAGM,SAAMgY,EAAmBhY,I,QAAjCvK,EAAQ9E,EAAAC,SAEN0mB,EAAoBnd,IAAI6F,EAAMvK,G,iBAIpC,MAAO,CAAP,EAAOA,G,OAGT,SAAeuiB,EAAmBhY,G,kGAChC5P,QAAQC,IAAIH,EAAK,0BAA2B8P,G,iBAGK,O,sBAAA,GAAMyX,EAClDQ,IAAI,sBACJrG,KAAmC,CAAE6D,YAAazV,K,OAIrD,OANM6G,EAAyClW,EAAAC,OAI/CR,QAAQC,IAAIH,EAAK,yBAA0B2W,GAEpC,CAAP,EAAOA,G,OAEP,M,WAAM,IAAI/F,EAAAkB,oBACR,iDACAhQ,G,wBAKN,SAAe8lB,EAAgB9X,G,wGAC7B5P,QAAQC,IAAIH,EAAK,yBAA0B8P,G,iBAEuB,O,sBAAA,GAAMyX,EACnEQ,IAAI,sBACJ3V,O,OAaH,OAfMuE,EAA0DlW,EAAAC,OAI1DsnB,EAAyC,GAEzCC,EAAW,IAAInB,EAAAoB,aACnBX,EACA5Q,GACA,SAACpR,GAEC,OADAyiB,EAAOxjB,KAAKe,IACL,CACT,IAGF,GAAM0iB,EAASE,W,OAMf,OANA1nB,EAAAC,OAEAR,QAAQC,IAAIH,EAAK,kBAAmBgoB,GAE9BziB,EAAQyiB,EAAOnjB,MAAK,SAACujB,GAAM,OAAAA,EAAE7C,cAAgBzV,CAAlB,IACjC5P,QAAQC,IAAIH,EAAK,oBAAqBuF,GAC/B,CAAP,EAAOA,G,OAEP,M,WAAM,IAAIqL,EAAAkB,oBACR,+CACAjR,G,wBAKN,SAAsB4F,EAAY4hB,G,gGAE4B,O,sBAAA,GAAMd,EAC7DQ,IAAI,sBAAA7e,OAAsBmf,EAAO,cACjCjW,O,OAGH,MAAO,CAAP,EAL0D3R,EAAAC,OAIhC6Z,O,OAG1B,M,WAAM,IAAI3J,EAAAkB,oBACR,yCACAxP,G,wBAKN,SAAsBmN,EAAW1H,EAAevB,G,0FAChC,SAAMD,EAAwBC,I,OAC3B,SAAMC,EADThG,EAAAC,OAC2BgG,K,OAMzC,MAAO,CAAP,EANiBjG,EAAAC,OAEgBmE,MAC/B,SAAC0J,GAAM,OAAAA,EAAEzH,eAAe,IAAMyH,EAAEzH,eAAe,GAAGC,UAAYgB,CAAvD,K,OAwBX,SAAsBoI,EAActJ,G,gGAClC3G,QAAQC,IAAIH,EAAK,oBAAqB6G,EAAQC,eAAe,GAAGC,S,iBAG9D,O,sBAAA,GAAMwgB,EAAOQ,IAAI,gBAAA7e,OAAgBrC,EAAQH,KAAM4hB,MAAMzhB,I,cAArDpG,EAAAC,O,aAEA,M,WAAM,IAAIkQ,EAAAkB,oBACR,2CACA+K,G,wBAKN,SAAe0L,EACbC,EACA3hB,G,gGAEA3G,QAAQC,IAAIH,EAAK,oBAAqB6G,EAAQC,eAAe,GAAGC,S,iBAG9D,O,sBAAA,GAAMwgB,EACHQ,IAAI,sBAAA7e,OAAsBsf,EAAc,cACxC9G,KAAK7a,I,cAFRpG,EAAAC,O,aAIA,M,WAAM,IAAIkQ,EAAAkB,oBACR,2CACAkM,G,wBAgBN,SAAsB/U,EAAcwf,G,gGAClCvoB,QAAQC,IAAIH,EAAK,oBAAqByoB,G,iBAGpC,O,sBAAA,GAAMlB,EAAOQ,IAAI,gBAAA7e,OAAgBuf,IAAaC,U,cAA9CjoB,EAAAC,O,aAEA,M,WAAM,IAAIkQ,EAAAkB,oBACR,2CACA6W,G,wBAmBN,SAAeC,EACbC,EACAhf,G,gHAEMif,EAA2B,GAE3BC,EAAO,mBAAA7f,OAAmB2f,EAAM,aAEhCG,EACHzB,EAAe,OAAoBnM,QAAQhW,OAC5C2jB,EAAK3jB,OACL,GACA,EACA,IAEE6jB,EAAuB,GAC3Bpf,EAAiB3F,SAAQ,SAACwD,EAAoBX,GAC5C,IAAMmiB,EACJ,UAAAhgB,OAAUnC,EAAO,WAAAmC,OAAUnC,EAAO,UAClC,cAAAmC,OAAcxB,EAAayhB,cAAa,cAAAjgB,OAAaxB,EAAayhB,cAAa,MAUjF,GAR2BC,mBACzB,IAAAlgB,OAAI+f,GAAoB/f,OAAGggB,EAAiB,MAOvB9jB,QAAU,KAAO4jB,EAAc,CACpD,IAAMK,EAAU9B,EACbQ,IAAIgB,GACJO,OAAO,IAAApgB,OAAI+f,EAAoB,MAC/BM,IAAI,KAEPT,EAAStkB,KAAK6kB,GACdJ,EAAuBC,C,MAGnBD,EACFA,GAAwB,OAASC,EAEjCD,EAAuBC,CAG7B,IAEMhT,EAAUqR,EAAOQ,IAAIgB,GAAMO,OAAO,IAAApgB,OAAI+f,EAAoB,MAAKM,IAAI,KAEzET,EAAStkB,KAAK0R,GAERhM,EAAwC,G,IACxBsf,EAAAV,E,wBAAA5jB,EAAAskB,EAAApkB,OACH,GAAMqkB,EADpBD,EAAAtkB,KAAyB,M,OACtB4C,EAAWrH,EAAAC,OACjBwJ,EAAY1F,KAAIgP,MAAhBtJ,EAAoBpC,G,wBAFA5C,I,aAKtB,MAAO,CAAP,EAAOgF,G,OAMT,SAAeuf,EACbvT,G,sGAK0D,OAHpDpO,EAAqC,GAC3C5H,QAAQC,IAAIH,EAAK,gCAAiCkW,GAEQ,GAAMA,EAAQ9D,O,OAAlEuE,EAAoDlW,EAAAC,OAEpDunB,EAAW,IAAInB,EAAAoB,aACnBX,EACA5Q,GACA,SAACnN,GAEC,OADA1B,EAAStD,KAAKgF,IACP,CACT,I,iBAIA,O,sBAAA,GAAMye,EAASE,W,cAAf1nB,EAAAC,O,aAEA,M,WAAM,IAAIkQ,EAAAkB,oBACR,wCACA4X,G,OAIJ,MAAO,CAAP,EAAO5hB,G,OAGT,SAAsB6hB,EACpB7R,EACA7W,G,gGAGyC,O,sBAAA,GAAMsmB,EAC1CQ,IACC,IAAA7e,OAAI0gB,EAAuB3oB,GAAiB,YAAAiI,QAAW,EAAA9C,EAAAyjB,eACrD/R,KAGH1F,O,OAEH,MAAO,CAAP,EARuC3R,EAAAC,Q,OAUvC,M,WAAM,IAAIkQ,EAAAkB,oBAAoB,qCAAsCgY,G,wBAmHxE,SAAeC,EAAyBvgB,G,0GAEK,O,sBAAA,GAAM+d,EAC5CQ,IAAI,gBAAA7e,OAAgBM,EAAQ9C,KAC5BsjB,OAAO7C,GACP/U,O,OAMH,OATMuE,EAAmC/T,EAAAlC,QAKnCupB,EAA8D,QAAtCxpB,EAAAkW,EAASuT,qCAA6B,IAAAzpB,OAAA,EAAAA,EAAEoE,MACpE,SAAClC,GAAS,OAAAA,EAAK+D,KAAOugB,CAAZ,KAIH,CAAP,EAAgChgB,KAAKoI,MAAM4a,EAAsB1P,QAG5D,CAAP,OAAOrY,G,OAEP,M,WAAM,IAAI0O,EAAAkB,oBACR,qDAAuDqY,EAAM3gB,QAC7D2gB,G,wBAoCN,SAAgBP,EACd3oB,GAEA,OAAOA,EAAmB,UAAAiI,OAAUjI,EAAiBmpB,eAAkB,KACzE,CA9cArqB,EAAAA,wBAAAwG,EAmEAxG,EAAAA,YAAA0G,EAgBA1G,EAAAA,WAAA0P,EAWA1P,EAAAA,sBAAA,SACE8G,EACAL,G,kGAEc,SAAMD,EAAwBC,I,OACpB,OADlBjB,EAAQ9E,EAAAC,OACU,GAAM+O,EAC5B5I,EAAQC,eAAe,GAAGC,QAC1BP,I,cAFIkJ,EAAkBjP,EAAAC,QAKpB,MACF,GAAM6nB,EAAchjB,EAAMmB,GAAIG,I,cAA9BpG,EAAAC,O,aAGA,OADAmG,EAAQH,GAAKgJ,EAAgBhJ,GAC7B,GAAMyJ,EAActJ,I,OAApBpG,EAAAC,O,mCAIJX,EAAAA,cAAAoQ,EA+BApQ,EAAAA,mBAAA,SAAyCyG,G,sGAEzB,OADdtG,QAAQC,IAAIH,EAAK,0BAA2BwG,GAC9B,GAAMohB,EAAgBphB,I,OACpC,OADMjB,EAAQ9E,EAAAC,QAGG,GAAM+F,EAAYlB,EAAMmB,KAF7B,I,OAENC,EAAWlG,EAAAC,O,IACDmO,EAAAlI,E,wBAAAzB,EAAA2J,EAAAzJ,OACd,GAAM6D,EADI4F,EAAA3J,GACYwB,KADA,M,OACtBjG,EAAAC,O,wBADcwE,I,+BAKlBnF,EAAAA,cAAAkJ,EAaAlJ,EAAAA,YAAA,SAAkC8J,G,oGAChC,OAAKA,EAAiBoM,KACR,GAAM2S,EAAsB,QAAS/e,IADhB,CAAC,EAAD,I,OAEtB,OADPwgB,EAAQ5pB,EAAAC,OACD,GAAMkoB,EAAsB,YAAa/e,I,OAQtD,OARMnJ,EAAOD,EAAAC,OAQN,CAAP,EAJAwJ,GAFIA,EAAWgB,EAAAA,EAAA,GAAOmf,GAAO,GAAG3pB,GAAI,IAEVsH,QAAO,SAACC,EAAG4d,GACnC,OAAO3b,EAAYogB,WAAU,SAACC,GAAO,OAAAA,EAAG7jB,KAAOuB,EAAEvB,EAAZ,MAAoBmf,CAC3D,K,QAiGF9lB,EAAAA,SAAA4pB,EAuBA5pB,EAAAA,mBAAA,SACE+X,EACA7W,G,kGAGgB,O,sBAAA,GAAM0oB,EAAS7R,EAAQ7W,I,aAElB,gBAFbupB,EAAQ/pB,EAAAC,QAEJ+pB,KAAN,MACmB,GAAMd,EACzBa,EAAME,eACNzpB,I,OAGF,MAAO,CAAP,EAAO,CACLiT,IANmBzT,EAAAC,OAMDiqB,QAClBtW,aAAcmW,EAAMG,QACpBvnB,SAAUonB,EAAMC,O,OAIpB,MAAO,CAAP,EAAO,CACLvW,IAAKsW,EAAMG,QACXtW,aAAc,KACdjR,SAAUonB,EAAMC,O,OAGlB,I,sBACmB7Z,EAAAkB,qBAChB8Y,EAAMpS,YAA2BqS,aAAe9D,EAAA+D,YAAYC,UAM7D,MAJA7qB,QAAQC,IAAIH,EAAK,qCAIX,IAAIsQ,EAAAa,wBAGZ,MAAM,IAAIP,EAAAkB,oBACR,+CACA8Y,G,yBAMN7qB,EAAAA,gCAAA,SACEunB,EACArmB,G,oGAG0D,O,sBAAA,GAAMsmB,EAC3DQ,IAAI,GAAA7e,OAAG0gB,EAAuB3oB,GAAiB,YAC/C+G,OAAOqf,EAAyBC,IAChC0C,OAAO7C,GACP/U,O,OAIH,OARMuE,EAAkDlW,EAAAC,QAMlDsqB,EAASrU,EAAS4D,QAES,IAAlByQ,EAAO5lB,OAIf,CAAP,EAAO4lB,EAAO,GAAGtkB,IAHR,CAAP,EAAO,M,OAKT,M,WAAM,IAAIkK,EAAAkB,oBACR,yDACAmZ,G,yBAKNlrB,EAAAA,eAAA,SACE+X,EACA1U,EACAnC,G,oGAOA,GALMiqB,GAAa,EAAA9kB,EAAAyjB,eAAc/R,GAE3BqT,EAAcvB,EAAuB3oB,GAG1B,YAAbmC,EACF8S,EAAUqR,EAAOQ,IAAI,IAAA7e,OAAIiiB,EAAW,cAAAjiB,OAAagiB,EAAU,qBACtD,IAAiB,gBAAb9nB,EAGT,MAAM,IAAI0N,EAAAQ,wBAFV4E,EAAUqR,EAAOQ,IAAI,IAAA7e,OAAIiiB,EAAW,YAAAjiB,OAAWgiB,EAAU,gB,CAQzD,OAHFhrB,QAAQC,IAAIH,EAAK,2BAA4BkW,GAG3C,GAAMA,EAAQ9D,O,OAEhB,MAAO,CAAP,EAFE3R,EAAAC,OAEc6Z,O,QAGlBxa,EAAAA,oBAAA,SACEyJ,EACA4hB,G,gGAE8B,SAAMrB,EAAyBvgB,I,OAC7D,OADMygB,EAAwBxpB,EAAAC,QAGvB,CAAP,EADsBupB,EAAsBmB,IADT,CAAP,OAAOlpB,G,QA6BrCnC,EAAAA,oBAAA,SACEyJ,EACA4hB,EACA9D,G,sGAG0B,O,sBAAA,GAAMyC,EAAyBvgB,I,OAgBvD,OAhBI6hB,EAAoB5qB,EAAAC,UAEA2qB,EAAoB,CAAC,GAC7CA,EAAkBD,GAAgB9D,EAE5BgE,EAAOrkB,KAAKC,UAAUmkB,GAEtBE,EAAqC,CACzCrB,8BAA+B,CAC7B,CACExjB,GAAIugB,EACJ1M,MAAO+Q,KAKb,GAAM/D,EAAOQ,IAAI,gBAAA7e,OAAgBM,EAAQ9C,KAAM4hB,MAAMiD,I,cAArD9qB,EAAAC,O,aAEA,M,WAAM,IAAIkQ,EAAAkB,oBACR,mDAAqD0Z,EAAMhiB,QAC3DgiB,G,yBAKNzrB,EAAAA,uBAAA6pB,C,2GClfA,IAAAxjB,EAAAtH,EAAA,MAEAiB,EAAAA,yBAAA,SAAyCgB,GACvC,IAAMkkB,GAAY,EAAA7e,EAAA8e,mBAAahjB,GAG/B,OAFoBnB,EAAKwH,KAAKC,aAAazB,UAEpBke,EAAY,MAAQ,IAC7C,C,g0BCRA,IAAAzU,EAAA1R,EAAA,OACA2R,EAAAtR,EAAAL,EAAA,QACA4R,EAAA5R,EAAA,OACA6R,EAAA7R,EAAA,OACA2sB,EAAA3sB,EAAA,OACA4sB,EAAA5sB,EAAA,OACAioB,EAAAjoB,EAAA,OACAM,EAAAD,EAAAL,EAAA,QACAW,EAAAT,EAAAF,EAAA,QAgEA,SAAS6sB,EAAaC,GACpB,OAAyB,IAArBA,EAAUnW,OACL,IAAI/E,EAAAgB,oBAAoBka,EAAUC,cAEvCD,EAAUnW,SAAWsR,EAAA+D,YAAYgB,aAC5B,IAAItb,EAAAmB,cAAcia,EAAUC,cAEjCD,EAAUnW,SAAWsR,EAAA+D,YAAYiB,UAC5B,IAAIpb,EAAAkB,mBAAmB+Z,EAAUC,cAEtCD,EAAUnW,SAAWsR,EAAA+D,YAAYkB,sBAC5B,IAAIP,EAAAnT,wBAAwBsT,GAGnCA,EAAUnW,QAAUsR,EAAA+D,YAAYmB,aAChCL,EAAUM,cACVN,EAAUM,aAAaC,SAAS,iBAEzB,IAAI1b,EAAAnQ,QAA0BsrB,GAGhC,IAAIF,EAAAnT,qBAAqBqT,EAClC,CApFA7rB,EAAAA,KAAA,SAAwB+hB,EAAaxW,EAAe8gB,GAClD,YADkD,IAAAA,IAAAA,GAAA,GAC3C,IAAIvpB,SAAW,SAAUwpB,EAASC,GACvCltB,EAAAkB,QAAEisB,KAAK,CACLzK,IAAKA,EACLsK,MAAOA,EACP3B,KAAM,OACN+B,QAAS,CACPC,cAAe,UAAYhtB,EAAawc,WACxC,eAAgB,oBAElByQ,KAAMzlB,KAAKC,UAAUoE,GAErBqhB,QAAS,SAAUhW,GACjB0V,EAAQ1V,EACV,EACApH,MAAO,SAAUqd,GACf,IAAMC,EAAiBlB,EAAaiB,GACpCN,EAAOO,EACT,GAEJ,GACF,EAEA9sB,EAAAA,SAAA,SAA4B+hB,EAAaxW,GACvC,OAAO,IAAIzI,SAAW,SAAUwpB,EAASC,GACvCltB,EAAAkB,QAAEisB,KAAK,CACLzK,IAAKA,EACL2I,KAAM,OACN+B,QAAS,CAAE,eAAgB,qCAC3BE,KAAMphB,EAENqhB,QAAS,SAAUhW,GACjB0V,EAAQ1V,EACV,EACApH,MAAO,SAAUqd,GACf,IAAMC,EAAiBlB,EAAaiB,GACpCN,EAAOO,EACT,GAEJ,GACF,EAEA9sB,EAAAA,IAAA,SAAuB+hB,EAAasK,GAClC,YADkC,IAAAA,IAAAA,GAAA,GAC3B,IAAIvpB,SAAW,SAAUwpB,EAASC,GACvCltB,EAAAkB,QAAEisB,KAAK,CACLzK,IAAKA,EACL2I,KAAM,MACN2B,MAAOA,EACPI,QAAS,CACPC,cAAe,UAAYhtB,EAAawc,YAE1C0Q,QAAS,SAAUhW,GACjB0V,EAAQ1V,EACV,EACApH,MAAO,SAAUqd,GACf,IAAMC,EAAiBlB,EAAaiB,GACpCN,EAAOO,EACT,GAEJ,GACF,C,29DCpEA,IAAAC,EAAAhuB,EAAA,OACAiuB,EAAAjuB,EAAA,OACAkuB,EAAAluB,EAAA,OAMAmuB,EAAA,SAAAjV,GACE,SAAAiV,EAAYzjB,EAAwB6S,GAApC,IAAA5D,EACET,EAAAC,KAAA,KAAMzO,EAAS6S,IAAW,K,OADQ5D,EAAA4D,WAAAA,E,CAEpC,CACF,OAJ+BnE,EAAA+U,EAAAjV,GAI/BiV,CAAA,CAJA,CAA+BH,EAAA3U,WAAlBpY,EAAAA,UAAAktB,EASb,IAAA9R,EAAA,WACE,SAAAA,EAAoB+R,GAAA,KAAAA,SAAAA,CAAmC,CA4GzD,OA1GE/R,EAAA+F,UAAAnF,aAAA,WACE,OAAOtZ,KAAK0qB,iBACd,EAaOhS,EAAAuE,aAAP,WAGE,QAAK,oCAAoC0N,KAAK5Y,SAAS6Y,QAIvDN,EAAAO,OAAOzS,MAAMrG,SAAS6Y,OACf,EACT,EAUelS,EAAAoS,aAAf,SACEzL,EACA0L,EACAC,QAFA,IAAA3L,IAAAA,EAActN,SAAS6Y,WACvB,IAAAG,IAAAA,EAAkBhZ,SAASyF,aAC3B,IAAAwT,IAAAA,EAAA,KAEID,IACF1L,EAAMA,EAAI4L,QAAQF,EAAS,KAGvB,IAAA/sB,EAAgBqhB,EAAI6D,MAAM8H,GAAzBE,EAAIltB,EAAA,GAAEmtB,EAAKntB,EAAA,GACdotB,EAAuB,MAATD,EAAgBD,EAAOC,EAMzC,OAJkC,IAA9BC,EAAYtX,QAAQ,OACtBsX,EAAcA,EAAYlI,MAAM,KAAK,IAGhCxK,EAAc2S,cAAcD,EACrC,EAEe1S,EAAA2S,cAAf,SAA6BC,GAC3B,GAAe,MAAXA,GAAsC,KAAnBA,EAAQC,OAC7B,OAAO,KAOT,IAJA,IAEIC,EAFEC,EAA2C,CAAC,EAC5CC,EAAQ,oBAGgC,QAAtCF,EAAaE,EAAMC,KAAKL,KAER,WAAlBE,EAAW,KACbA,EAAW,GAAKA,EAAW,GAAGP,QAAQ,IAAK,KAE7CQ,EAAOG,mBAAmBJ,EAAW,KAAOI,mBAC1CJ,EAAW,IAIf,OAAOC,CACT,EAEc/S,EAAA+F,UAAAiM,gBAAd,W,sGAMsB,OAJd1sB,GAAiB,EAAAusB,EAAAsB,gBAAe7rB,KAAKyqB,UAAnCqB,EAAK9tB,EAAA8tB,MAAEzM,EAAGrhB,EAAAqhB,IAIE,GAAM,IAAIiL,EAAAO,OAAexL,EAAK,KAAM,KAAK0M,Q,OAG7D,OAHMhT,EAAc5Y,EAAAlC,OAGb,CAAP,EAAO+B,KAAKgsB,mBAAmBjT,EAAa/Y,KAAKyqB,SAAUqB,I,QAGrDpT,EAAA+F,UAAAuN,mBAAR,SACEjT,EACA0R,EACAqB,GAEA,IAAMC,EAASrT,EAAcoS,aAC3B/R,EACA0R,EAAS1R,aAEX,GAAc,MAAVgT,EACF,MAAM,IAAIvB,EAAU,4CACf,GAAIC,EAASqB,QAAUC,EAAOD,QAAUA,EAC7C,MAAM,IAAItB,EAAU,8BACf,GAAI,SAAUuB,EACnB,OAAOA,EAEP,MAAM,IAAIvB,EAAWuB,EAAkBjf,MAE3C,EACF4L,CAAA,CA7GA,GAAapb,EAAAA,cAAAob,C,iGClBb,IAAAuT,EAAA5vB,EAAA,OA0CAiB,EAAAA,eAAA,SAA+B4uB,GAI7B,IAAMjT,EAAQiT,EAAejT,MACzB0N,mBAAmBuF,EAAejT,OAClC,KACEkT,EAAWD,EAAeC,SAC5BxF,mBAAmBuF,EAAeC,UAClC,KACEL,EAAQI,EAAeJ,QAAS,EAAAG,EAAAG,4BAChCC,EAAQH,EAAeG,QAAS,EAAAJ,EAAAG,4BAEhCE,EAAc,CAClB,iBAAA7lB,OAAiBylB,EAAehT,cAChC,aAAAzS,OAAakgB,mBAAmBuF,EAAernB,WAC/C,gBAAA4B,OAAgBkgB,mBAAmBuF,EAAenT,eAepD,GAZIE,GACFqT,EAAYvqB,KAAK,SAAA0E,OAASwS,IAExBkT,GACFG,EAAYvqB,KAAK,YAAA0E,OAAY0lB,IAE3BL,GACFQ,EAAYvqB,KAAK,SAAA0E,OAASqlB,IAExBO,GACFC,EAAYvqB,KAAK,SAAA0E,OAAS4lB,IAExBH,EAAe/S,qBACjB,IAAoB,IAAA1W,EAAA,EAAAzE,EAAAyO,OAAO8f,KAAKL,EAAe/S,sBAA3B1W,EAAAzE,EAAA2E,OAAAF,IAAkD,CAAjE,IAAM+pB,EAAKxuB,EAAAyE,GACd6pB,EAAYvqB,KACV,GAAA0E,OAAG+lB,EAAK,KAAA/lB,OAAIkgB,mBACVuF,EAAe/S,qBAAqBqT,K,CAM5C,MAAO,CACLnN,IAAK,GAAA5Y,OAAGylB,EAAevT,SAAOlS,OAC5BylB,EAAetT,aAAY,KAAAnS,OACzB6lB,EAAYjM,KAAK,MACrByL,MAAOA,EAEX,C,yGCvFAxuB,EAAAA,yBAAA,WACE,IAAMmvB,EAAS,IAAIC,YAAY,GAC/B,GAAI,aAAchtB,OAEVA,OAAQitB,SAASC,gBAAgBH,OAClC,MAAI,WAAY/sB,QAGrB,MAAM,IAAImtB,MACR,2HAHFntB,OAAOotB,OAAOF,gBAAgBH,E,CAMhC,OAAOA,EAAO,EAChB,C,2UCfA,IAAAre,EAAA/R,EAAA,OACAD,EAAAC,EAAA,OACAsR,EAAAtR,EAAA,OAkTA,SAAS6sB,EAAaniB,EAAiB+F,GACrC,OAAIA,GAAwB,yBAAfA,EAAMO,MAAkD,OAAfP,EAAM2M,KAEnD,IAAIrd,EAAAgD,kCAAkC0N,GAExC,IAAIsB,EAAAkB,iBAAiBvI,EAAS+F,EACvC,CArTAxP,EAAAA,aAAA,SAA6BuL,GAC3B,OAAO,IAAIzI,SAAgB,SAACwpB,EAASC,GACnChhB,EAAKkkB,SAAS,QAAQ,SAACC,GACjBA,EAAWha,SAAW2D,OAAOsW,kBAAkBC,UACjDtD,EAAQoD,EAAWlV,OAEnB+R,EACEX,EAAa,kCAAmC8D,EAAWlgB,OAEjE,GACF,GACF,EAEAxP,EAAAA,mBAAA,SAAmC6vB,GAkBjC,OAjBgB,IAAI/sB,SAAsC,SACxDwpB,EACAC,GAEAsD,EAAWJ,UAAS,SAACK,GACfA,EAAiBpa,SAAW2D,OAAOsW,kBAAkBC,UACvDtD,EAAQwD,EAAiBtV,OAEzB+R,EACEX,EACE,wCACAkE,EAAiBtgB,OAGzB,GACF,GAGF,EAEAxP,EAAAA,kBAAA,SAAkC+kB,GAiBhC,OAhBgB,IAAIjiB,SAAoC,SACtDwpB,EACAC,GAEAxH,EAAU0K,UAAS,SAACM,GACdA,EAAgBra,SAAW2D,OAAOsW,kBAAkBC,UACtDtD,EAAQyD,EAAgBvV,OAExB+R,EACEX,EACE,uCACAmE,EAAgBvgB,OAGxB,GACF,GAEF,EAEAxP,EAAAA,gBAAA,SAAgC2K,GAc9B,OAbgB,IAAI7H,SAAgB,SAAUwpB,EAASC,GACrD5hB,EAAQ8kB,UAAS,SAACK,GACZA,EAAiBpa,SAAW2D,OAAOsW,kBAAkBC,UACvDtD,EAAQwD,EAAiBtV,OAEzB+R,EACEX,EACE,qCACAkE,EAAiBtgB,OAGzB,GACF,GAEF,EAEAxP,EAAAA,aAAA,SAA6BgwB,GAc3B,OAbgB,IAAIltB,SAAc,SAAUwpB,EAASC,GACnDyD,EAAKP,UAAS,SAACK,GACTA,EAAiBpa,SAAW2D,OAAOsW,kBAAkBC,UACvDtD,EAAQwD,EAAiBtV,OAEzB+R,EACEX,EACE,kCACAkE,EAAiBtgB,OAGzB,GACF,GAEF,EAEAxP,EAAAA,UAAA,SAA0BwkB,GAExB,IAAKA,EAAYyL,UACf,MAAM,IAAI5f,EAAAmB,kCACR,0FAqBJ,OAjBgB,IAAI1O,SAAgB,SAAUwpB,EAASC,GACrD/H,EAAYyL,WAAU,SAACC,GACjBA,EAAWxa,SAAW2D,OAAOsW,kBAAkBC,UACjDtD,EAAQ4D,EAAW1V,QAGU,MAAzB0V,EAAW1gB,MAAM2M,MACnBoQ,EACE,IAAIlc,EAAAmB,kCACF,oFAIN+a,EAAOX,EAAa,8BAA+BsE,EAAW1gB,QAElE,GACF,GAEF,EAEAxP,EAAAA,WAAA,SAA2BwkB,GAEzB,IAAKA,EAAY2L,eACf,MAAM,IAAI9f,EAAAmB,kCACR,2EAyBJ,OArBgB,IAAI1O,SAAgB,SAAUwpB,EAASC,GACrD/H,EAAY2L,gBAAe,SAACC,GACtBA,EAAY1a,SAAW2D,OAAOsW,kBAAkBC,UAClDtD,EAAQ8D,EAAY5V,QAKU,MAA1B4V,EAAY5gB,MAAM2M,MACpBoQ,EACE,IAAIlc,EAAAmB,kCACF,qFAIN+a,EACEX,EAAa,gCAAiCwE,EAAY5gB,QAGhE,GACF,GAEF,EAEAxP,EAAAA,yBAAA,SACEgB,GAEA,OAAO,IAAI8B,SAAiC,SAACwpB,EAASC,GACpDvrB,EAAKqvB,2BAA0B,SAAC9V,GAC1BA,EAAY7E,QAAU2D,OAAOsW,kBAAkBC,UACjDtD,EAAQ/R,EAAYC,OAEpB+R,EACEX,EACE,+CACArR,EAAY/K,OAGpB,GACF,GACF,EAEAxP,EAAAA,0BAAA,SACEmS,GAEA,OAAO,IAAIrP,SAAc,SAAUwpB,EAASC,GAC1Cpa,EAAW8d,WAAU,SAAC1V,GAChBA,EAAY7E,SAAW2D,OAAOsW,kBAAkBC,UAAWtD,IAE7DC,EACEX,EACE,gDACArR,EAAY/K,OAGpB,GACF,GACF,EAQAxP,EAAAA,kBAAA,SAAkCgB,GAChC,OAAO,IAAI8B,SAAiB,SAACwpB,EAASC,GAE/BvrB,EAAKsvB,WAECtvB,EAAKsvB,WAAWC,iBAAmBvvB,EAAKwvB,SACjDlE,GAAQ,GACEtrB,EAAKsvB,WAAWb,SAG1BzuB,EAAKsvB,WAAWb,UAAS,SAAClV,GACpBA,EAAY7E,QAAU2D,OAAOsW,kBAAkBC,UAE/CrV,EAAYC,OACZD,EAAYC,MAAM+V,iBACjBvvB,EAAKwvB,SAENlE,GAAQ,GAERA,GAAQ,GAGVC,EACEX,EACE,sDACArR,EAAY/K,OAIpB,IArBA8c,GAAQ,GAJRA,GAAQ,EA2BZ,GACF,EAEAtsB,EAAAA,oBAAA,SACEgB,GAEA,OAAO,IAAI8B,SAA6C,SAACwpB,EAASC,GAChE,IAAKvrB,EAAKyvB,yBACR,OAAOnE,OAAQnqB,GAGjBnB,EAAKyvB,0BAAyB,SAAClW,GACzBA,EAAY7E,QAAU2D,OAAOsW,kBAAkBC,UACjDtD,EAAQ/R,EAAYC,OAEpB+R,EACEX,EACE,+CACArR,EAAY/K,OAIpB,GACF,GACF,EAEAxP,EAAAA,eAAA,SACEgB,GAEA,OAAO,IAAI8B,SAA2C,SAACwpB,EAASC,GAC1DvrB,EAAK+U,YACPuW,EAAQtrB,EAAK+U,aACJ/U,EAAK0vB,oBACd1vB,EAAK0vB,qBAAoB,SAACnW,GACpBA,EAAY7E,QAAU2D,OAAOsW,kBAAkBC,UACjDtD,EAAQ/R,EAAYC,OAEpB+R,EACEX,EACE,yCACArR,EAAY/K,OAIpB,IAEA+c,EACE,IAAIlc,EAAAmB,kCACF,oFAIR,GACF,EAEAxR,EAAAA,qBAAA,SACEgB,EACA2vB,GAEA,OAAO,IAAI7tB,SAAkC,SAACwpB,EAASC,GACjDvrB,EAAK4vB,0BACP5vB,EAAK4vB,0BAA0BD,GAAc,SAACpW,GACxCA,EAAY7E,QAAU2D,OAAOsW,kBAAkBC,UACjDtD,EAAQ/R,EAAYC,OAEpB+R,EACEX,EACE,gDACArR,EAAY/K,OAIpB,IAEA+c,EACE,IAAIlc,EAAAmB,kCACF,2FAIR,GACF,C,gkFCjTA,IAAAvL,EAAAlH,EAAA,OACAwR,EAAAxR,EAAA,OACA+R,EAAA/R,EAAA,OACAgS,EAAAhS,EAAA,OAEAI,EAAAC,EAAAL,EAAA,OAEA8xB,EAAA9xB,EAAA,OACA+xB,EAAA/xB,EAAA,OACAY,EAAAZ,EAAA,OACAoH,EAAAlH,EAAAF,EAAA,QACAS,EAAAP,EAAAF,EAAA,QAGMkB,EAAM,SAEZ,SAAgBklB,EACdjkB,GAEA,OAAOA,EACHA,EAAiB6vB,MACjB1X,OAAOC,QAAQC,QAAQwC,YAAYtT,YACzC,CAEA,SAAgBuoB,EAAiBvc,GAQ/B,OAPgB,IAAI3R,SAAgB,SAAUwpB,EAASC,GACrD9X,EAASgb,UAAS,SAACK,GACbA,EAAiBpa,SAAW2D,OAAOsW,kBAAkBC,UACvDtD,EAAQwD,EAAiBtV,OACtB+R,EAAOuD,EAAiBtgB,MAC/B,GACF,GAEF,CA2EA,SAAsBtB,EACpBlN,G,sGAEsB,YAAlBA,EAAKqC,SAAL,MAEK,CAAP,EADgBrC,EACDiwB,iB,aACY,gBAAlBjwB,EAAKqC,SAAL,MACLohB,EAAsBzjB,GAEjB,CAAP,GADMwjB,EAAcxjB,GACDD,OAFjB,M,OAKW,OADPyjB,EAAcxjB,EACP,GAAMxB,EAAkB0xB,aAAa1M,EAAYzjB,Q,OAC9D,MAAO,CAAP,EADaL,EAAAC,QACE,IAAIL,M,wBAsBzB,SAAgBmkB,EAAsBN,GACpC,MAAgC,gBAAzBA,EAAY9gB,UAA8B8gB,EAAYpM,MAC/D,CAGA,SAAsB/D,EACpBmQ,EACAjjB,G,sGAGA,GAAIijB,EAAYpM,OAAQ,MAAO,CAAP,EAAOoM,EAAYpM,Q,iBAoBlC,O,uBAAA,GAAMvY,EAAkB2xB,WAAWhN,I,OAA1C,MAAO,CAAP,EAAOzjB,EAAAC,Q,mCAIE,O,uBAAA,GAAMnB,EAAkBywB,UAAU9L,I,OAAzC,MAAO,CAAP,EAAOzjB,EAAAC,Q,mCAIE,O,uBAAA,GAAMywB,EACXjN,EACAjjB,I,OAFF,MAAO,CAAP,EAAOR,EAAAC,Q,OAMP,M,sBAEE4P,EAAAa,wBAEMigB,GAIAC,EAAoB,CACxBC,WAAYC,EACZC,UAAWC,EACXC,yCACEN,GAEE,IAAIprB,EAAAgB,qBACR,oCACAqqB,I,mEAiBZ,SAAeF,EACbjN,EACAjjB,G,oGAImB,OAFnB,EAAA4vB,EAAAc,qBAEmB,GAAMpyB,EAAkB0S,yBACzCiS,I,cADIhS,EAAazR,EAAAC,OAGnBR,QAAQC,IAAIH,EAAK,sDAEb4xB,EAA0B1f,EAAWE,IAAI,kCAG3ClS,QAAQC,IACNH,EACA,4CACA4xB,GAGS,GAAM1rB,EAAS2rB,gCACxBD,EACA3wB,KATA,M,OAYF,GALMyF,EAAKjG,EAAAC,OAOT,OADAR,QAAQC,IAAIH,EAAK,8BAA+B0G,GACzC,CAAP,EAAOA,GAIP,MADAxG,QAAQC,IAAIH,EAAK,qCACX,IAAIsQ,EAAAa,wB,OASZ,OAHAjR,QAAQC,IAAIH,EAAK,sCACjB4xB,GAAkB,IAAIvxB,MAAOyxB,UAAUtc,WACvCtD,EAAWjI,IAAI,+BAAgC2nB,GAC/C,GAAMryB,EAAkBiT,0BAA0BN,I,OAClD,MADAzR,EAAAC,OACM,IAAI4P,EAAAa,wB,wBAmFd,SAAsB4G,EACpBD,EACA1U,EACAnC,G,kGAGsB,O,sBAAA,GAAMiF,EAAS6rB,eACjCja,EACA1U,EACAnC,I,OAkCF,OArCM6U,EAAcrV,EAAAC,OAqCb,CAAP,EA/B6BoV,EAC1B9N,QACC,SAAC+N,GACC,QAAGA,EAA6Cic,YAAhD,IAEH7mB,KAAI,SAAC4K,GAmBJ,MAXsB,CACpBrP,GARc0S,OAAOC,QAAQC,QAEC2Y,eAC9Blc,EAAWrP,GACX0S,OAAO8Y,aAAaC,YAAYC,MAKhCtiB,KAAMiG,EAAWjG,KACjBuiB,YAAatc,EAAWsc,YACxBL,aAAcjc,EAAWic,aACzB/b,KAAMF,EAAWE,KACjBqc,eAAgB,EAChB5b,SAAUX,EAAWW,SACrB6b,SAAUxc,EAAW,eAIzB,IAEgD/N,QAChD,SAACqC,GAAM,OAACA,EAAEqM,QAAH,K,OAKT,GAAqB,O,YAAXjB,OAIR,MAAM,IAAInF,EAAAa,wBAEZ,MAAMtQ,E,wBAIV,SAAsBmT,EACpB8D,EACA7W,G,0FAEO,SAAMiF,EAAS8N,mBAAmB8D,EAAQ7W,I,OAAjD,MAAO,CAAP,EAAOR,EAAAC,Q,OAnYTX,EAAAA,aAAAmlB,EAQAnlB,EAAAA,iBAAAgxB,EAWAhxB,EAAAA,4BAAA,SACEgB,EACAE,GAEA,IAAMgkB,EAAYC,EAAajkB,GAE3BuxB,EAAc,GAElB,GAAsB,YAAlBzxB,EAAKqC,SAEPovB,EADgBzxB,EACMwH,KAAKC,iBACtB,IAAsB,gBAAlBzH,EAAKqC,SAQd,MAAM,IAAI0N,EAAAQ,wBALRkhB,EAFEhO,EAAsBzjB,GACAA,EACM+jB,UAAUtc,aAE1Byc,C,CAMlB,OAAOuN,IAAgBvN,EAAY,MAAQ,IAC7C,EAEAllB,EAAAA,2BAAA,SACEgB,G,gGAEsB,YAAlBA,EAAKqC,SAAL,MACK,CAAP,EAAO,M,aACoB,gBAAlBrC,EAAKqC,SAAL,MACLohB,EAAsBzjB,GAEjB,CAAP,EADoBA,EACDyT,UAFjB,M,OAKK,SAAMuc,EADOhwB,EACsByT,W,OAA1C,MAAO,CAAP,EAAO/T,EAAAC,Q,0BAGT,MAAM,IAAIoQ,EAAAQ,wB,yBAIdvR,EAAAA,0BAAA,SACEgB,G,sGAEsB,YAAlBA,EAAKqC,SAAL,MAEK,CAAP,EADgBrC,EACD2J,SAAW,c,aACC,gBAAlB3J,EAAKqC,SAAL,MACLohB,EAAsBzjB,GAEjB,CAAP,GADMwjB,EAAcxjB,GACD2J,SAAW,cAF5B,M,OAMC,OAFG6Z,EAAcxjB,EAEjB,GAAMxB,EAAkBkzB,gBAAgBlO,EAAY7Z,U,OADvD,MAAO,CAAP,EACGjK,EAAAC,QACD,c,0BAIJ,MAAM,IAAIoQ,EAAAQ,wB,yBAIdvR,EAAAA,oCAAA,SACEgB,GAEA,GAAsB,YAAlBA,EAAKqC,SAAwB,MAAO,QACnC,GAAsB,gBAAlBrC,EAAKqC,SAA4B,MAAO,UAC5C,MAAM,IAAI0N,EAAAQ,uBACjB,EAEAvR,EAAAA,uBAAAkO,EAkBAlO,EAAAA,0BAAA,SACEgB,G,sGAEsB,YAAlBA,EAAKqC,SAAL,MACK,CAAP,EAAO,M,aACoB,gBAAlBrC,EAAKqC,SAAL,MACLohB,EAAsBzjB,GAEjB,CAAP,GADMwjB,EAAcxjB,GACD2xB,KAFjB,M,OAKW,OADPnO,EAAcxjB,EACP,GAAMxB,EAAkB0xB,aAAa1M,EAAYmO,M,OAC9D,MAAO,CAAP,EADajyB,EAAAC,QACE,IAAIL,M,yBAKzBN,EAAAA,sBAAAykB,EAKAzkB,EAAAA,UAAAgU,EAqHAhU,EAAAA,+BAAA,SACEgB,EACAE,G,8GAGKmY,OAAOC,QAAQsZ,aAAaC,eAAe,UAAW,OAAvD,MACa,GAAM7e,EAAUhT,EAAME,I,OAE9B,SAAM8W,EAFEtX,EAAAC,OAIbK,EAAKqC,SACLnC,I,OAHF,MAAO,CAAP,EAAOR,EAAAC,Q,OAOW,SAAMnB,EAAkBwyB,eAAehxB,I,OAE5B,OAFzB+U,EAAcrV,EAAAC,OAEW,GAAMmC,QAAQC,IAC3CgT,EACG9N,QACC,SAAC+N,GACC,OAAAA,EAAWuc,iBACTlZ,OAAO8Y,aAAaW,eAAeC,MACrC/c,EAAWuc,iBAAmBlZ,OAAO8Y,aAAaW,eAAeE,IAFjE,IAIH5nB,KAAI,SAAO4K,GAAU,OAAAid,EAAAva,OAAA,qB,4DAEF,O,sBAAA,GAAMlZ,EAAkB0zB,qBACtClyB,EACAgV,EAAWrP,K,OAGb,OALM6E,EAAU3I,EAAAlC,OAKT,CAAP,EAAO,CAAEqV,WAAUA,EAAExK,QAAOA,I,OAE5B,I,sBACmBsF,EAAAkB,kBAEf,gCADuC,QAAzCtR,EAACqB,EAAMsW,yBAAkC,IAAA3X,OAAA,EAAAA,EAAEqP,MAK3C,OAFA5P,QAAQC,IAAIH,EAAK,kCAAmC+V,GAE7C,CAAP,OAAO7T,GAGT,MAAMJ,E,oCAgCd,MAAO,CAAP,EA3D+BrB,EAAAC,OAiC5BsH,QAAO,SAACkrB,GAAS,OAAAA,aAAI,EAAJA,EAAM3nB,QAAQA,OAAd,IACjBJ,KAAI,SAAC+nB,GACJ,IAAMC,EACJD,EAAK3nB,QAAQ6nB,SACXha,OAAO8Y,aAAamB,wBAAwBC,KAC9CJ,EAAK3nB,QAAQ6nB,SACXha,OAAO8Y,aAAamB,wBAAwBE,UAC1CC,KAAKN,EAAK3nB,QAAQA,SAClB2nB,EAAK3nB,QAAQA,QAEnB,MAAO,CACL7E,GAAIwsB,EAAKnd,WAAWrP,GACpBoJ,KAAMojB,EAAKnd,WAAWjG,KACtBuiB,iBAAanwB,EACb8vB,aAAcmB,EACdld,KAAMid,EAAKnd,WAAWE,KACtBqc,eAAgB,EAChB5b,SAAUwc,EAAKnd,WAAWW,SAC1B6b,SACEW,EAAKnd,WAAWuc,iBAChBlZ,OAAO8Y,aAAaW,eAAeC,KAC/B,iBACA,iBAEV,K,QAKJ/yB,EAAAA,iCAAAgY,EAuDAhY,EAAAA,mBAAAiU,EAOAjU,EAAAA,qBAAA,SACEgB,EACAE,G,oGAEA,IAAKA,EACH,MAAO,CAAP,GAAO,GAGT,GAGI,IAFDA,EAAiBwyB,oBAChBra,OAAO8Y,aAAawB,oBAAoBC,UAIxC,IAFD1yB,EAAiBwyB,oBAChBra,OAAO8Y,aAAawB,oBAAoBE,SAG1C,MAAO,CAAP,GAAO,G,iBAOY,O,sBAHnB1zB,QAAQC,IAAIH,EAAK,wCAEXorB,EAAe,4BACF,GAAM7rB,EAAkB0S,yBAAyBlR,I,OAGpE,OAHMmR,EAAazR,EAAAC,QAERuJ,IAAImhB,EAAc,KAC7B,GAAM7rB,EAAkBiT,0BAA0BN,I,OAGlD,OAHAzR,EAAAC,OAEAwR,EAAW2hB,OAAOzI,GAClB,GAAM7rB,EAAkBiT,0BAA0BN,I,OAQlD,OARAzR,EAAAC,OAEAR,QAAQC,IACNH,EACA,yCACA,iDAGK,CAAP,GAAO,G,OASP,O,WAPAE,QAAQC,IACNH,EACA,yCACA,8DACAsC,GAGK,CAAP,GAAO,G,yBAIXvC,EAAAA,eAAA,SACEgB,EACAE,G,sGAEA,OAAK/B,EAAAoB,QAAO0B,kBAIRjB,EAAKqC,WAAagW,OAAO8Y,aAAa4B,SAASC,YAC1C,CAAP,GAAO,GAGM,GAAMhgB,EAAUhT,EAAME,IAP5B,CAAP,GAAO,G,OASiB,OAFpB6W,EAASlV,EAAAlC,OAEW,GAAMmC,QAAQC,IAAI,CAC1CkR,EAAmB8D,EAAQ7W,GAC3BgN,EAAuBlN,M,OAGR,OALXN,EAAoBmC,EAAAlC,OAAnBuT,EAAIxT,EAAA,GAAE0gB,EAAS1gB,EAAA,GAKL,IAAM,EAAAmwB,EAAAoD,sBAAqB,CAC1C7f,WAAYF,EAAKC,IACjBE,oBAAqBH,EAAKI,aAC1B4f,WAAW,EAAAv0B,EAAA+L,mBAAkB0V,M,OAG/B,MAAO,CAAP,EANiBve,EAAAlC,OAMDgL,c,QAGlB3L,EAAAA,cAAA,SAA8B+X,GAC5B,MAAoD,eAAhDsB,OAAOC,QAAQC,QAAQ4a,YAAYC,SAE9Brc,EAGAsB,OAAOC,QAAQC,QAAQ8a,gBAC5Btc,EACAsB,OAAO8Y,aAAaC,YAAYC,KAGtC,C,sFCjfAryB,EAAAA,MAAA,SAAsBs0B,GACpB,OAAO,IAAIxxB,SAAc,SAACwpB,GACxBiI,YAAW,WACTjI,GACF,GAAGgI,EACL,GACF,C,qvFCJA,IAAAn1B,EAAAC,EAAAL,EAAA,OACAM,EAAAD,EAAAL,EAAA,QACA4Z,EAAA1Z,EAAAF,EAAA,QAOAQ,EAAAR,EAAA,OACAS,EAAAP,EAAAF,EAAA,QACAW,EAAAT,EAAAF,EAAA,QAEMkB,EAAM,SAwEZ,SAAgBu0B,EAA2BlmB,GACzC,IAAImmB,EAA6B,GAE7Ble,EAAQ,EACZjI,EAAanK,SAAQ,SAAC6E,GACpByrB,GAA8BC,EAAcne,IAASvN,GAAa,EACpE,KAEA,EAAA3J,EAAAkB,SAAE,kBAAkBya,KAAKyZ,GAErBnmB,EAAajJ,OAAS,IACxB,EAAAhG,EAAAkB,SAAE,sBAAsBuS,QACxB,EAAAzT,EAAAkB,SAAE,iBAAiBuS,UAEnB,EAAAzT,EAAAkB,SAAE,sBAAsBoX,QACxB,EAAAtY,EAAAkB,SAAE,iBAAiBoX,OAEvB,CAEA,SAAgBgd,EAAoBrmB,GAClC,IAAImmB,EAA6B,GAE7Ble,EAAQ,EACZjI,EAAanK,SAAQ,SAAC6E,GACpByrB,GAA8BC,EAAcne,IAASvN,GAAa,EACpE,KAEA,EAAA3J,EAAAkB,SAAE,kBAAkBya,KAAKyZ,GAErBnmB,EAAajJ,OAAS,GACxB,EAAAhG,EAAAkB,SAAE,iBAAiBuS,QAEnB,EAAAzT,EAAAkB,SAAE,iBAAiBoX,MAEvB,CAEA,SAAS+c,EACPne,EACAvN,EACA4rB,GAEA,IAAI5Z,EACF,2EA6HF,OA1HI4Z,IACF5Z,GACE,0HAGAzE,EACA,4CACAA,EACA,iBACAA,EACA,wBAGJyE,EACE,uRAMAzE,EACA,4BACAA,EACA,8BACAA,EACA,iVAUAvN,EAAYhB,MACZ,+QAOAgB,EAAY0c,UACZ,qBACAnP,EACA,uBACAA,EACA,uTASAvN,EAAY2c,SACZ,qBACApP,EACA,uBACAA,EA/CA,wUA0DAA,EACA,qBACAA,EACA,+UASAvN,EAAYuc,SACZ,oBACAhP,EACA,sBACAA,EA1EA,oUAqFAA,EACA,qBACAA,EAvFA,uTAkGAA,EACA,wBACAA,EACA,qFAQJ,CA4JA,SAASse,EAAoBluB,EAAYoJ,GACvC,IAAIiL,GAAO,EAAA3b,EAAAkB,SAAEoG,GAAIqU,OACjBA,EAAOA,EAAK2S,QAAQ,YAAa5d,IACjC,EAAA1Q,EAAAkB,SAAEoG,GAAIqU,KAAKA,EACb,CA8OA,SAAS8Z,EAAqBnuB,GAC5B,IAAM6T,GAAQ,EAAAnb,EAAAkB,SAAEoG,GAAIhE,MACpB,OAAI6X,EACKA,EAAM/E,WAEN,IAEX,CAQA,SAAgB+J,KACd,EAAAngB,EAAAkB,SAAE,iBAAiBoX,MACrB,CA9oBA3X,EAAAA,qBAAA,YACE,EAAAX,EAAAkB,SAAE,uBAAuBuS,MAC3B,EAEA9S,EAAAA,iBAAA,YACE,EAAAX,EAAAkB,SAAE,mBAAmBuS,MACvB,EAEA9S,EAAAA,4BAAA,YACE,EAAAX,EAAAkB,SAAE,oCAAoCuS,MACxC,EAEA9S,EAAAA,mCAAA,YACE,EAAAX,EAAAkB,SAAE,6CAA6CuS,MACjD,EAEA9S,EAAAA,4BAAA,SAAkDgB,G,sGACvB,SAAMxB,EAAkByB,oBAAoBD,I,OACzC,OADtBE,EAAmBR,EAAAC,OACG,IAAM,EAAApB,EAAAyD,wBAChChC,EACAE,I,cAFIgC,EAAsBxC,EAAAC,OAKtBo0B,EAAQ7xB,EAAoBkI,KAAI,SAAC4pB,GAAM,OAAAA,EAAEzP,QAAF,IAAYxC,KAAK,SACxDkS,EAAS/xB,EAAoBkI,KAAI,SAAC4pB,GAAM,OAAAA,EAAEhtB,KAAF,IAAS+a,KAAK,SAkT9D,SAAgC/hB,GAC9B,GAAsB,gBAAlBA,EAAKqC,SAA4B,CACnC,IAYI6xB,GAAU,EAAA71B,EAAAkB,SAAE,qBAAqB40B,KAAK,SACtCD,IACFA,EAAUA,EAAQvH,QAAQ,QAAS,WAErC,EAAAtuB,EAAAkB,SAAE,qBAAqB40B,KAAK,QAASD,IAErC,EAAA71B,EAAAkB,SAAE,2BAA2BoX,OAlBd,CACb,cAEA,oBACA,oBAEA,qBACA,sBAEA,4BAWKxT,SAAQ,SAACixB,GAAM,OAIKzuB,EAJiByuB,GAK1CC,GAAe,EAAAh2B,EAAAkB,SAAEoG,GAAIqU,UAGvBqa,GADAA,EAAeA,EAAa1H,QAAQ,QAAS,UACjBA,QAAQ,QAAS,eAE/C,EAAAtuB,EAAAkB,SAAEoG,GAAIqU,KAAKqa,GANb,IAA+B1uB,EACzB0uB,CALoB,G,CAE1B,CAxUEC,CAAuBt0B,GAGpB7B,EAAAoB,QAAO0B,mBACU,gBAAlBjB,EAAKqC,WACLnC,KAEA,EAAA7B,EAAAkB,SAAE,gBAAgBoX,QAClB,EAAAtY,EAAAkB,SAAE,qBAAqBoX,QACvB,EAAAtY,EAAAkB,SAAE,gBAAgBg1B,WAAW,YAE7B,EAAAl2B,EAAAkB,SAAE,gBAAgB40B,KAAK,UAAW,WAClCz1B,EAAaid,aAAY,KAG3B,EAAAtd,EAAAkB,SAAE,gBAAgBuS,QAElB,EAAAzT,EAAAkB,SAAE,YAAYya,KAAK+Z,IACnB,EAAA11B,EAAAkB,SAAE,kBAAkBya,KAAKia,G,YAG3Bj1B,EAAAA,qBAAA,SACEkD,EACAC,EACAE,GAEA,GAAiB,gBAAbA,GACF,EAAAhE,EAAAkB,SAAE,+BAA+BoX,QACjC,EAAAtY,EAAAkB,SAAE,wBAAwBoX,QAC1B,EAAAtY,EAAAkB,SAAE,6BAA6BoX,QAC/B,EAAAtY,EAAAkB,SAAE,sBAAsBuS,QACxB,EAAAzT,EAAAkB,SAAE,sBAAsBya,KAAK,iBAC7B2Z,EAAoBzxB,IACpB,EAAA7D,EAAAkB,SAAE,+CAA+CoC,IAAI,WAChD,CACL,IAAM6yB,EAAqBtyB,EAAoB,IAC/C,EAAA7D,EAAAkB,SAAE,cAAcoC,IAAI6yB,EAAmBxtB,QACvC,EAAA3I,EAAAkB,SAAE,cAAcoC,IAAI6yB,EAAmBjQ,WACvC,EAAAlmB,EAAAkB,SAAE,oBAAoBoC,IAAI6yB,EAAmB9P,YAC7C,EAAArmB,EAAAkB,SAAE,oBAAoBoC,IAAI6yB,EAAmB7P,UAE7C6O,EAA2BrxB,E,CAE/B,EAEAnD,EAAAA,2BAAAw0B,EAmBAx0B,EAAAA,oBAAA20B,EAuJA30B,EAAAA,sBAAA,WACE,IAAMsO,EAAe0T,QACfyT,EAAYX,EAAqB,cACjCY,EAAUZ,EAAqB,aAC/Ba,GAA0C,uBAkZnC,EAAAt2B,EAAAkB,SAlZmC,uBAkZ7BwgB,QAAQ,QAEf3V,KAAI,SAACoP,GAAU,OAAAA,EAAM7T,EAAN,KAnZrBivB,EAAkBd,EAAqB,2BACzCe,EAAUf,EAAqB,aACZ,cAAnBc,IACFC,EAAUf,EAAqB,eAEjC,IAAMgB,EAAQhB,EAAqB,oBAC7BiB,EAAQjB,EAAqB,oBAC7BkB,EAAalB,EAAqB,gBAElCU,EAAkC,CACtC7wB,QAAIxC,EACJ+gB,gBAAiB0S,EACjBhmB,UAA8B,cAAnBgmB,EAAkCC,EAAUC,EACvDhmB,SAAUimB,EACV3sB,MAAOqsB,EACPQ,gBAAiBN,EACjBO,cAAe,CACb,CACEC,KAAyB,cAAnBP,EAAkC,GAAKC,EAC7CO,SAA6B,cAAnBR,EAAkC,GAAKF,IAGrDW,kBAAcl0B,EACdm0B,qBAAiBn0B,GA0DnB,MAxDuB,cAAnByzB,EACFJ,EAAmBc,gBAAkBN,EAErCR,EAAmBa,aAAeL,EAGhCR,EAAmBpsB,OACrBkF,EAAa7J,KAAK+wB,GAG0C,QAA1D,EAAAn2B,EAAAkB,SAAE,+CAA+CoC,QACnD,EAAAtD,EAAAkB,SAAE,0BAA0BkC,MAAK,WAC/B,IAAM8zB,GAAe,EAAAl3B,EAAAkB,SAAEmC,MAAMoC,KAAK,aAClC,KAAIyxB,EAAalxB,OAAS,IAAMkxB,EAAa3zB,KAAK,WAAlD,CAIA,IACI4zB,EADEC,GAAc,EAAAp3B,EAAAkB,SAAEmC,MAAMoC,KAAK,iBAAiBkW,OAGhDwb,EADgD,eAA9C,EAAAn3B,EAAAkB,SAAEmC,MAAMoC,KAAK,wBAAwBnC,OAC3B,EAAAtD,EAAAkB,SAAEmC,MAAMoC,KAAK,eAAenC,MAAM8S,YAElC,EAAApW,EAAAkB,SAAEmC,MAAMoC,KAAK,gBAAgBnC,MAAM8S,WAEjD,IAAMihB,GAAY,EAAAr3B,EAAAkB,SAAEmC,MAAMoC,KAAK,eAAenC,MAAM8S,WAC9CkhB,GAAe,EAAAt3B,EAAAkB,SAAEmC,MAAMoC,KAAK,kBAAkBnC,MAAM8S,WACpDmhB,GAAoB,EAAAv3B,EAAAkB,SAAEmC,MACzBoC,KAAK,wBACLnC,MACA8S,WACGohB,GAAU,EAAAx3B,EAAAkB,SAAEmC,MAAMoC,KAAK,iBAAiBnC,MAAM8S,WAE9CqhB,EAAqC,CACzCnyB,QAAIxC,EACJ+gB,gBAAiB0T,EACjBhnB,UAAgC,cAArBgnB,EAAoCJ,EAAYK,EAC3D/mB,UALc,EAAAzQ,EAAAkB,SAAEmC,MAAMoC,KAAK,iBAAiBnC,MAAM8S,WAMlDrM,MAAOqtB,EACPR,gBAAiBN,EACjBO,cAAe,CACb,CACEC,KAA2B,cAArBS,EAAoC,GAAKJ,EAC/CJ,SAA+B,cAArBQ,EAAoC,GAAKF,IAGvDL,kBAAcl0B,EACdm0B,qBAAiBn0B,GAEM,cAArBy0B,EACFE,EAAsBR,gBAAkBK,EAExCG,EAAsBT,aAAeM,EAEvCroB,EAAa7J,KAAKqyB,E,CACpB,IAEKxoB,CACT,EAqCAtO,EAAAA,QAAA,SAAwBgpB,EAAc5O,IACpC,EAAA/a,EAAAkB,SAAE,gBAAgB40B,KAAK,QAAS/a,IAChC,EAAA/a,EAAAkB,SAAE,gBAAgB40B,KAAK,MAAOnM,EAChC,EAEAhpB,EAAAA,WAAA,SAA2B+P,GAEzB,IADA,IACiB5K,EAAA,EAAA4xB,EADA,CAAC,cAAe,4BAChB5xB,EAAA4xB,EAAA1xB,OAAAF,IACf0vB,EADWkC,EAAA5xB,GACa4K,EAE5B,EAEA/P,EAAAA,gBAAA,SAAgC+hB,IAE9B,EAAA1iB,EAAAkB,SADW,2BACL40B,KAAK,OAAQpT,EACrB,EAEA/hB,EAAAA,WAAA,SACEqgB,EACAnL,GAEImL,GAAqB,EAAAhhB,EAAAkB,SAAE,2BAA2BuS,QACjD,EAAAzT,EAAAkB,SAAE,2BAA2BoX,OAE9BzC,GAA8B,EAAA7V,EAAAkB,SAAE,yBAAyBuS,QAE3D,EAAAzT,EAAAkB,SAAE,yBAAyBoX,MAE/B,EAQA3X,EAAAA,cAAA,SACEg3B,EACAC,EACAC,QAAA,IAAAA,IAAAA,GAAA,GAEA,IAAIlc,EAAO,GACPkc,IACFlc,EAAO,2CAGTgc,EAAQ7yB,SAAQ,SAAUnD,GACxBga,GAAQ,kBAAoBha,EAAKmU,MAAQ,KAAOnU,EAAK0M,KAAO,WAC9D,KAEA,EAAArO,EAAAkB,SAAE02B,GAAUjc,KAAKA,GAEL,IAARA,GACF,EAAA3b,EAAAkB,SAAE02B,EAAStJ,QAAQ,IAAK,KAAO,SAAShW,QAExC,EAAAtY,EAAAkB,SAAE02B,EAAStJ,QAAQ,IAAK,KAAO,SAAS7a,MAE5C,EAEA9S,EAAAA,YAAA,SAA4BugB,GAC1B,IAAM4W,GAAe,EAAA93B,EAAAkB,SAAE,wBAEjB6D,EAAS1E,EAAa4H,YAExB8vB,GAAW,EACXJ,EAAU,GACdzW,EAAQpc,SAAQ,SAAUnD,GACpBoD,GAAUpD,EAAKq2B,SACjBD,GAAW,EACXJ,GACE,kBACAh2B,EAAKq2B,QACL,cACAr2B,EAAKs2B,MACL,aAEFN,GACE,kBAAoBh2B,EAAKq2B,QAAU,KAAOr2B,EAAKs2B,MAAQ,WAE7D,IAEKF,IACHJ,EACE,4DAA8DA,GAGlEG,EAAanc,KAAKgc,EACpB,EAEAh3B,EAAAA,gBAAA,SAAgCyJ,EAAiB+F,GAK/C,IAJA,EAAAnQ,EAAAkB,SAAE,WAAWoX,QAEb,EAAAtY,EAAAkB,SAAE,2BAA2BoX,OAEzBnI,EAAO,CACT,IAAI+nB,EAGFA,EAFE/nB,aAAiB+f,MAEJ/f,EAAMgoB,MAENtwB,KAAKC,UAAUqI,IAGhC,EAAAnQ,EAAAkB,SAAE,2BAA2Bya,KAAK,QAAUuc,IAE5C,EAAAl4B,EAAAkB,SAAE,uBAAuBuS,M,MAEzB,EAAAzT,EAAAkB,SAAE,uBAAuBoX,QAE3B,EAAAtY,EAAAkB,SAAE,mBAAmBya,KAAKvR,IAE1B,EAAApK,EAAAkB,SAAE,iBAAiBuS,MACrB,EAEA9S,EAAAA,eAAA,SAA+ByJ,IAC7B,EAAApK,EAAAkB,SAAE,WAAWoX,QACb,EAAAtY,EAAAkB,SAAE,kBAAkBya,KAAKvR,IACzB,EAAApK,EAAAkB,SAAE,gBAAgBuS,MACpB,EAEA9S,EAAAA,eAAA,YACE,EAAAX,EAAAkB,SAAE,gBAAgBoX,MACpB,EAEA3X,EAAAA,oBAAA,SAAoCyJ,IAClC,EAAApK,EAAAkB,SAAE,WAAWoX,QACb,EAAAtY,EAAAkB,SAAE,wBAAwBya,KAAKvR,IAC/B,EAAApK,EAAAkB,SAAE,sBAAsBuS,MAC1B,EAEA9S,EAAAA,wBAAA,YACE,EAAAX,EAAAkB,SAAE,WAAWoX,QACb,EAAAtY,EAAAkB,SAAE,0BAA0BuS,MAC9B,EAEA9S,EAAAA,eAAA,SACEgE,EACAN,EACAK,GAEA,IAAI0zB,EAAe,GACfzzB,EAAQqB,OAAS,IACnBoyB,EAAe,6DAEb/zB,IACF+zB,EAAe,qDAEjB,IAAK,IAAIlhB,EAAQ,EAAGA,EAAQvS,EAAQqB,OAAQkR,IAC1CkhB,GACE,kBACAzzB,EAAQuS,GAAO5R,GADf,KAIAX,EAAQuS,GAAOmhB,WACf,YAGJ,IADA,EAAAr4B,EAAAkB,SAAE,gBAAgBya,KAAKyc,GACnB/zB,GACF,EAAArE,EAAAkB,SAAE,gBAAgBoC,IAAIe,EAAwBgB,UAAUyO,QAAQ,UAC5DpP,IACF,EAAA1E,EAAAkB,SAAE,oBACCoC,IAAIe,EAAwBkB,gBAC5BuO,QAAQ,WAEb,EAAA9T,EAAAkB,SAAE,iBAAiBoC,IAAIe,EAAwBmB,WAAWsO,QAAQ,cAC7D,CACL,IAAMwkB,GAAgB,EAAAt4B,EAAAkB,SAAE,gBAAgBuE,KAAK,WAG3C6yB,EAActyB,OAAS,EAAIsyB,EAAc,GAAKA,EAAc,IAEhDC,aAAa,WAAY,SACvC,EAAAv4B,EAAAkB,SAAE,gBAAgB4S,QAAQ,S,CAQ5B,IALA,EAAA9T,EAAAkB,SAAE,gBAAgBuS,QAClB,EAAAzT,EAAAkB,SAAE,0BAA0BuS,QAC5B,EAAAzT,EAAAkB,SAAE,iBAAiBuS,OAGG,GAAlB9O,EAAQqB,OAAa,EACvB,EAAAhG,EAAAkB,SAAE,gBAAgBoX,OAClB,IAAMvT,EAASJ,EAAQ,GAEvB,GAAID,EAAuB,CACzB,IAAM8zB,EAA+BzzB,EAAOC,cAAc4D,QACxD,SAACogB,GAAM,OAAAA,EAAE9jB,UAAY8jB,EAAE9jB,SAASc,MAAzB,IAGT,GAA2C,GAAvCwyB,EAA6BxyB,OAAa,CAC5C,IAAMG,EAAQqyB,EAA6B,GACtCn0B,IACH,EAAArE,EAAAkB,SAAE,oBAAoBoC,IAAI6C,EAAMb,IAAIwO,QAAQ,WAE9C,EAAA9T,EAAAkB,SAAE,0BAA0BoX,OAGC,GAAzBnS,EAAMjB,SAASc,QAAgB3B,KACjC,EAAArE,EAAAkB,SAAE,iBAAiBoX,QACnB,EAAAtY,EAAAkB,SAAE,iBAAiBoC,IAAI6C,EAAMjB,SAAS,GAAGI,IAAIwO,QAAQ,U,OAIzD,EAAA9T,EAAAkB,SAAE,0BAA0BoX,OAEE,GAA1BvT,EAAOG,SAASc,QAAgB3B,KAClC,EAAArE,EAAAkB,SAAE,iBAAiBoX,QACnB,EAAAtY,EAAAkB,SAAE,iBAAiBoC,IAAIyB,EAAOG,SAAS,GAAGI,IAAIwO,QAAQ,U,CAI9D,EAEAnT,EAAAA,cAAA,WACEG,QAAQC,IAAIH,EAAK,uBACjB,IAAMqE,GAAe,EAAAjF,EAAAkB,SAAE,oBAAoBoC,MACrC6B,GAAU,EAAAnF,EAAAkB,SAAE,iBAAiBoC,MAC/B0Q,GAAa,EACbiC,GAAa,EAMjB,MALsC,cAAlC,EAAAjW,EAAAkB,SAAE,uBAAuBoC,QAC3B0Q,IAAa,EAAAhU,EAAAkB,SAAE,yBAAyBoC,MACxC2S,IAAa,EAAAjW,EAAAkB,SAAE,qBAAqBoC,OAInB,MAAhB2B,GAAwC,IAAhBA,IACzBqU,EAAI5U,sBAMgB,MAAXS,GAA8B,IAAXA,IAC5B,EAAAnF,EAAAkB,SAAE,wBAAwBya,KAAK,KAC/B,EAAA3b,EAAAkB,SAAE,kBAAkBya,KAAK,0BACzB,EAAA3b,EAAAkB,SAAE,iBAAiB0b,QACnB9b,QAAQC,IAAIH,EAAK,mCACV,GACEd,EAAAoB,QAAO8f,qBAAuB/K,IACvC,EAAAjW,EAAAkB,SAAE,2BAA2Bya,KAAK,4BAClC,EAAA3b,EAAAkB,SAAE,qBAAqB0b,QACvB9b,QAAQC,IAAIH,EAAK,4CACV,GACEd,EAAAoB,QAAO8f,qBAAuBhN,IACvC,EAAAhU,EAAAkB,SAAE,+BAA+Bya,KAAK,uCACtC,EAAA3b,EAAAkB,SAAE,yBAAyB0b,QAC3B9b,QAAQC,IAAIH,EAAK,gDACV,KAEP,EAAAZ,EAAAkB,SAAE,wBAAwBya,KAAK,KAC/B,EAAA3b,EAAAkB,SAAE,kBAAkBya,KAAK,KACzB,EAAA3b,EAAAkB,SAAE,2BAA2Bya,KAAK,KAClC,EAAA3b,EAAAkB,SAAE,+BAA+Bya,KAAK,IACtC7a,QAAQC,IAAIH,EAAK,sBACV,KA1BP,EAAAZ,EAAAkB,SAAE,wBAAwBya,KAAK,gCAC/B,EAAA3b,EAAAkB,SAAE,oBAAoB0b,QACtB9b,QAAQC,IAAIH,EAAK,yCACV,EAyBX,EAEAD,EAAAA,UAAA,YACE,EAAAX,EAAAkB,SAAE,eAAeoX,QAEjB,EAAAtY,EAAAkB,SAAE,oCAAoCoX,QACtC,EAAAtY,EAAAkB,SAAE,mBAAmBoX,QACrB,EAAAtY,EAAAkB,SAAE,uBAAuBoX,QAEzB,EAAAtY,EAAAkB,SAAE,eAAeoX,QACjB,EAAAtY,EAAAkB,SAAE,gBAAgBoX,OAClB6H,KACA,EAAAngB,EAAAkB,SAAE,iBAAiBoX,QACnB,EAAAtY,EAAAkB,SAAE,4BAA4BoX,MAChC,EAiBA3X,EAAAA,wBAAAwf,EAIAxf,EAAAA,yBAAA,YACE,EAAAX,EAAAkB,SAAE,oBAAoBuS,MACxB,EAEA9S,EAAAA,yBAAA,YACE,EAAAX,EAAAkB,SAAE,oBAAoBoX,MACxB,EAEA3X,EAAAA,yBAAA,YACE,EAAAX,EAAAkB,SAAE,4BAA4BuS,MAChC,C,8WC1qBA,IAAA3T,EAAAC,EAAAL,EAAA,OAEAiB,EAAAA,UAAA,WACE,OAAO6F,aAAaiyB,QAAQ34B,EAAAoB,QAAO+R,UAAPnT,sBAC9B,EAEAa,EAAAA,UAAA,SAA0Bwa,GACxB3U,aAAakyB,QAAQ54B,EAAAoB,QAAO+R,UAAPnT,sBAA+Cqb,EACtE,EAEAxa,EAAAA,cAAA,SAA8Bwa,GAC5B3U,aAAakyB,QAAQ54B,EAAAoB,QAAO+R,UAAPnT,cAAuCqb,EAC9D,EAEAxa,EAAAA,cAAA,WACE,OAAO6F,aAAaiyB,QAAQ34B,EAAAoB,QAAO+R,UAAPnT,cAC9B,EAEAa,EAAAA,WAAA,SAA2Bwa,GACpBA,EAGH3U,aAAakyB,QAAQ54B,EAAAoB,QAAO+R,UAAPnT,cAAuCqb,GAF5D3U,aAAamyB,WAAW74B,EAAAoB,QAAO+R,UAAPnT,cAI5B,EAEAa,EAAAA,WAAA,WACE,OAAO6F,aAAaiyB,QAAQ34B,EAAAoB,QAAO+R,UAAPnT,cAC9B,EAEAa,EAAAA,SAAA,SAAyBwa,GACvB3U,aAAakyB,QAAQ54B,EAAAoB,QAAO+R,UAAPnT,SAAkCqb,EACzD,EAEAxa,EAAAA,SAAA,WACE,OAAO6F,aAAaiyB,QAAQ34B,EAAAoB,QAAO+R,UAAPnT,SAC9B,EAEAa,EAAAA,eAAA,SAA+Bwa,GAC7B3U,aAAakyB,QAAQ54B,EAAAoB,QAAO+R,UAAPnT,gBAAyCqb,EAChE,EAEAxa,EAAAA,eAAA,WACE,OAAO6F,aAAaiyB,QAAQ34B,EAAAoB,QAAO+R,UAAPnT,gBAC9B,EAEAa,EAAAA,gBAAA,SAAgCwa,GAC9B3U,aAAakyB,QAAQ54B,EAAAoB,QAAO+R,UAAPnT,iBAA0Cqb,EACjE,EAEAxa,EAAAA,gBAAA,WACE,OAAO6F,aAAaiyB,QAAQ34B,EAAAoB,QAAO+R,UAAPnT,iBAC9B,EAEAa,EAAAA,YAAA,SAA4Bwa,GAC1B3U,aAAakyB,QAAQ54B,EAAAoB,QAAO+R,UAAPnT,YAAqC84B,OAAOzd,GACnE,EAEAxa,EAAAA,YAAA,WAEE,MAAiB,SADH6F,aAAaiyB,QAAQ34B,EAAAoB,QAAO+R,UAAPnT,YAErC,C,wBC7DAJ,EAAA,M,GCCIm5B,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBj2B,IAAjBk2B,EACH,OAAOA,EAAar4B,QAGrB,IAAIs4B,EAASJ,EAAyBE,GAAY,CAGjDp4B,QAAS,CAAC,GAOX,OAHAu4B,EAAoBH,GAAUlgB,KAAKogB,EAAOt4B,QAASs4B,EAAQA,EAAOt4B,QAASm4B,GAGpEG,EAAOt4B,OACf,CAGAm4B,EAAoBjwB,EAAIqwB,EzCzBpBh6B,EAAW,GACf45B,EAAoBK,EAAI,SAAS/J,EAAQgK,EAAUC,EAAIljB,GACtD,IAAGijB,EAAH,CAMA,IAAIE,EAAeC,IACnB,IAAS9S,EAAI,EAAGA,EAAIvnB,EAAS8G,OAAQygB,IAAK,CACrC2S,EAAWl6B,EAASunB,GAAG,GACvB4S,EAAKn6B,EAASunB,GAAG,GACjBtQ,EAAWjX,EAASunB,GAAG,GAE3B,IAJA,IAGI+S,GAAY,EACPzb,EAAI,EAAGA,EAAIqb,EAASpzB,OAAQ+X,MACpB,EAAX5H,GAAsBmjB,GAAgBnjB,IAAarG,OAAO8f,KAAKkJ,EAAoBK,GAAG7pB,OAAM,SAAS4S,GAAO,OAAO4W,EAAoBK,EAAEjX,GAAKkX,EAASrb,GAAK,IAChKqb,EAAShiB,OAAO2G,IAAK,IAErByb,GAAY,EACTrjB,EAAWmjB,IAAcA,EAAenjB,IAG7C,GAAGqjB,EAAW,CACbt6B,EAASkY,OAAOqP,IAAK,GACrB,IAAInd,EAAI+vB,SACEv2B,IAANwG,IAAiB8lB,EAAS9lB,EAC/B,CACD,CACA,OAAO8lB,CArBP,CAJCjZ,EAAWA,GAAY,EACvB,IAAI,IAAIsQ,EAAIvnB,EAAS8G,OAAQygB,EAAI,GAAKvnB,EAASunB,EAAI,GAAG,GAAKtQ,EAAUsQ,IAAKvnB,EAASunB,GAAKvnB,EAASunB,EAAI,GACrGvnB,EAASunB,GAAK,CAAC2S,EAAUC,EAAIljB,EAwB/B,E0C5BA2iB,EAAoBhW,EAAI,SAASniB,EAAS84B,GACzC,IAAI,IAAIvX,KAAOuX,EACXX,EAAoBY,EAAED,EAAYvX,KAAS4W,EAAoBY,EAAE/4B,EAASuhB,IAC5EpS,OAAO+R,eAAelhB,EAASuhB,EAAK,CAAEyX,YAAY,EAAM3mB,IAAKymB,EAAWvX,IAG3E,ECPA4W,EAAoB9P,EAAI,WACvB,GAA0B,iBAAf4Q,WAAyB,OAAOA,WAC3C,IACC,OAAOv2B,MAAQ,IAAIw2B,SAAS,cAAb,EAChB,CAAE,MAAOxc,GACR,GAAsB,iBAAXta,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxB+1B,EAAoBY,EAAI,SAASI,EAAKv2B,GAAQ,OAAOuM,OAAOgS,UAAUK,eAAetJ,KAAKihB,EAAKv2B,EAAO,ECCtGu1B,EAAoBxvB,EAAI,SAAS3I,GACX,oBAAXo5B,QAA0BA,OAAOC,aAC1ClqB,OAAO+R,eAAelhB,EAASo5B,OAAOC,YAAa,CAAE7e,MAAO,WAE7DrL,OAAO+R,eAAelhB,EAAS,aAAc,CAAEwa,OAAO,GACvD,E,WCDA,IAAI8e,EAAkB,CACrB,IAAK,GAaNnB,EAAoBK,EAAEpb,EAAI,SAASmc,GAAW,OAAoC,IAA7BD,EAAgBC,EAAgB,EAGrF,IAAIC,EAAuB,SAASC,EAA4B9M,GAC/D,IAKIyL,EAAUmB,EALVd,EAAW9L,EAAK,GAChB+M,EAAc/M,EAAK,GACnBgN,EAAUhN,EAAK,GAGI7G,EAAI,EAC3B,GAAG2S,EAASmB,MAAK,SAASjzB,GAAM,OAA+B,IAAxB2yB,EAAgB3yB,EAAW,IAAI,CACrE,IAAIyxB,KAAYsB,EACZvB,EAAoBY,EAAEW,EAAatB,KACrCD,EAAoBjwB,EAAEkwB,GAAYsB,EAAYtB,IAGhD,GAAGuB,EAAS,IAAIlL,EAASkL,EAAQxB,EAClC,CAEA,IADGsB,GAA4BA,EAA2B9M,GACrD7G,EAAI2S,EAASpzB,OAAQygB,IACzByT,EAAUd,EAAS3S,GAChBqS,EAAoBY,EAAEO,EAAiBC,IAAYD,EAAgBC,IACrED,EAAgBC,GAAS,KAE1BD,EAAgBC,GAAW,EAE5B,OAAOpB,EAAoBK,EAAE/J,EAC9B,EAEIoL,EAAqBC,KAAoC,8BAAIA,KAAoC,+BAAK,GAC1GD,EAAmB11B,QAAQq1B,EAAqBO,KAAK,KAAM,IAC3DF,EAAmBp1B,KAAO+0B,EAAqBO,KAAK,KAAMF,EAAmBp1B,KAAKs1B,KAAKF,G,IC/CvF,IAAIG,EAAsB7B,EAAoBK,OAAEr2B,EAAW,CAAC,IAAI,IAAI,IAAI,MAAM,WAAa,OAAOg2B,EAAoB,MAAQ,IAC9H6B,EAAsB7B,EAAoBK,EAAEwB,E","sources":["webpack://addon-stakeholder/webpack/runtime/chunk loaded","webpack://addon-stakeholder/./projects/common/src/app/app.ts","webpack://addon-stakeholder/./projects/common/src/app/autosave.ts","webpack://addon-stakeholder/./projects/common/src/app/contacts.ts","webpack://addon-stakeholder/./projects/common/src/app/errorHandler.ts","webpack://addon-stakeholder/./projects/common/src/app/item-properties.ts","webpack://addon-stakeholder/./projects/common/src/app/options.ts","webpack://addon-stakeholder/./projects/common/src/app/save.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/application/ApiException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/application/ApplicationException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/application/ItemIsNotSavedException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/application/MeetingAlreadySavedException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/http/AuthException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/http/AuthInvalidGrantException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/http/ConnectionException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/http/ForbiddenException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/http/InternalServerException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/http/UnknownHttpException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/outlook/OutlookApiException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/outlook/OutlookException.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/outlook/OutlookItemNotSupported.ts","webpack://addon-stakeholder/./projects/common/src/exceptions/outlook/OutlookWrongItemSelectedException.ts","webpack://addon-stakeholder/./projects/common/src/index.ts","webpack://addon-stakeholder/./projects/common/src/models/CommunicationTemplate.ts","webpack://addon-stakeholder/./projects/common/src/models/ContactCustomFields.ts","webpack://addon-stakeholder/./projects/common/src/utils/api.ts","webpack://addon-stakeholder/./projects/common/src/utils/authUtils.ts","webpack://addon-stakeholder/./projects/common/src/utils/contactUtils.ts","webpack://addon-stakeholder/./projects/common/src/utils/dateUtils.ts","webpack://addon-stakeholder/./projects/common/src/utils/graphApi.ts","webpack://addon-stakeholder/./projects/common/src/utils/graphItemUtils.ts","webpack://addon-stakeholder/./projects/common/src/utils/http.ts","webpack://addon-stakeholder/./projects/common/src/utils/office-js-helpers/Authenticator.ts","webpack://addon-stakeholder/./projects/common/src/utils/office-js-helpers/endpoint.ts","webpack://addon-stakeholder/./projects/common/src/utils/office-js-helpers/generateCryptoSafeRandom.ts","webpack://addon-stakeholder/./projects/common/src/utils/outlookAsyncUtils.ts","webpack://addon-stakeholder/./projects/common/src/utils/outlookItemUtils.ts","webpack://addon-stakeholder/./projects/common/src/utils/sleep.ts","webpack://addon-stakeholder/./projects/common/src/utils/uiUtils.ts","webpack://addon-stakeholder/./projects/common/src/utils/user-settings.ts","webpack://addon-stakeholder/./projects/darzin/src/index.ts","webpack://addon-stakeholder/webpack/bootstrap","webpack://addon-stakeholder/webpack/runtime/define property getters","webpack://addon-stakeholder/webpack/runtime/global","webpack://addon-stakeholder/webpack/runtime/hasOwnProperty shorthand","webpack://addon-stakeholder/webpack/runtime/make namespace object","webpack://addon-stakeholder/webpack/runtime/jsonp chunk loading","webpack://addon-stakeholder/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import { OutlookWrongItemSelectedException } from 'common/exceptions/outlook/OutlookWrongItemSelectedException';\nimport * as OutlookItemUtils from 'common/utils/outlookItemUtils';\nimport { sleep } from 'common/utils/sleep';\nimport { SupportedOfficeItem } from 'common/utils/SupportedOfficeItem';\nimport CONFIG from 'config';\nimport $ from 'jquery';\nimport { DomainDetails } from '../models/DomainDetails';\nimport { GetDomainListResponse } from '../models/GetDomainListResponse';\nimport { ProjectInfo } from '../models/ProjectInfo';\nimport * as Api from '../utils/api';\nimport {\n getAdditionalStakeholders,\n getPrimaryStakeholders,\n} from '../utils/contactUtils';\nimport * as OutlookAsyncUtils from '../utils/outlookAsyncUtils';\nimport * as Ui from '../utils/uiUtils';\nimport * as UserSettings from '../utils/user-settings';\nimport { getDiffInMinutes } from './../utils/dateUtils';\nimport * as AppAutosave from './autosave';\nimport { errorHandler } from './errorHandler';\nimport * as ItemProperties from './item-properties';\nimport * as AppSave from './save';\n\nexport let domains: DomainDetails[] = [];\nexport let projectGroupAvailable = false;\nlet savingMessage: boolean;\nlet autosavingMessages: boolean;\nlet lastAutosave: Date;\nlet autosaveTimerId: number;\nlet startingApp: boolean;\nlet currentItem: SupportedOfficeItem;\nconst TAG = 'APP1: ';\n\nexport async function tryStart(item: SupportedOfficeItem) {\n currentItem = item;\n\n if (!currentItem) {\n return;\n }\n\n await waitForAllTasks();\n\n if (currentItem != item) {\n console.log(TAG, 'tryStart: cancelling because selected item has changed');\n return;\n }\n\n startingApp = true;\n try {\n await start(item);\n } catch (error) {\n // do not show this kind of errors because they occur often on the web\n if (error instanceof OutlookWrongItemSelectedException) {\n console.log(\n TAG,\n 'OutlookWrongItemSelectedException has occurred when trying to start the application',\n error\n );\n Ui.showItemNotSupportedPage();\n } else if (currentItem != item) {\n console.log(\n TAG,\n 'Failed to start the application for previous office item',\n error\n );\n } else {\n errorHandler(error, 'Failed to start the application');\n }\n }\n startingApp = false;\n}\n\nexport async function startAutosaveTimer(item: SupportedOfficeItem) {\n if (!CONFIG.isGraphApiEnabled) {\n console.log(TAG, 'Graph API is disabled, not starting autosave timer');\n return;\n }\n\n if (autosaveTimerId) {\n console.log(TAG, 'Clearing autosave timer:', autosaveTimerId);\n clearInterval(autosaveTimerId);\n autosaveTimerId = undefined;\n }\n\n const sharedProperties = await OutlookAsyncUtils.getSharedProperties(item);\n\n if (sharedProperties) {\n console.log(TAG, 'Item is shared, not starting autosave timer');\n return;\n }\n\n await tryAutosaveIfDue();\n\n // tryAutosaveIfDue will be called frequently, but the autosave will still only happen every CONFIG.autosaveIntervalInMinutes minutes\n autosaveTimerId = window.setInterval(() => tryAutosaveIfDue(), 5 * 60 * 1000);\n\n console.log(TAG, 'Starting autosave timer:', autosaveTimerId);\n}\n\nexport async function tryAutosaveIfDue() {\n if (autosavingMessages) {\n console.log(TAG, 'Already autosaving');\n return;\n }\n\n if (!isDueToAutosave()) {\n console.log(TAG, 'Not due to autosave. Last autosave:', lastAutosave);\n return;\n }\n\n await waitForAllTasks();\n\n // Check again after waiting for pending tasks as another autosave may have been started in the interim\n if (autosavingMessages) {\n console.log(TAG, 'Already autosaving');\n return;\n }\n\n autosavingMessages = true;\n\n try {\n await AppAutosave.autosaveNewMessages();\n } catch (error) {\n errorHandler(error, 'Failed to autosave new messages');\n }\n\n autosavingMessages = false;\n lastAutosave = new Date();\n}\n\nexport async function trySaveMessage(item: SupportedOfficeItem) {\n await waitForAllTasks();\n\n savingMessage = true;\n try {\n await AppSave.saveMessage(item);\n } catch (error) {\n errorHandler(error, 'Failed to save document');\n }\n\n if (UserSettings.getAutosave()) {\n resetAutosavePeriod();\n }\n\n savingMessage = false;\n}\n\nexport async function start(item: SupportedOfficeItem) {\n const sharedProperties = await OutlookAsyncUtils.getSharedProperties(item);\n\n if (await OutlookItemUtils.isReadOnlySharedItem(item, sharedProperties)) {\n Ui.showReadOnlySharedItemNotSupported();\n } else if (await ItemProperties.isItemSavedThroughApi(item)) {\n Ui.showMessageSaved();\n } else if (await AppAutosave.isAutosaved(item)) {\n Ui.showMessageAutosaved();\n } else if (await OutlookAsyncUtils.isRecurringMaster(item)) {\n Ui.showSeriesEventNotSupported();\n } else if (await OutlookItemUtils.isSavedMeeting(item, sharedProperties)) {\n Ui.showMessageSaved();\n } else {\n await Ui.showPrimaryStakeholdersInfo(item);\n }\n}\n\nexport async function showStakeholdersForm(item: SupportedOfficeItem) {\n const allRadio = $('input[name=\"save-all-future-email\"]');\n\n allRadio.each(function () {\n if ($(this).val() == 'one') {\n $(this).prop('checked', true);\n }\n $(this).prop('disabled', UserSettings.getAutosave());\n });\n\n const sharedProperties = await OutlookAsyncUtils.getSharedProperties(item);\n\n const [primaryStakeholders, additionalStakeholders] = await Promise.all([\n getPrimaryStakeholders(item, sharedProperties),\n getAdditionalStakeholders(item, sharedProperties),\n ]);\n\n Ui.showStakeholdersForm(\n primaryStakeholders,\n additionalStakeholders,\n item.itemType\n );\n}\n\nexport async function refreshDomains() {\n const domainsInfo = await Api.getDomainList();\n domains = domainsInfo.DomainDetails;\n projectGroupAvailable = domainsInfo.ProjectGroupAvailable;\n\n const favouriteDomainAndGroup = getFavDomainAndGroup(domainsInfo);\n\n Ui.refreshDomains(\n domainsInfo.DomainDetails,\n favouriteDomainAndGroup,\n domainsInfo.ProjectGroupAvailable\n );\n}\n\n/** Returns ID of first available project */\nexport async function selectAnyProjectId(): Promise {\n const domainsInfo = await Api.getDomainList();\n domains = domainsInfo.DomainDetails;\n projectGroupAvailable = domainsInfo.ProjectGroupAvailable;\n\n for (const domain of domains) {\n for (const project of domain.Projects) {\n return project.ID;\n }\n for (const group of domain.ProjectGroups) {\n for (const project of group.Projects) {\n return project.ID;\n }\n }\n\n for (const project of domain.Projects) {\n return project.ID;\n }\n }\n}\n\nexport function logout() {\n localStorage.clear();\n Ui.showLogoutSuccessDialog();\n}\n\nfunction getFavDomainAndGroup(domainList: GetDomainListResponse) {\n if (!domainList.FavouriteProjectDetails) return null;\n\n const favProjectName = domainList.FavouriteProjectDetails.ProjectName;\n const projectGroupAvailable = domainList.ProjectGroupAvailable;\n const domains = domainList.DomainDetails;\n\n let favouriteProject: ProjectInfo = null;\n\n const projectInfos: ProjectInfo[] = [];\n\n domains.forEach(function (domain) {\n if (projectGroupAvailable) {\n domain.ProjectGroups.forEach(function (projectGroup) {\n projectGroup.Projects.forEach(function (project) {\n projectInfos.push({\n domainId: domain.ID,\n projectGroupId: projectGroup.ID,\n projectId: project.ID,\n project: project,\n });\n });\n });\n } else {\n domain.Projects.forEach(function (project) {\n projectInfos.push({\n domainId: domain.ID,\n projectGroupId: '-1',\n projectId: project.ID,\n project: project,\n });\n });\n }\n });\n\n projectInfos.find(function (projectInfo) {\n if (projectInfo.project.ProjectName == favProjectName) {\n favouriteProject = {\n domainId: projectInfo.domainId,\n projectGroupId: projectInfo.projectGroupId,\n projectId: projectInfo.project.ID,\n project: projectInfo.project,\n };\n }\n });\n return favouriteProject;\n}\n\nfunction isDueToAutosave() {\n const diffMinutes = getDiffInMinutes(new Date(), lastAutosave || new Date(0));\n\n const isDue = diffMinutes > CONFIG.autosaveIntervalInMinutes;\n return isDue;\n}\n\n/** Resets the time of last autosave to trigger it on the next app start */\nfunction resetAutosavePeriod() {\n lastAutosave = undefined;\n}\n\nasync function waitForAllTasks() {\n while (savingMessage || autosavingMessages || startingApp) {\n console.log(TAG, 'Waiting', savingMessage, autosavingMessages, startingApp);\n await sleep(50);\n }\n}\n","import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { ApplicationException } from 'common/exceptions/application/ApplicationException';\nimport CONFIG from 'config';\nimport { Complaint } from '../models/Complaint';\nimport { Interaction } from '../models/Interaction';\nimport * as Api from '../utils/api';\nimport * as Auth from '../utils/authUtils';\nimport { getAllStakeholders } from '../utils/contactUtils';\nimport { toIsoWithTimeZone } from '../utils/dateUtils';\nimport * as GraphApi from '../utils/graphApi';\nimport { getDirectionForGraphItem } from '../utils/graphItemUtils';\nimport { getDateFromOutlookItem } from '../utils/outlookItemUtils';\nimport { SupportedOfficeItem } from '../utils/SupportedOfficeItem';\nimport * as UserSettings from '../utils/user-settings';\nimport { ContactCustomFields } from './../models/ContactCustomFields';\nimport * as AppContacts from './contacts';\nimport * as ItemProperties from './item-properties';\nimport * as AppSave from './save';\n\nconst TAG = 'ATS3: ';\n\nexport async function isAutosaved(item: SupportedOfficeItem) {\n if (!CONFIG.isGraphApiEnabled) return false;\n\n if (item.itemType === 'appointment') return false;\n\n console.log(TAG, 'Checking if item was autosaved');\n const messageDate = await getDateFromOutlookItem(item);\n // message date will be compared to last sync date, which doesn't include milliseconds,\n // because REST API doesn't include them in date-time fields\n // to make the comparison \"fair\", messageDate should be stripped of milliseconds\n messageDate.setMilliseconds(0);\n const contacts = await getAutosaveContacts();\n const stakeholders = await getAllStakeholders(item, undefined);\n\n // find all autosave contacts for this item\n const itemContacts: MicrosoftGraph.Contact[] = [];\n for (const stakeholder of stakeholders) {\n const contact = contacts.find(\n (c) =>\n c.emailAddresses &&\n c.emailAddresses[0] &&\n c.emailAddresses[0].address === stakeholder.email\n );\n if (contact) {\n itemContacts.push(contact);\n }\n }\n\n // if no autosave contacts for this item, then item is not autosaved\n if (itemContacts.length === 0) {\n console.log(TAG, 'Message is not supposed to be autosaved');\n return false;\n }\n\n // check last sync dates for all contacts\n const autosavedForAllContacts = itemContacts.every((c) => {\n console.log(TAG, `Checking if item was autosaved for ${c.givenName}`);\n const customFields = AppContacts.getCustomFields(c);\n console.log(\n TAG,\n `Last sync date for contact ${customFields.lastSyncDate}`,\n Number(customFields.lastSyncDate)\n );\n console.log(TAG, `Message date is ${messageDate}`, Number(messageDate));\n\n return (\n customFields.lastSyncDate >= messageDate &&\n customFields.startAutosaveDate <= messageDate\n );\n });\n\n console.log(TAG, 'Autosaved for all contacts ', autosavedForAllContacts);\n return autosavedForAllContacts;\n}\n\nexport async function autosaveNewMessages() {\n console.log(TAG, 'Getting contacts to auto save new messages');\n\n const contacts = await getAutosaveContacts();\n await prepareMessages(contacts);\n\n let messageSaved = false;\n\n for (const contact of contacts) {\n messageSaved ||= await autosaveMessagesForContact(contact);\n }\n\n if (messageSaved) {\n await Api.trackVitallyEvent({ eventName: 'used_email_plugin' });\n }\n}\n\nexport async function getAutosaveContacts() {\n const group = await GraphApi.getOrCreateContactGroup(CONFIG.contactGroupName);\n const contacts = await GraphApi.getContacts(group.id);\n console.log(TAG, 'Found contacts ', contacts.length);\n return contacts;\n}\n\nasync function autosaveMessagesForContact(contact: MicrosoftGraph.Contact) {\n if (!contact.emailAddresses[0] || !contact.emailAddresses[0].address) {\n throw new ApplicationException(\n 'One of the contacts in autosave contact group is corrupt: ' +\n JSON.stringify(contact)\n );\n }\n\n console.log(\n TAG,\n 'Processing autosave contact',\n contact.emailAddresses[0].address\n );\n\n const customFields = AppContacts.getCustomFields(contact);\n\n if (!isCorrectClientCode(customFields)) {\n return false;\n }\n\n // previous version didn't set customFields.lastSyncDate\n // in this case, use LastModifiedDateTime instead\n // can be removed later\n const lastSyncDate = !isNaN(Number(customFields.lastSyncDate))\n ? customFields.lastSyncDate\n : new Date(contact.lastModifiedDateTime);\n\n console.log(\n TAG,\n 'Searching new messages from ',\n contact.emailAddresses[0].address,\n lastSyncDate,\n customFields\n );\n\n const messages = getMessages(contact.emailAddresses[0].address, lastSyncDate);\n\n console.log(TAG, 'Found messages ', messages.length);\n\n if (messages.length === 0) return false;\n\n const projectId = customFields.projectId;\n UserSettings.setProject(projectId);\n await Auth.refreshToken();\n\n const stakeholderId = await Api.findStakeholder(customFields.stakeholder);\n\n if (!stakeholderId) {\n await GraphApi.deleteContact(contact.id);\n throw new ApplicationException(\n `Stakeholder ${customFields.stakeholder.Email} was deleted in ${CONFIG.appName}. ` +\n 'Add-in will stop auto-saving messages from this stakeholder'\n );\n }\n\n let messageSaved = false;\n\n for (const message of messages) {\n const shouldSave = await shouldSaveMessage(message);\n if (shouldSave) {\n await autosaveMessage(message, customFields, stakeholderId);\n await ItemProperties.markItemAsSavedThroughGraph(message);\n\n messageSaved = true;\n }\n\n // even if message was skipped because it's already saved,\n // we'll need to update last sync date so message would be marked as Autosaved in UI\n await AppContacts.setLastSyncDate(\n contact,\n new Date(message.receivedDateTime)\n );\n }\n\n return messageSaved;\n}\n\nlet allNewMessages: MicrosoftGraph.Message[];\n/** Retrieves and saved messages for all contacts in one go\n * Because requesting them for individual contacts is costly\n */\nasync function prepareMessages(contacts: MicrosoftGraph.Contact[]) {\n const addressesToDates = new Map();\n for (const contact of contacts) {\n const fields = AppContacts.getCustomFields(contact);\n const lastSyncDate = fields.lastSyncDate;\n\n if (\n contact.emailAddresses &&\n contact.emailAddresses[0] &&\n contact.emailAddresses[0].address\n ) {\n const address = contact.emailAddresses[0].address;\n addressesToDates.set(address, lastSyncDate);\n }\n }\n\n console.log(TAG, 'Getting messages no older than ', addressesToDates);\n\n const allMessages = await GraphApi.getMessages(addressesToDates);\n\n const contactMessagesAscending = allMessages.sort((a, b) => {\n const aDate = new Date(a.receivedDateTime);\n const bDate = new Date(b.receivedDateTime);\n\n if (aDate > bDate) return 1;\n else if (bDate > aDate) return -1;\n return 0;\n });\n\n allNewMessages = contactMessagesAscending;\n}\n\n/**\n * Filters previously retrieved messages\n */\nfunction getMessages(email: string, lastSyncDate: Date) {\n const contactMessages = allNewMessages.filter((m) => {\n // REST API might round up time (e.g. 9:00:00 900ms -> 9:00:01)\n // we're adding a second to lastSyncDate to catch messages with round up seconds\n const clone = new Date(lastSyncDate);\n const adjustedLastSyncDate = new Date(\n clone.setSeconds(clone.getSeconds() + 1)\n );\n\n if (new Date(m.receivedDateTime) <= adjustedLastSyncDate) {\n return false;\n }\n\n if (m.from.emailAddress && m.from.emailAddress.address === email) {\n return true;\n }\n\n if (!m.toRecipients) return false;\n\n const recipient = m.toRecipients.find(\n (r) => r.emailAddress.address === email\n );\n\n if (recipient) return true;\n else return false;\n });\n\n return contactMessages;\n}\n\n/** Returns false if current domain/client doesn't match the one assigned for this contact */\nfunction isCorrectClientCode(customFields: ContactCustomFields) {\n // if it's not saved, we'll just try to save the message with current domain/client and assign it to this contact later\n if (UserSettings.getClientCode() && UserSettings.getDomain()) {\n if (customFields.clientId && customFields.domainUrl) {\n if (\n customFields.clientId !== UserSettings.getClientCode() ||\n customFields.domainUrl !== UserSettings.getDomain()\n ) {\n console.log(\n TAG,\n 'Signed in with different domain or client code, skipping this contact'\n );\n return false;\n } else {\n console.log(TAG, 'Signed in correct domain/client, continuing');\n }\n } else {\n console.log(TAG, 'Domain/client not set for this contact');\n }\n }\n return true;\n}\n\nasync function shouldSaveMessage(message: MicrosoftGraph.Message) {\n const isMarkedAsSaved = await ItemProperties.isItemSavedThroughGraph(message);\n if (isMarkedAsSaved) {\n console.log(TAG, 'Message already saved, skipping', message.subject);\n return false;\n }\n\n const isExcludedPromise = Api.ensureEmailSubjectIsNotExcluded({\n Subject: message.subject,\n });\n const isSavedPromise = isEmailADuplicate(message);\n const isExcluded = await isExcludedPromise;\n const isSavedOnServer = await isSavedPromise;\n\n if (isExcluded) {\n console.log(\n TAG,\n 'Email subject contains words that are in the exclusion list'\n );\n return false;\n }\n if (isSavedOnServer) {\n console.log(TAG, 'Email was already saved on the server');\n return false;\n }\n\n return true;\n}\n\nasync function isEmailADuplicate(message: MicrosoftGraph.Message) {\n if (CONFIG.allowToSaveMessageAgain) return false;\n\n const response = await Api.findDuplicateEmail({\n Subject: message.subject,\n EmailAddresses: [\n message.from.emailAddress.address,\n ...message.toRecipients.map((to) => to.emailAddress.address),\n ],\n Message: message.body.content,\n DateTime: toIsoWithTimeZone(new Date(message.receivedDateTime)),\n });\n return response.IsMatchFound;\n}\n\nasync function autosaveMessage(\n message: MicrosoftGraph.Message,\n customFields: ContactCustomFields,\n stakeholderId: string\n) {\n console.log(TAG, 'Saving message ', message.subject);\n if (customFields.emailType == 'Communication' || !customFields.emailType) {\n await saveInteraction(message, customFields, stakeholderId);\n } else if (customFields.emailType == 'Complaint') {\n await saveComplaint(message, customFields, stakeholderId);\n } else {\n throw new ApplicationException(\n 'Unexpected email type for auto saving ' + customFields.emailType\n );\n }\n}\n\nasync function saveInteraction(\n message: MicrosoftGraph.Message,\n customFields: ContactCustomFields,\n stakeholderId: string\n) {\n console.log(TAG, 'Saving interaction ', message.subject, customFields);\n\n const attachmentsIds = await AppSave.uploadAttachmentsForItemId(\n message.id,\n 'message',\n undefined\n );\n\n const interaction = await getInteractionForAutosave(message, customFields);\n const interactionId = await Api.saveInteraction(interaction);\n await Api.linkInteractionToStakeholders(interactionId, [stakeholderId]);\n if (attachmentsIds.length > 0) {\n await Api.linkInteractionToAttachments(interactionId, attachmentsIds);\n }\n\n await Api.trackVitallyEvent({ eventName: 'new_interaction_saved' });\n}\n\nasync function saveComplaint(\n message: MicrosoftGraph.Message,\n customFields: ContactCustomFields,\n stakeholderId: string\n) {\n console.log(TAG, 'Saving complaint ', message.subject);\n\n const attachmentsIds = await AppSave.uploadAttachmentsForItemId(\n message.id,\n 'message',\n undefined\n );\n\n const complaint = await getComplaintForAutosave(message, customFields);\n const complaintId = await Api.saveComplaint(complaint);\n await Api.linkComplaintToStakeholders(complaintId, [stakeholderId]);\n if (attachmentsIds.length > 0) {\n await Api.linkComplaintToAttachments(complaintId, attachmentsIds);\n }\n\n await Api.trackVitallyEvent({ eventName: 'new_complaint_saved' });\n}\n\nasync function getInteractionForAutosave(\n item: MicrosoftGraph.Message,\n customFields: ContactCustomFields\n) {\n const subject = item.subject;\n const direction = getDirectionForGraphItem(item);\n const dateTime = new Date(item.receivedDateTime);\n const body = item.body.content;\n const template = customFields.communicationTemplate;\n\n const communicationDirection = await Api.getDirectionFromServer(direction);\n\n const interaction: Interaction = {\n Subject: subject,\n Location: null,\n CommunicationDate: toIsoWithTimeZone(dateTime),\n Method: {\n Text: 'Email',\n },\n Direction: communicationDirection,\n Message: body,\n Confidential: template.Confidential,\n Duration: null, // there is no autosave for meetings\n };\n\n return interaction;\n}\n\nasync function getComplaintForAutosave(\n item: MicrosoftGraph.Message,\n customFields: ContactCustomFields\n) {\n const subject = item.subject;\n const direction = getDirectionForGraphItem(item);\n const dateTime = new Date(item.receivedDateTime);\n const body = item.body.content;\n const template = customFields.communicationTemplate;\n\n const communicationDirection = await Api.getDirectionFromServer(direction);\n\n const complaint: Complaint = {\n Subject: subject,\n AssignedTo: template.AssignedTo,\n DateOpened: toIsoWithTimeZone(dateTime),\n Method: {\n Text: 'Email',\n },\n Direction: communicationDirection,\n Message: body,\n Priority: template.Priority,\n Confidential: template.Confidential,\n Status: template.Status,\n };\n\n return complaint;\n}\n","import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { ApplicationException } from 'common/exceptions/application/ApplicationException';\nimport CONFIG from 'config';\nimport { CommunicationTemplate } from '../models/CommunicationTemplate';\nimport { Stakeholder } from '../models/Stakeholder';\nimport * as GraphApi from '../utils/graphApi';\nimport * as UserSettings from '../utils/user-settings';\nimport { ContactCustomFields } from './../models/ContactCustomFields';\n\nconst TAG = 'OCT3: ';\n\nexport async function createAutosaveContact(\n projectId: string,\n emailType: string,\n stakeholder: Stakeholder,\n communicationTemplate: CommunicationTemplate,\n firstSaveDate: Date\n) {\n console.log(TAG, 'Saving contact ', stakeholder.Email);\n\n const existingContact = await GraphApi.getContact(\n stakeholder.Email,\n CONFIG.contactGroupName\n );\n\n const contact: MicrosoftGraph.Contact = {\n givenName: stakeholder.FirstName,\n surname: stakeholder.LastName,\n emailAddresses: [\n {\n address: stakeholder.Email,\n name: stakeholder.FirstName + ' ' + stakeholder.LastName,\n },\n ],\n children: [],\n };\n\n // preserve ID of existing contact\n if (existingContact) contact.id = existingContact.id;\n\n const customFields = new ContactCustomFields();\n customFields.domainUrl = UserSettings.getDomain();\n customFields.clientId = UserSettings.getClientCode();\n customFields.projectId = projectId;\n customFields.emailType = emailType;\n customFields.stakeholder = stakeholder;\n customFields.communicationTemplate = communicationTemplate;\n customFields.lastSyncDate = firstSaveDate;\n customFields.startAutosaveDate = firstSaveDate;\n\n console.log(\n TAG,\n 'Domain and client for the contact ',\n customFields.domainUrl,\n customFields.clientId\n );\n\n // preserve startAutosaveDate of existing contact\n if (existingContact) {\n const existingCustomFields = getCustomFields(existingContact);\n customFields.startAutosaveDate = existingCustomFields.startAutosaveDate;\n }\n\n setCustomFields(contact, customFields);\n\n // TODO: do not update start save date!\n await GraphApi.createOrUpdateContact(contact, CONFIG.contactGroupName);\n console.log(TAG, 'Done saving contact');\n}\n\nexport function setCustomFields(\n contact: MicrosoftGraph.Contact,\n customFields: ContactCustomFields\n) {\n console.log(\n TAG,\n 'Setting contact fields ',\n contact.emailAddresses[0].address,\n customFields\n );\n\n contact.personalNotes = JSON.stringify(customFields);\n}\n\nexport function getCustomFields(\n contact: MicrosoftGraph.Contact\n): ContactCustomFields {\n const emailAddress = contact.emailAddresses[0].address;\n\n try {\n // deserialize to specific type\n const parsed = Object.assign(\n new ContactCustomFields(),\n JSON.parse(contact.personalNotes)\n ) as ContactCustomFields;\n\n if (!parsed.updateDate) {\n throw new ApplicationException('updateDate property not set');\n }\n\n console.log(TAG, 'Read contact fields ', emailAddress, parsed);\n\n return parsed;\n } catch (error) {\n throw new ApplicationException(\n `Failed to parse custom fields for contact ${emailAddress}. Data: '${contact.personalNotes}'`,\n error\n );\n }\n}\n\nexport async function setLastSyncDate(\n contact: MicrosoftGraph.Contact,\n date: Date\n) {\n console.log(TAG, 'Setting last sync date to ', date);\n const customFields = getCustomFields(contact);\n if (customFields && customFields.lastSyncDate > date) {\n console.log(TAG, 'Setting last sync date: already greater than ', date);\n return;\n }\n customFields.lastSyncDate = date;\n setCustomFields(contact, customFields);\n await GraphApi.updateContact(contact);\n}\n","import { AddInFeatureNotSupportedException } from 'common/exceptions/application/AddInFeatureNotSupportedException';\nimport { ApiException } from 'common/exceptions/application/ApiException';\nimport { ApplicationException } from 'common/exceptions/application/ApplicationException';\nimport { ItemIsNotSavedException } from 'common/exceptions/application/ItemIsNotSavedException';\nimport { MeetingAlreadySavedException } from 'common/exceptions/application/MeetingAlreadySavedException';\nimport { Exception } from 'common/exceptions/Exception';\nimport { AuthException } from 'common/exceptions/http/AuthException';\nimport AuthInvalidGrantException from 'common/exceptions/http/AuthInvalidGrantException';\nimport { ConnectionException } from 'common/exceptions/http/ConnectionException';\nimport { ForbiddenException } from 'common/exceptions/http/ForbiddenException';\nimport { OutlookApiException } from 'common/exceptions/outlook/OutlookApiException';\nimport { OutlookException } from 'common/exceptions/outlook/OutlookException';\nimport { OutlookItemNotSupported } from 'common/exceptions/outlook/OutlookItemNotSupported';\nimport { OutlookWrongItemSelectedException } from 'common/exceptions/outlook/OutlookWrongItemSelectedException';\nimport * as Ui from '../utils/uiUtils';\n\nexport function errorHandler(error: Exception, friendlyMessage?: string) {\n console.log('Handling error ', friendlyMessage, error);\n\n friendlyMessage = friendlyMessage || '';\n const errorMessage = error && error.message ? error.message : '';\n const friendlyMessageWithColon = friendlyMessage\n ? friendlyMessage + ': '\n : '';\n const friendlyMessageWithErrorMessage =\n friendlyMessage && errorMessage\n ? friendlyMessageWithColon + errorMessage\n : friendlyMessage + errorMessage;\n\n // app exceptions that can occur during manual saving\n if (error instanceof ItemIsNotSavedException) {\n Ui.showInfoDialog(\n 'Please save this item in Outlook by either selecting File -> Save, or, for meetings, by sending invitations to attendees.' +\n ' If this item is already saved, please try again shortly.'\n );\n } else if (error instanceof MeetingAlreadySavedException) {\n Ui.showInfoDialog(\n 'The meeting has already been saved in the selected project.'\n );\n } else if (error instanceof OutlookItemNotSupported) {\n Ui.showInfoDialog('This outlook item is not supported');\n }\n // app exceptions that can occur during manual saving or autosaving\n else if (\n error instanceof AddInFeatureNotSupportedException ||\n error instanceof ApiException ||\n error instanceof ApplicationException\n ) {\n Ui.showErrorInForm(friendlyMessageWithErrorMessage, error);\n }\n\n // http exceptions\n else if (error instanceof ConnectionException) {\n Ui.showErrorInForm(\n 'Internet connection was interrupted. Please try again.',\n error\n );\n } else if (\n error instanceof AuthInvalidGrantException ||\n error instanceof AuthException\n ) {\n Ui.showAuthErrorDialog('Your session has expired please login again.');\n localStorage.clear();\n } else if (error instanceof ForbiddenException) {\n Ui.showErrorInForm(\n friendlyMessageWithColon +\n 'You do not have permission to perform this action',\n error\n );\n }\n\n // unknown Outlook exceptions\n else if (error instanceof OutlookApiException) {\n Ui.showErrorInForm(\n friendlyMessageWithColon +\n 'Outlook API error has occurred: ' +\n error.message,\n error\n );\n } else if (error instanceof OutlookException) {\n Ui.showErrorInForm(\n friendlyMessageWithColon + 'Outlook error has occurred: ' + error.message,\n error\n );\n } else if (error instanceof OutlookWrongItemSelectedException) {\n // see JSDoc for this class\n Ui.showErrorInForm(friendlyMessageWithColon + error.message, error);\n }\n\n // unexpected\n else {\n Ui.showErrorInForm(\n friendlyMessageWithColon +\n 'An unexpected error occurred. Please contact support.',\n error\n );\n }\n}\n","import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { getAsyncCustomProperties } from 'common/utils/outlookAsyncUtils';\nimport { SupportedOfficeItem } from 'common/utils/SupportedOfficeItem';\nimport CONFIG from 'config';\nimport * as GraphApi from '../utils/graphApi';\nimport * as OutlookAsyncUtils from '../utils/outlookAsyncUtils';\n\nconst TAG = 'ITP3: ';\n\nexport async function isItemSavedThroughApi(\n item: SupportedOfficeItem\n): Promise {\n if (CONFIG.allowToSaveMessageAgain) {\n return false;\n }\n\n console.log(TAG, 'Checking if item is saved through API', item.subject);\n\n const properties = await getAsyncCustomProperties(item);\n const isSaved = properties.get(`saved_in_${CONFIG.appPrefix}`);\n\n console.log(TAG, 'Checking if item is saved through API result', isSaved);\n\n return isSaved === '1';\n}\n\nexport async function isItemSavedThroughGraph(message: MicrosoftGraph.Message) {\n if (CONFIG.allowToSaveMessageAgain) {\n return false;\n }\n\n console.log(TAG, 'Checking if item was saved through Graph API');\n\n const property = await GraphApi.getExtendedProperty(\n message,\n `saved_in_${CONFIG.appPrefix}`\n );\n\n console.log(\n TAG,\n 'Checking if item was saved through Graph API result',\n property\n );\n\n return property === '1';\n}\n\nexport async function markItemAsSavedThroughApi(item: SupportedOfficeItem) {\n if (CONFIG.allowToSaveMessageAgain) {\n return;\n }\n\n console.log(TAG, 'Marking item as saved through API');\n\n const properties = await OutlookAsyncUtils.getAsyncCustomProperties(item);\n properties.set(`saved_in_${CONFIG.appPrefix}`, '1');\n await OutlookAsyncUtils.saveAsyncCustomProperties(properties);\n}\n\nexport async function markItemAsSavedThroughGraph(\n message: MicrosoftGraph.Message\n) {\n if (CONFIG.allowToSaveMessageAgain) {\n return;\n }\n\n console.log(TAG, 'Marking item as saved through Graph API');\n\n await GraphApi.setExtendedProperty(\n message,\n `saved_in_${CONFIG.appPrefix}`,\n '1'\n );\n}\n","import $ from 'jquery';\nimport * as Api from '../utils/api';\nimport * as Ui from '../utils/uiUtils';\n\nexport async function refreshContactGroups() {\n const contactGroups = await Api.getContactGroups();\n Ui.renderOptions(contactGroups, '#item-contact-group', false);\n $('#selectBox').show();\n}\n\nexport async function refreshConfidentialities() {\n const confidentialities = await Api.getConfidentialities();\n Ui.renderOptions(confidentialities, '#item-confidential', true);\n}\n\nexport async function refreshUsers() {\n const users = await Api.getUsers();\n Ui.renderOptions(users, '#item-assigned-to', true);\n\n $('#item-communication').trigger('change');\n}\n\nexport async function refreshPriorities() {\n const priorities = await Api.getPriorities();\n Ui.renderOptions(priorities, '#complaint-priorities', true);\n\n $('#item-communication').trigger('change');\n}\n\nexport async function refreshComplaintStatuses() {\n const statuses = await Api.getStatuses();\n Ui.renderOptions(statuses, '#item-complaint-status', false);\n\n $('#item-communication').trigger('change');\n}\n","import { ApplicationException } from 'common/exceptions/application/ApplicationException';\nimport { Attachment } from 'common/models/Attachment';\nimport { ValidateFileRequest } from 'common/models/ValidateFileRequest';\nimport CONFIG from 'config';\nimport $ from 'jquery';\nimport { AddInFeatureNotSupportedException } from '../exceptions/application/AddInFeatureNotSupportedException';\nimport { CommunicationTemplate } from '../models/CommunicationTemplate';\nimport { Complaint } from '../models/Complaint';\nimport { Interaction } from '../models/Interaction';\nimport { OutlookAttachmentResponseDTO } from '../models/OutlookAttachmentResponseDTO';\nimport * as Api from '../utils/api';\nimport { getDiffInHours, toIsoWithTimeZone } from '../utils/dateUtils';\nimport * as OutlookAsyncUtils from '../utils/outlookAsyncUtils';\nimport { getAsyncBody } from '../utils/outlookAsyncUtils';\nimport * as OutlookItemUtils from '../utils/outlookItemUtils';\nimport { SupportedOfficeItem } from '../utils/SupportedOfficeItem';\nimport * as Ui from '../utils/uiUtils';\nimport * as UserSettings from '../utils/user-settings';\nimport { Stakeholder } from './../models/Stakeholder';\nimport * as AppContacts from './contacts';\nimport * as ItemProperties from './item-properties';\n\nconst TAG = 'APS3: ';\n\nexport async function saveMessage(item: SupportedOfficeItem) {\n const checks = [ensureEmailSubjectIsNotExcluded(item)];\n // don't check appointments because they will be checked by UID while saving\n if (item.itemType !== 'appointment') {\n checks.push(ensureEmailIsNotDuplicate(item));\n }\n await Promise.all(checks);\n\n const sharedProperties = await OutlookAsyncUtils.getSharedProperties(item);\n\n const stakeholders = Ui.getStakeholdersFromUi();\n const stakeholdersIds = await saveStakeholders(stakeholders);\n\n const emailType = $('#item-communication').val();\n\n let communication: Interaction | Complaint;\n if (emailType == 'Communication' || !emailType) {\n communication = await saveInteraction(\n item,\n sharedProperties,\n stakeholdersIds\n );\n } else {\n communication = await saveComplaint(\n item,\n sharedProperties,\n stakeholdersIds\n );\n\n $('#save-project').prop('selectedIndex', 0);\n }\n\n await ItemProperties.markItemAsSavedThroughApi(item);\n\n await Api.trackVitallyEvent({ eventName: 'used_email_plugin' });\n\n Ui.showSaveSuccessfulDialog();\n $('#selectBox').hide();\n\n if (UserSettings.getAutosave()) {\n const firstSaveDate = await OutlookItemUtils.getDateFromOutlookItem(item);\n saveAutosaveContact(\n firstSaveDate,\n communication,\n emailType,\n stakeholders[0]\n );\n }\n}\n\nasync function ensureEmailIsNotDuplicate(item: SupportedOfficeItem) {\n if (CONFIG.allowToSaveMessageAgain) return;\n\n const response = await Api.findDuplicateEmail({\n Subject: await OutlookItemUtils.getSubjectFromOutlookItem(item),\n EmailAddresses: [\n item.from.emailAddress,\n ...item.to.map((to) => to.emailAddress),\n ],\n Message: await getAsyncBody(item.body),\n DateTime: toIsoWithTimeZone(\n await OutlookItemUtils.getDateFromOutlookItem(item)\n ),\n });\n\n if (response.IsMatchFound) {\n throw new ApplicationException(\n `Email was already saved in ${CONFIG.appName} as ${response.DocumentType}${response.DocumentID}`\n );\n }\n}\n\nasync function ensureEmailSubjectIsNotExcluded(item: SupportedOfficeItem) {\n const isExcluded = await Api.ensureEmailSubjectIsNotExcluded({\n Subject: await OutlookItemUtils.getSubjectFromOutlookItem(item),\n });\n if (isExcluded) {\n throw new ApplicationException(\n 'Email subject contains words that are in the exclusion list'\n );\n }\n}\n\nasync function saveStakeholders(stakeholders: Stakeholder[]) {\n const savingStakeholders = [];\n stakeholders.forEach(function (stakeholder) {\n savingStakeholders.push(createOrUpdateStakeholder(stakeholder));\n });\n\n const stakeholdersIds = await Promise.all(savingStakeholders);\n return stakeholdersIds;\n}\n\nexport async function saveInteraction(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined,\n stakeholderIds: string[]\n) {\n console.log(TAG, 'Saving interaction', sharedProperties);\n\n // first, check if attachments are available and saved\n // so function would throw 'attachments not saved' error\n const attachmentsIds = await uploadAttachmentsIfSupported(\n item,\n sharedProperties\n );\n\n const interaction = await getInteractionFromUi(item, sharedProperties);\n\n if (CONFIG.isGraphApiEnabled && item.itemType === 'appointment') {\n const id = await OutlookItemUtils.getItemId(item, sharedProperties);\n\n const uids = await OutlookItemUtils.getAppointmentUids(\n id,\n sharedProperties\n );\n\n if (uids.itemType === 'seriesMaster') {\n throw new ApplicationException(\n 'Saving series of events is not supported. Please select a single event in series.'\n );\n }\n\n console.log(TAG, 'Retrieved Appointment UID: ', uids.uid);\n interaction.MeetingUID = uids.uid;\n interaction.MeetingRecurrenceID = uids.recurrenceId;\n }\n\n const interactionId = await Api.saveInteraction(interaction);\n\n await Api.linkInteractionToStakeholders(interactionId, stakeholderIds);\n if (attachmentsIds.length > 0) {\n await Api.linkInteractionToAttachments(interactionId, attachmentsIds);\n }\n\n await Api.trackVitallyEvent({ eventName: 'new_interaction_saved' });\n\n return interaction;\n}\n\nexport async function saveComplaint(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined,\n stakeholderIds: string[]\n) {\n console.log(TAG, 'Saving complaint', sharedProperties);\n\n // first, check if attachments are available and saved\n // so function would throw 'attachments not saved' error\n const attachmentsIds = await uploadAttachmentsIfSupported(\n item,\n sharedProperties\n );\n\n const complaint = await getComplaintFromUi(item, sharedProperties);\n const interactionId = await Api.saveComplaint(complaint);\n\n await Api.linkComplaintToStakeholders(interactionId, stakeholderIds);\n if (attachmentsIds.length > 0) {\n await Api.linkComplaintToAttachments(interactionId, attachmentsIds);\n }\n\n await Api.trackVitallyEvent({ eventName: 'new_complaint_saved' });\n\n return complaint;\n}\n\nasync function saveAutosaveContact(\n firstSaveDate: Date,\n communication: Interaction | Complaint,\n emailType: string | number | string[],\n stakeholder: Stakeholder\n) {\n await AppContacts.createAutosaveContact(\n UserSettings.getProject(),\n emailType as string,\n stakeholder,\n communication as CommunicationTemplate,\n firstSaveDate\n );\n}\n\nasync function getInteractionFromUi(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n) {\n const subject = await OutlookItemUtils.getSubjectFromOutlookItem(item);\n const location = await OutlookItemUtils.getLocationFromOutlookItem(item);\n const direction = OutlookItemUtils.getDirectionFromOutlookItem(\n item,\n sharedProperties\n );\n const dateTime = await OutlookItemUtils.getDateFromOutlookItem(item);\n const endDateTime = await OutlookItemUtils.getEndDateFromOutlookItem(item);\n const duration = getDiffInHours(endDateTime, dateTime);\n const body = await getAsyncBody(item.body);\n const confidentialValue = $('#item-confidential').val();\n\n let confidential = null;\n if (CONFIG.isConfidentialOptionsEnabled && confidentialValue) {\n confidential = { Value: confidentialValue };\n }\n\n const communicationDirection = await Api.getDirectionFromServer(direction);\n\n const interaction: Interaction = {\n Subject: subject,\n CommunicationDate: toIsoWithTimeZone(dateTime),\n Method: {\n Text: OutlookItemUtils.getInteractionMethodFromOutlookItem(item),\n },\n Direction: communicationDirection,\n Location: location,\n Message: body,\n Confidential: confidential || null,\n Duration: duration,\n };\n return interaction;\n}\n\nasync function getComplaintFromUi(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n) {\n const subject = await OutlookItemUtils.getSubjectFromOutlookItem(item);\n const direction = OutlookItemUtils.getDirectionFromOutlookItem(\n item,\n sharedProperties\n );\n const dateTime = await OutlookItemUtils.getDateFromOutlookItem(item);\n const body = await getAsyncBody(item.body);\n\n const communicationDirection = await Api.getDirectionFromServer(direction);\n\n const confidentialValue = $('#item-confidential').val();\n const priorityValue = $('#complaint-priorities').val()\n ? $('#complaint-priorities').val()\n : '';\n const assignedTo = $('#item-assigned-to').val()\n ? $('#item-assigned-to').val()\n : '';\n const statusValue = $('#item-complaint-status').val()\n ? $('#item-complaint-status').val()\n : '';\n\n let confidential = null;\n if (CONFIG.isConfidentialOptionsEnabled && confidentialValue) {\n confidential = { Value: confidentialValue };\n }\n let priority = null;\n if (priorityValue) {\n priority = { Value: priorityValue.toString() };\n }\n let status = null;\n if (statusValue) {\n status = { Value: statusValue.toString() };\n }\n\n const complaint: Complaint = {\n Subject: subject,\n AssignedTo: {\n Value: assignedTo.toString(),\n },\n DateOpened: toIsoWithTimeZone(dateTime),\n Method: {\n Text: OutlookItemUtils.getInteractionMethodFromOutlookItem(item),\n },\n Direction: communicationDirection,\n Message: body,\n Priority: priority,\n Confidential: confidential,\n Status: status,\n };\n\n return complaint;\n}\n\nasync function uploadAttachmentsIfSupported(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n) {\n try {\n return await uploadAttachmentsForItem(item, sharedProperties);\n } catch (error) {\n if (error instanceof AddInFeatureNotSupportedException) {\n return [];\n } else {\n throw error;\n }\n }\n}\n\nexport async function uploadAttachmentsForItem(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n) {\n if (!CONFIG.isAttachmentsEnabled) {\n console.log(TAG, 'Attachments are not enabled, skipping');\n return [];\n } else {\n console.log(TAG, 'Uploading attachments');\n }\n\n const attachments = await OutlookItemUtils.getSupportedAttachmentsForItem(\n item,\n sharedProperties\n );\n\n return await uploadAttachmentContent(attachments);\n}\n\nexport async function uploadAttachmentsForItemId(\n itemId: string,\n itemType: string,\n sharedProperties: Office.SharedProperties | undefined\n) {\n if (!CONFIG.isAttachmentsEnabled) {\n console.log(TAG, 'Attachments are not enabled, skipping');\n return [];\n } else {\n console.log(TAG, 'Uploading attachments');\n }\n\n const attachments = await OutlookItemUtils.getSupportedAttachmentsForItemId(\n itemId,\n itemType,\n sharedProperties\n );\n\n return await uploadAttachmentContent(attachments);\n}\n\nasync function uploadAttachmentContent(attachments: Attachment[]) {\n if (attachments.length === 0) {\n return [];\n }\n\n for (const attachment of [...attachments]) {\n const attachmentSize = attachment.size > 0 ? attachment.size / 1024 : 0;\n const request: ValidateFileRequest = {\n FileName: attachment.name,\n SizeKb: attachmentSize,\n };\n\n console.log(\n TAG,\n 'Validating attachment with Darzin API',\n attachment.name,\n attachment.size\n );\n\n const isValid = await Api.validateAttachment(request);\n if (!isValid) {\n const index = attachments.indexOf(attachment);\n attachments.splice(index, 1);\n console.log(TAG, 'Attachment is invalid');\n } else {\n console.log(TAG, 'Attachment is valid');\n }\n }\n\n const response = await Api.uploadOutlookAttachments({\n attachments: attachments.filter((a) => !a.isInline),\n });\n\n const responsesByAttachment: OutlookAttachmentResponseDTO[] =\n response.ResponsesByAttachment || [];\n\n const attachmentIds = responsesByAttachment\n .filter((a) => a.IsSuccess)\n .map((a) => a.FileID);\n\n return attachmentIds;\n}\n\nexport async function createOrUpdateStakeholder(stakeholder: Stakeholder) {\n let stakeholderId = await Api.findStakeholder(stakeholder);\n\n // if stakeholder already exists, assign his ID to request\n // so stakeholder with this ID will be updated\n if (stakeholderId != '0') {\n // eslint-disable-next-line require-atomic-updates\n stakeholder.ID = stakeholderId;\n await Api.mergeStakeholderInfo(stakeholder);\n } else {\n stakeholderId = await Api.saveStakeholder(stakeholder);\n }\n\n return stakeholderId;\n}\n","import { Exception } from '../Exception';\n\nexport class ApiException extends Exception {\n constructor(message: string) {\n super(message);\n }\n}\n","import { Exception } from '../Exception';\n\nexport class ApplicationException extends Exception {\n originalException: unknown;\n constructor(message: string, originalException?: unknown) {\n super(message, originalException);\n }\n}\n","import { Exception } from '../Exception';\nexport class ItemIsNotSavedException extends Exception {\n constructor() {\n super();\n }\n}\n","import { Exception } from '../Exception';\n\nexport class MeetingAlreadySavedException extends Exception {\n constructor() {\n super();\n }\n}\n","import { Exception } from '../Exception';\nexport class AuthException extends Exception {\n constructor(message: string) {\n super(message);\n }\n}\n","import { Exception } from '../Exception';\n\nexport default class AuthInvalidGrantException extends Exception {\n constructor(originalException: unknown) {\n const message = `OAuth invalid_grant: refresh token is probably expired`;\n super(message, originalException);\n }\n}\n","import { Exception } from '../Exception';\nexport class ConnectionException extends Exception {\n constructor(message: string) {\n super(message);\n }\n}\n","import { Exception } from '../Exception';\n\nexport class ForbiddenException extends Exception {\n constructor(message: string) {\n super(message);\n }\n}\n","import { Exception } from '../Exception';\n\nexport class InternalServerException extends Exception {\n constructor(originalException: unknown) {\n super(undefined, originalException);\n }\n}\n","import { Exception } from '../Exception';\n\nexport class UnknownHttpException extends Exception {\n constructor(originalException: unknown) {\n super(undefined, originalException);\n }\n}\n","import { Exception } from 'common/exceptions/Exception';\n\nexport class OutlookApiException extends Exception {\n apiResponse: unknown;\n constructor(message: string, apiResponse: unknown) {\n super(message);\n this.apiResponse = apiResponse;\n }\n}\n","import { Exception } from '../Exception';\n\nexport class OutlookException extends Exception {\n constructor(message: string, error: Office.Error) {\n super(message, error);\n }\n}\n","import { Exception } from '../Exception';\nexport class OutlookItemNotSupported extends Exception {\n constructor() {\n super();\n }\n}\n","import { Exception } from '../Exception';\n\n/** An existing bug in Outlook Web can cause the Outlook server to respond with \"GenericResponseError\"\n * when user selects an appointment in his inbox after he selects a message,\n * and our app tries to perform any operation on the selected item\n * REF: https://github.com/OfficeDev/office-js/issues/1869 */\nexport class OutlookWrongItemSelectedException extends Exception {\n constructor(error: Office.Error) {\n const message =\n \"This error might occur when selected outlook item has changed to an item that isn't supported.\" +\n 'Please try to select a different item. If the issue persist, contact our support.';\n super(message, error);\n }\n}\n","/*\n * Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n * See LICENSE in the project root for license information.\n */\n\nimport CONFIG from 'config';\nimport 'core-js/stable';\nimport $ from 'jquery';\nimport 'select2';\nimport * as App from './app/app';\nimport { errorHandler } from './app/errorHandler';\nimport * as AppOptions from './app/options';\nimport { ApplicationException } from './exceptions/application/ApplicationException';\nimport { PermissionDialogResult } from './models/PermissionDialogResult';\nimport './scss/main.scss';\nimport * as Auth from './utils/authUtils';\nimport { Authenticator } from './utils/office-js-helpers/Authenticator';\nimport { sleep } from './utils/sleep';\nimport * as Ui from './utils/uiUtils';\nimport * as UserSettings from './utils/user-settings';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(window as any).$ = (window as any).jQuery = $;\n\nconst TAG = 'IDX3: ';\n\nlet selectDomain = '';\n/** handleProjectChanged is triggered by refreshDomains() in showStakeholdersForm().\n * because handleProjectChanged can take longer than showStakeholdersForm(),\n * showStakeholdersForm() might hide the loader before handleProjectChanged is finished.\n * this flag is to fix this\n */\nlet processingProjectChange = false;\nlet isProjectOptionsUpdated = false;\n\nOffice.initialize = handleOfficeInitialize;\n\nasync function handleOfficeInitialize() {\n if (Authenticator.isAuthDialog()) return;\n\n const version = 'Version 2022-05-10 13:41';\n console.log(version);\n if (CONFIG.enableDemoAPIRegion) {\n $('#version').html(version);\n $('#version').show();\n }\n\n $('#app-body').show();\n Ui.setAppName(CONFIG.appName);\n Ui.setFreeTrialUrl(CONFIG.freeTrialUrl);\n Ui.setIcon(CONFIG.appIcon, CONFIG.appIconWidth);\n Ui.setOptions(\n CONFIG.isComplaintsEnabled,\n CONFIG.isConfidentialOptionsEnabled\n );\n UserSettings.setAutosave(true);\n Ui.showRegions(CONFIG.regions);\n selectDomain = UserSettings.getDomain();\n\n $('#open-login-pg').click(handleSignInClick);\n\n // NOTE: asynchronous token checks should be performed after all events are hooked,\n // otherwise UI can be unresponsive and Permission Dialog can be messed up\n if (Auth.isTokenExpired()) {\n try {\n await Auth.refreshToken();\n } catch (error) {\n // no need to process this error because we'll check if token is valid in next function\n console.log(TAG, 'error refreshing token ', JSON.stringify(error));\n }\n }\n await handleSelectedOutlookItemChanged();\n}\n\nOffice.onReady(function () {\n // Office is ready\n $(document).ready(function () {\n handleDocumentReady();\n });\n});\n\nfunction handleDocumentReady() {\n Office.context.mailbox.addHandlerAsync(\n Office.EventType.ItemChanged,\n handleSelectedOutlookItemChanged\n );\n\n $('#item-contact-group').select2({ width: 'style' });\n\n $('#logout').on('click', handleLogoutClick);\n $('#login-pop-close').click(handleLoginConfirmClick);\n $('#detail-pop-close, #detail-pop-close2').click(handleSaveCancelClick);\n // Detail Page Scripts\n $(document).on(\n 'change',\n '#select-individual-main',\n handleStakeholderTypeChange\n );\n $(document).on(\n 'change',\n '.cc-bcc-single-details select',\n handleAdditionalStakeholderTypeChanged\n );\n $('#save-email-detail').click(handleSaveClick);\n $('#save-email-detail2').click(handleSaveClick);\n $('#detail-save-pop-close').click(handleSavedDialogCloseClick);\n $('#detail-save-error-close').click(handleSessionExpiredDialogOkClick);\n $('#error__btn-ok').click(handleErrorDialogCloseClick);\n $('#error__btn-details').click(handleErrorDialogDetailsClick);\n $('#dialog-info-btn-ok').click(handleInfoDialogOkClick);\n $('#dialog-logout-success-btn-ok').click(handleLogoutSuccessDialogOkClick);\n $('#save-proj-group').on('change', handleProjectGroupChange);\n $('#save-domain').on('change', handleDomainChange);\n $('#save-project').on('change', handleProjectChanged);\n $('#item-assigned-to').on('change', handleItemAssignedToChange);\n $('#complaint-priorities').on('change', handleComplaintPriorityChange);\n $('input[name=\"AutoSave\"]').on('click', handleAutosaveOptionClick);\n $('#add-to-darzin').on('click', handleAutosaveOptionChosen);\n $('#item-communication').on('change', handleEmailTypeChange);\n}\n\nasync function handleSelectedOutlookItemChanged() {\n $('#loader').show();\n\n console.log(\n TAG,\n 'Selected Outlook Item Changed: ',\n Office.context.mailbox.item\n ? Office.context.mailbox.item.subject\n : 'undefined'\n );\n\n if (!Auth.isTokenValid()) {\n $('#loader').hide();\n Ui.hidePages();\n $('#welcome-pg').show();\n return;\n }\n\n const item = Office.context.mailbox.item;\n $('#loader').show();\n Ui.hideSaveSuccessfulDialog();\n Ui.hidePages();\n await App.startAutosaveTimer(item);\n await App.tryStart(item);\n $('#loader').hide();\n}\n\nlet permissionDialog: Office.Dialog;\nfunction handleSignInClick() {\n const domainElement = $('#select-domain-login').val();\n\n if (!domainElement || !domainElement.toString()) return;\n\n console.log(TAG, 'Displaying permission dialog', domainElement);\n Office.context.ui.displayDialogAsync(\n CONFIG.urls.origin + 'permission-dialog.html',\n { height: 60, width: 40, promptBeforeOpen: false },\n onPermissionDialogLoad\n );\n}\n\nfunction onPermissionDialogLoad(\n asyncResult: Office.AsyncResult\n) {\n console.log(TAG, 'Permission dialog has loaded');\n try {\n if (asyncResult.error) {\n throw new ApplicationException(\n 'An error occurred in Permission Dialog',\n asyncResult.error\n );\n } else if (!asyncResult.value) {\n throw new ApplicationException(\n 'An error occurred in Permission Dialog: invalid reference to the dialog',\n asyncResult.error\n );\n } else {\n permissionDialog = asyncResult.value;\n permissionDialog.addEventHandler(\n Office.EventType.DialogMessageReceived,\n onPermissionDialogResult\n );\n }\n } catch (error) {\n errorHandler(error, 'Failed to load permission dialog');\n }\n}\n\nasync function onPermissionDialogResult(arg) {\n console.log(TAG, 'Processing Permission Dialog result', arg);\n try {\n permissionDialog.close();\n // wait for dialog.close to be processed, otherwise sign-in dialog wouldn't open\n await sleep(500);\n const permissionDialogResult = JSON.parse(\n arg.message\n ) as PermissionDialogResult;\n\n if (permissionDialogResult.permissionGranted) {\n handleSignInPermissionAllowedClick();\n }\n } catch (error) {\n errorHandler(error, 'Failed to process permission dialog result');\n }\n}\n\nasync function handleSignInPermissionAllowedClick() {\n console.log(TAG, 'Permissions were granted to the app, signing in...');\n $('#loader').show();\n try {\n $('#open-login-pg-error').html('');\n\n selectDomain = $('#select-domain-login').val().toString();\n // remove extra '/': it might cause request errors in some browsers? not confirmed\n selectDomain += '/';\n if (selectDomain.endsWith('/')) {\n selectDomain = selectDomain.slice(0, selectDomain.length - 1);\n }\n console.log(TAG, 'Setting domain ', selectDomain);\n UserSettings.setDomain(selectDomain);\n\n if (!selectDomain) {\n $('#select-domain-login-error').html('Please Select Region');\n $('#select-domain-login').focus();\n return;\n }\n\n // REF: https://github.com/OfficeDev/office-js-helpers#authentication\n const authenticator = new Authenticator({\n baseUrl: selectDomain,\n authorizeUrl: '/authorize',\n clientId: CONFIG.auth.client_id,\n redirectUrl: CONFIG.urls.form,\n scope: 'openid',\n responseType: 'code',\n extraQueryParameters: {\n login_hint: Office.context.mailbox.userProfile.emailAddress,\n },\n });\n\n const response = await authenticator.authenticate();\n await Auth.getToken(selectDomain, response.code);\n\n await Auth.refreshClientCode();\n\n // because token can't be refreshed if project isn't selected,\n // we'll select first available project and refresh token for it\n const projectId = await App.selectAnyProjectId();\n if (projectId) {\n UserSettings.setProject(projectId);\n await Auth.refreshToken();\n }\n } catch (error) {\n if (error.innerError == '12006') {\n console.log(TAG, 'Dialog was closed');\n } else {\n errorHandler(error, 'Authorization failed');\n }\n $('#loader').hide();\n return;\n }\n\n await handleSelectedOutlookItemChanged();\n $('#loader').hide();\n}\n\nfunction handleLoginConfirmClick() {\n $('#login-pop').hide();\n $('#login-page').hide();\n $('#detail-page').show();\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function handleAutosaveOptionClick(e: any) {\n UserSettings.setAutosave(e.target.value === 'auto_save');\n await handleAutosaveOptionChosen();\n}\n\nasync function handleAutosaveOptionChosen() {\n $('#detail-page').hide();\n $('#detail-final').show();\n\n $('#loader').show();\n\n // this will trigger handleProjectChanged,\n // which will refresh project options\n try {\n await App.refreshDomains();\n } catch (error) {\n errorHandler(error, `Failed to refresh client's domain list`);\n }\n\n // if domains or project groups are disabled, handleProjectChanged() will not be triggered by refreshDomains()\n // trigger it here so project options and token will be updated\n if (!isProjectOptionsUpdated) {\n $('#save-project').trigger('change');\n }\n const item = Office.context.mailbox.item;\n if (item) {\n await App.showStakeholdersForm(item);\n }\n if (!processingProjectChange) {\n $('#loader').hide();\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction handleDomainChange(event: any) {\n const domainId = event.target.value;\n const selectedDomain = App.domains.find(function (domain) {\n return domain.ID == domainId;\n });\n if (selectedDomain) {\n $('#save-proj-group').html('');\n $('#save-project').html('');\n if (App.projectGroupAvailable) {\n $('#ProjectGroupContainer').show();\n let projectGroupOption = '';\n const singleProjectGroup = selectedDomain.ProjectGroups.length === 1;\n if (!singleProjectGroup) {\n projectGroupOption =\n '';\n }\n for (let j = 0; j < selectedDomain.ProjectGroups.length; j++) {\n const group = selectedDomain.ProjectGroups[j];\n // skip groups without accessible projects\n if (!group.Projects || !group.Projects.length) continue;\n projectGroupOption +=\n '';\n }\n $('#save-proj-group').html(projectGroupOption);\n // if there is only one group, select it.\n if (singleProjectGroup) {\n $('#save-proj-group').trigger('change');\n } else {\n // if there are multiple groups, prompt user to select project\n const emptyProjectOption =\n '';\n $('#save-project').html(emptyProjectOption);\n }\n } else {\n $('#ProjectGroupContainer').hide();\n let projectOption = '';\n const singleProject = selectedDomain.Projects.length === 1;\n for (let j = 0; j < selectedDomain.Projects.length; j++) {\n const dataProject = selectedDomain.Projects[j];\n projectOption +=\n '';\n }\n $('#save-project').html(projectOption);\n if (singleProject) {\n $('#save-project').trigger('change');\n }\n }\n }\n}\n\nasync function handleProjectChanged(event) {\n // deselect because otherwise will interfere with mouse wheel scroll\n $('#save-project').blur();\n\n const projectId = event.target.value;\n\n // if no project is selected, we can't refresh tokens\n if (CONFIG.appName === 'Darzin') if (!projectId) return;\n\n processingProjectChange = true;\n\n $('#loader').show();\n\n UserSettings.setProject(projectId);\n\n try {\n await Auth.refreshToken();\n\n const optionPromises = [AppOptions.refreshContactGroups()];\n if (CONFIG.isConfidentialOptionsEnabled) {\n optionPromises.push(AppOptions.refreshConfidentialities());\n optionPromises.push(AppOptions.refreshUsers());\n optionPromises.push(AppOptions.refreshPriorities());\n optionPromises.push(AppOptions.refreshComplaintStatuses());\n }\n await Promise.all(optionPromises);\n } catch (error) {\n errorHandler(error, 'Failed to get project options');\n }\n\n $('#project-error').html('');\n $('#loader').hide();\n processingProjectChange = false;\n isProjectOptionsUpdated = true;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction handleProjectGroupChange(event: any) {\n $('#loader').show();\n $('#project-group-error').html('');\n let projectOption = '';\n const value = event.target.value;\n let singleProject = false;\n App.domains.forEach(function (domain) {\n const selectedProjectGroup = domain.ProjectGroups.find(function (\n projectGroup\n ) {\n return projectGroup.ID == value;\n });\n if (selectedProjectGroup) {\n if (selectedProjectGroup.Projects.length === 1) {\n singleProject = true;\n } else {\n projectOption =\n '';\n }\n selectedProjectGroup.Projects.forEach(function (project) {\n projectOption +=\n '';\n });\n }\n });\n $('#loader').hide();\n $('#save-project').html(projectOption);\n if (singleProject) {\n $('#save-project').trigger('change');\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction handleEmailTypeChange(e: any) {\n if (e.target.value == 'Communication') {\n $('.communication-method').show();\n $('.item-assigned-to-main').hide();\n $('.complaint-priorities-main').hide();\n $('.complaint-statuses-main').hide();\n } else {\n // $('.communication-method').hide()\n $('.item-assigned-to-main').show();\n $('#item-assigned-to-error').html('');\n $('#complaint-priorities-error').html('');\n if ($('#complaint-priorities').html()) {\n $('.complaint-priorities-main').show();\n $('.complaint-statuses-main').show();\n } else {\n $('.complaint-priorities-main').hide();\n $('.complaint-statuses-main').hide();\n }\n }\n}\n\nfunction handleItemAssignedToChange() {\n $('#item-assigned-to-error').html('');\n}\n\nfunction handleComplaintPriorityChange() {\n $('#complaint-priorities-error').html('');\n}\n\nfunction handleStakeholderTypeChange() {\n if ($(this).find(':selected').val() == 'Individual') {\n $('#select-individual-main-detail').show();\n $('#item-org2').parent().parent('.form-group').hide();\n } else {\n $('#select-individual-main-detail').hide();\n $('#item-org2').parent().parent('.form-group').show();\n }\n}\n\nfunction handleAdditionalStakeholderTypeChanged() {\n const pTable = $(this).parent().parent().parent().parent(); // prettier-ignore\n if ($(this).find(':selected').val() == 'Individual') {\n pTable.find('.table-indi-fields').show();\n pTable.find('.table-org-fields').hide();\n } else {\n pTable.find('.table-indi-fields').hide();\n pTable.find('.table-org-fields').show();\n }\n}\n\nasync function handleSaveClick() {\n if (!Ui.checkSaveForm()) {\n return;\n }\n\n const item = Office.context.mailbox.item;\n if (item) {\n $('#loader').show();\n await App.trySaveMessage(item);\n $('#loader').hide();\n }\n}\n\nfunction handleSaveCancelClick() {\n $('#detail-final').hide();\n $('#detail-page').show();\n}\n\nfunction handleLogoutClick() {\n App.logout();\n}\n\nfunction handleErrorDialogCloseClick() {\n $('#error-dialog').hide();\n}\n\nfunction handleErrorDialogDetailsClick() {\n $('#error__message-details').show();\n $('#error__btn-details').hide();\n}\n\nfunction handleInfoDialogOkClick() {\n Ui.hideInfoDialog();\n}\n\nfunction handleLogoutSuccessDialogOkClick() {\n $('#loader').show(); // will be reset to hidden after window reloaded\n $('#dialog-logout-success').hide();\n window.location.reload();\n}\n\nasync function handleSavedDialogCloseClick() {\n Ui.hideSaveSuccessfulDialog();\n Ui.hideDocumentDetailsPage();\n\n await handleSelectedOutlookItemChanged();\n}\n\nfunction handleSessionExpiredDialogOkClick() {\n $('#loader').show(); // will be reset to hidden after window reloaded\n $('#detail-save-error').hide();\n window.location.reload();\n}\n","export class CommunicationTemplate {\n Confidential: { Value: string } = null;\n AssignedTo: { Value: string } = null;\n Priority: { Value: string } = null;\n Status: { Value: string } = null;\n}\n","import { toIsoWithTimeZone } from './../utils/dateUtils';\nimport { CommunicationTemplate } from './CommunicationTemplate';\nimport { Stakeholder } from './Stakeholder';\nexport class ContactCustomFields {\n private template: CommunicationTemplate;\n\n clientId: string;\n domainUrl: string;\n projectId: string;\n emailType: string;\n stakeholder: Stakeholder;\n startDate: string;\n updateDate: string;\n\n get startAutosaveDate() {\n return this.startDate ? new Date(this.startDate) : new Date('2000-01-01');\n }\n\n set startAutosaveDate(value: Date) {\n this.startDate = toIsoWithTimeZone(value);\n }\n\n get lastSyncDate() {\n return new Date(this.updateDate);\n }\n\n set lastSyncDate(value: Date) {\n this.updateDate = toIsoWithTimeZone(value);\n }\n\n get communicationTemplate() {\n return this.template;\n }\n\n set communicationTemplate(template: CommunicationTemplate) {\n const cleanTemplate = new CommunicationTemplate();\n\n for (const key in cleanTemplate) {\n // eslint-disable-next-line no-prototype-builtins\n if (!cleanTemplate.hasOwnProperty(key) || !template[key]) continue;\n cleanTemplate[key] = template[key];\n }\n\n this.template = cleanTemplate;\n }\n}\n","import { ApiException } from 'common/exceptions/application/ApiException';\nimport { MeetingAlreadySavedException } from 'common/exceptions/application/MeetingAlreadySavedException';\nimport { EnsureEmailSubjectIsNotExcludedRequest } from 'common/models/EnsureEmailSubjectIsNotExcludedRequest';\nimport { EnsureEmailSubjectIsNotExcludedResponse } from 'common/models/EnsureEmailSubjectIsNotExcludedResponse';\nimport { FindDuplicateEmailOrMeetingResponse } from 'common/models/FindDuplicateEmailOrMeetingResponse';\nimport { FindDuplicateEmailRequest } from 'common/models/FindDuplicateEmailRequest';\nimport { FindDuplicateMeetingRequest } from 'common/models/FindDuplicateMeetingRequest';\nimport { GetClientCodeResponse } from 'common/models/GetClientCodeResponse';\nimport { UploadOutlookAttachmentResponse } from 'common/models/UploadOutlookAttachmentResponse';\nimport { ValidateFileRequest } from 'common/models/ValidateFileRequest';\nimport { VitallyTrackDTO } from 'common/models/VitallyTrackDTO';\nimport { Complaint } from '../models/Complaint';\nimport { GetDomainListResponse } from '../models/GetDomainListResponse';\nimport { Interaction } from '../models/Interaction';\nimport { LinkEntitiesRequest } from '../models/LinkEntitiesRequest';\nimport { Option } from '../models/Option';\nimport { SaveCommunicationResponse } from '../models/SaveInteractionResponse';\nimport { Stakeholder } from '../models/Stakeholder';\nimport { UploadOutlookAttachmentRequest } from '../models/UploadOutlookAttachmentRequest';\nimport { ApiResponse } from './../models/ApiResponse';\nimport { SaveEntityApiResponse } from './../models/SaveEntityApiResponse';\nimport * as Http from './http';\nimport * as UserSettings from './user-settings';\n\nconst TAG = 'API3: ';\n\nexport async function getDirectionFromServer(outlookItemDirection: string) {\n const response = await Http.get(\n UserSettings.getDomain() + '/common/directions'\n );\n\n const localizedDirections = response as [];\n\n const serverDirection = localizedDirections.find(\n (d: Option) => d.Text === outlookItemDirection\n );\n\n const direction = serverDirection || {\n Value: outlookItemDirection,\n };\n\n return direction;\n}\n\nexport async function ensureEmailSubjectIsNotExcluded(\n request: EnsureEmailSubjectIsNotExcludedRequest\n) {\n console.log(TAG, 'Checking if subject is in exclusion list', request);\n const response = (await Http.post(\n UserSettings.getDomain() +\n '/email-plugin-exclusion/ensure-email-subject-is-not-excluded',\n request\n )) as EnsureEmailSubjectIsNotExcludedResponse;\n\n if (!response.Success) {\n throw new ApiException(\n 'Failed to check if subject is in exclusion list: ' + response.Message\n );\n }\n\n return response.IsSubjectExcluded;\n}\n\nexport async function findDuplicateEmail(request: FindDuplicateEmailRequest) {\n console.log(TAG, 'Searching for duplicate email', request);\n const response = (await Http.post(\n UserSettings.getDomain() + '/email-duplicate-check/find-duplicate-email',\n request\n )) as FindDuplicateEmailOrMeetingResponse;\n\n if (!response.Success) {\n throw new ApiException(\n 'Failed to search for duplicate email: ' + response.Message\n );\n }\n\n return response;\n}\n\nexport async function findDuplicateMeeting(\n request: FindDuplicateMeetingRequest\n) {\n console.log(TAG, 'Searching for duplicate meeting', request);\n const response = (await Http.post(\n UserSettings.getDomain() +\n '/meeting-duplicate-check/find-duplicate-meeting',\n request\n )) as FindDuplicateEmailOrMeetingResponse;\n\n if (!response.Success) {\n throw new ApiException(\n 'Failed to search for duplicate meeting: ' + response.Message\n );\n }\n\n return response;\n}\n\nexport async function saveInteraction(interaction: Interaction) {\n console.log(TAG, 'Saving interaction ', interaction);\n const response = await Http.post(\n UserSettings.getDomain() + '/interaction/save',\n interaction\n );\n\n if (!response.Success) {\n if (response.ErrorCode === 'MeetingWithSameUidsAlreadyExists') {\n throw new MeetingAlreadySavedException();\n }\n throw new ApiException('Failed to save interaction: ' + response.Message);\n }\n\n return response.EntityID;\n}\n\nexport async function saveComplaint(complaint: Complaint) {\n console.log(TAG, 'Saving complaint ', complaint);\n const response = await Http.post(\n UserSettings.getDomain() + '/complaint/save',\n complaint\n );\n\n if (!response.Success)\n throw new ApiException('Failed to save complaint: ' + response.Message);\n\n return response.EntityID;\n}\n\nexport async function linkInteractionToStakeholders(\n interactionId: string,\n stackHolderIds: string[]\n) {\n const request: LinkEntitiesRequest = {\n LinkEntityType: 'InteractionToStakeholder',\n LinkID: interactionId,\n ToIDs: stackHolderIds,\n LinkPropertyAndStakholder: true,\n };\n await linkEntities(request);\n}\n\nexport async function linkComplaintToStakeholders(\n complaintId: string,\n stackHolderIds: string[]\n) {\n const request: LinkEntitiesRequest = {\n LinkEntityType: 'ComplaintToStakeholder',\n LinkID: complaintId,\n ToIDs: stackHolderIds,\n LinkPropertyAndStakholder: true,\n };\n await linkEntities(request);\n}\n\nexport async function linkInteractionToAttachments(\n interactionId: string,\n attachmentIds: string[]\n) {\n const request: LinkEntitiesRequest = {\n LinkEntityType: 'InteractionToFile',\n LinkID: interactionId,\n ToIDs: attachmentIds,\n LinkPropertyAndStakholder: true,\n };\n await linkEntities(request);\n}\n\nexport async function linkComplaintToAttachments(\n interactionId: string,\n attachmentIds: string[]\n) {\n const request: LinkEntitiesRequest = {\n LinkEntityType: 'ComplaintToFile',\n LinkID: interactionId,\n ToIDs: attachmentIds,\n LinkPropertyAndStakholder: true,\n };\n await linkEntities(request);\n}\n\nexport async function linkEntities(request: LinkEntitiesRequest) {\n const response = await Http.post(\n UserSettings.getDomain() + '/link/linkentity',\n request\n );\n if (!response.Success)\n throw new ApiException(\n `Failed to link entities of type ${request.LinkEntityType}: ` +\n response.Message\n );\n}\n\nexport async function validateAttachment(request: ValidateFileRequest) {\n const response = await Http.post(\n UserSettings.getDomain() + '/file-v2/validate-file',\n request\n );\n\n if (!response.Success) {\n const fileInvalid =\n (response.Message as string).toLowerCase().indexOf('file is invalid') !==\n -1;\n if (fileInvalid) {\n return false;\n } else {\n throw new ApiException(\n 'Failed to validate attachment: ' + response.Message\n );\n }\n }\n\n return true;\n}\n\nexport async function uploadOutlookAttachments(\n request: UploadOutlookAttachmentRequest\n) {\n const response = await Http.post(\n UserSettings.getDomain() + '/file-v2/upload-outlook-attachment',\n request\n );\n\n if (!response.Success) {\n throw new ApiException(\n 'Failed to process upload attachment response: ' + response.Message\n );\n }\n const responsesByAttachment = response.ResponsesByAttachment || [];\n const failedAttachments = responsesByAttachment\n .filter((a) => !a.IsSuccess)\n .map((a) => a.FileName);\n\n if (failedAttachments.length > 0) {\n const message =\n 'Failed to upload File(s): ' + failedAttachments.join(', ') + +' \\r\\n';\n JSON.stringify(response);\n throw new ApiException(message);\n }\n\n return response;\n}\n\nexport async function getContactGroups() {\n return await getOptions('/common/contactgroups');\n}\n\nexport async function getConfidentialities() {\n return await getOptions('/common/confidentialities');\n}\n\nexport async function getStatuses() {\n return await getOptions('/common/actionandcomplaintstatus');\n}\n\nexport async function getUsers() {\n return await getOptions('/common/users');\n}\n\nexport async function getPriorities() {\n return await getOptions('/common/priorities');\n}\n\nasync function getOptions(url: string) {\n const response = await Http.get(UserSettings.getDomain() + url, true);\n if (!Array.isArray(response)) {\n return [];\n }\n return response as Option[];\n}\n\nexport async function getClientCode() {\n const response = await Http.get(\n UserSettings.getDomain() + '/Domain/ClientCode',\n false\n );\n if (!response.Success || !response.ClientCode) {\n throw new ApiException('Failed to get client code: ' + response.Message);\n }\n return response.ClientCode;\n}\n\nexport async function getDomainList() {\n console.log(\n TAG,\n 'Requesting domain list ',\n UserSettings.getDomain(),\n UserSettings.getDomain() + '/Domain/list'\n );\n const response = await Http.get(\n UserSettings.getDomain() + '/Domain/list',\n true\n );\n\n return response;\n}\n\nexport async function findStakeholder(stakeholder: Stakeholder) {\n let checkUrl = UserSettings.getDomain() + '/stakeholder/find?';\n if (stakeholder.FirstName != '') {\n checkUrl = checkUrl + 'firstName=' + stakeholder.FirstName + '&';\n }\n if (stakeholder.LastName != '') {\n checkUrl = checkUrl + 'lastName=' + stakeholder.LastName + '&';\n }\n checkUrl = checkUrl + 'email=' + stakeholder.Email;\n checkUrl = checkUrl + '&stakeholderType=' + stakeholder.StakeholderType;\n\n const response = await Http.get(checkUrl);\n\n if (response instanceof Object) {\n throw new ApiException(\n `Failed to search for stakeholder ${stakeholder.Email}: ` +\n response.Message\n );\n }\n\n return response as string;\n}\n\nexport async function saveStakeholder(stakeholder: Stakeholder) {\n const response = await Http.post(\n UserSettings.getDomain() + '/stakeholder/save',\n stakeholder\n );\n\n if (!response.Success) {\n throw new ApiException(\n `Failed to save stakeholder ${stakeholder.Email}: ` + response.Message\n );\n }\n\n return response.EntityID;\n}\n\nexport async function mergeStakeholderInfo(stakeholder: Stakeholder) {\n const response = await Http.post(\n UserSettings.getDomain() + '/stakeholder/mergeInfo',\n stakeholder\n );\n\n if (!response.Success) {\n throw new ApiException(\n `Failed to save stakeholder ${stakeholder.Email}: ` + response.Message\n );\n }\n return response.EntityID;\n}\n\nexport async function trackVitallyEvent(dto: VitallyTrackDTO) {\n const success = await Http.post(\n UserSettings.getDomain() + '/vitally/track',\n dto\n );\n\n return success;\n}\n","import CONFIG from 'config';\nimport * as Api from './api';\nimport * as Http from './http';\nimport { sleep } from './sleep';\nimport * as UserSettings from './user-settings';\n\nconst TAG = 'AUT3: ';\n\nlet isRefreshingToken = false;\n\nexport function isTokenValid(): boolean {\n return UserSettings.getToken() && !isTokenExpired();\n}\n\nexport function isTokenExpired(): boolean {\n if (!UserSettings.getToken()) {\n return false;\n }\n\n return !(new Date() < new Date(UserSettings.getTokenExpire()));\n}\n\nexport async function getToken(domain: string, code: string) {\n console.log(TAG, 'Retrieving token');\n\n const payload = {\n grant_type: 'authorization_code',\n client_id: CONFIG.auth.client_id,\n client_secret: CONFIG.auth.client_secret,\n code: code,\n redirect_uri: CONFIG.urls.form,\n };\n\n const response = await Http.postForm(domain + '/token', payload);\n\n console.log(TAG, 'Token retrieved ');\n\n UserSettings.setTokenExpire(response['.expires']);\n UserSettings.setToken(response['access_token']);\n UserSettings.setRefreshToken(response['refresh_token']);\n}\n\nexport async function refreshToken() {\n console.log(TAG, 'Refreshing token for project ', UserSettings.getProject());\n\n while (isRefreshingToken) {\n console.log(TAG, 'Token refresh is in progress, waiting');\n await sleep(100);\n }\n\n isRefreshingToken = true;\n try {\n const payload = {\n grant_type: 'refresh_token',\n client_id: CONFIG.auth.client_id,\n client_secret: CONFIG.auth.client_secret,\n refresh_token: UserSettings.getRefreshToken(),\n redirect_uri: CONFIG.urls.form,\n };\n\n if (UserSettings.getProject()) {\n payload['ProjectIDs'] = UserSettings.getProject();\n }\n\n const response = await Http.postForm(\n UserSettings.getDomain() + '/token',\n payload\n );\n\n console.log(TAG, 'Token refreshed ');\n\n UserSettings.setTokenExpire(response['.expires']);\n UserSettings.setToken(response['access_token']);\n UserSettings.setRefreshToken(response['refresh_token']);\n } finally {\n isRefreshingToken = false;\n }\n}\n\n/** Retrieves client code and saves it to UserSettings */\nexport async function refreshClientCode() {\n try {\n const clientCode = await Api.getClientCode();\n console.log(TAG, 'Client code ', clientCode);\n UserSettings.setClientCode(clientCode);\n } catch (error) {\n console.log(TAG, 'Failed to retrieve client code. Not supported?', error);\n }\n}\n","/* global Office */\nimport { OutlookItemNotSupported } from 'common/exceptions/outlook/OutlookItemNotSupported';\nimport { AddInStakeholder } from '../models/AddInStakeholder';\nimport { getAsyncOrganizer, getAsyncRecipients } from './outlookAsyncUtils';\nimport { getUserEmail, isAppointmentReadMode } from './outlookItemUtils';\nimport { SupportedOfficeItem } from './SupportedOfficeItem';\n\nexport function getAllPartiesFromMessage(outlookItem: Office.MessageRead) {\n let addresses: Office.EmailAddressDetails[] = [];\n\n const message = outlookItem as Office.MessageRead;\n if (outlookItem.from.emailAddress) {\n addresses.push(outlookItem.from);\n }\n addresses.push(...message.to);\n addresses.push(...message.cc);\n\n // TODO: in read mode there is no bcc?\n //if (outlookItem.bcc) {\n //addresses.push(...await getRecipients(outlookItem.bcc));\n //}\n\n addresses = removeDuplicatesByEmail(addresses);\n return addresses;\n}\n\nexport async function getAllPartiesFromAppointment(\n appointment: Office.AppointmentRead & Office.AppointmentCompose\n) {\n let addresses: Office.EmailAddressDetails[] = [];\n\n if (isAppointmentReadMode(appointment)) {\n const appointmentRead = appointment as Office.AppointmentRead;\n\n addresses.push(...appointmentRead.requiredAttendees);\n addresses.push(...appointmentRead.optionalAttendees);\n } else {\n const appointmentCompose = appointment as Office.AppointmentCompose;\n\n addresses.push(\n ...(await getAsyncRecipients(appointmentCompose.requiredAttendees))\n );\n addresses.push(\n ...(await getAsyncRecipients(appointmentCompose.optionalAttendees))\n );\n\n // On Outlook desktop, all Appointments to which user didn't add any attendees,\n // will still have appointment organizer in required attendees list.\n // On Outlook Online it isn't the case, and newly created Appointment will not have any attendees.\n // We'll solve this by adding the organizer ourselves.\n if (addresses.length === 0 && appointmentCompose.organizer) {\n const organizer = await getAsyncOrganizer(appointmentCompose.organizer);\n addresses.push(organizer);\n }\n }\n\n addresses = removeDuplicatesByEmail(addresses);\n return addresses;\n}\n\nexport async function getPrimaryStakeholders(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n): Promise {\n const primaryStakeholders: AddInStakeholder[] = [];\n\n if (item.itemType === 'message') {\n const all = await getAllStakeholders(item, sharedProperties);\n if (all) primaryStakeholders.push(all[0]);\n } else if (item.itemType === 'appointment') {\n const all = await getAllParties(item);\n primaryStakeholders.push(...all);\n } else {\n throw new OutlookItemNotSupported();\n }\n\n if (!primaryStakeholders) {\n primaryStakeholders.push({\n email: 'No stakeholders',\n fullName: 'No stakeholders',\n ...getFirstAndLastName(''),\n });\n }\n\n return primaryStakeholders;\n}\n\nexport async function getAdditionalStakeholders(\n officeItem: Office.MessageRead &\n Office.AppointmentRead &\n Office.AppointmentCompose,\n sharedProperties: Office.SharedProperties | undefined\n) {\n if (officeItem.itemType === 'appointment') {\n return [];\n }\n const stakeholders = await getAllStakeholders(officeItem, sharedProperties);\n return stakeholders.slice(1);\n}\n\nexport async function getAllStakeholders(\n officeItem: Office.MessageRead &\n Office.AppointmentRead &\n Office.AppointmentCompose,\n sharedProperties: Office.SharedProperties | undefined\n) {\n const userEmail = getUserEmail(sharedProperties);\n\n let parties = await getAllParties(officeItem);\n if (parties.length > 1) {\n parties = parties.filter((a) => a.email !== userEmail);\n }\n return parties;\n}\n\nasync function getAllParties(\n officeItem: Office.MessageRead &\n Office.AppointmentRead &\n Office.AppointmentCompose\n) {\n let addresses: Office.EmailAddressDetails[];\n if (officeItem.itemType === 'message')\n addresses = getAllPartiesFromMessage(officeItem as Office.MessageRead);\n else if (officeItem.itemType === 'appointment')\n addresses = await getAllPartiesFromAppointment(\n officeItem as Office.AppointmentRead & Office.AppointmentCompose\n );\n else {\n throw new OutlookItemNotSupported();\n }\n\n const parties = addresses.map((a) => {\n return {\n email: a.emailAddress,\n fullName: a.displayName,\n ...getFirstAndLastName(a.displayName),\n };\n });\n return parties;\n}\n\nfunction getFirstAndLastName(displayName: string) {\n //display name split code\n // var str=item.from.displayName\n let firstName = '';\n let lastName = '';\n if (displayName.split(' ').length > 1) {\n const index = displayName.indexOf(' '); // Gets the first index where a space occurs\n firstName = displayName.substr(0, index); // Gets the first part\n lastName = displayName.substr(index + 1); // Gets the text part\n } else {\n firstName = displayName;\n lastName = '';\n }\n return { firstName: firstName, lastName: lastName };\n}\n\nfunction removeDuplicatesByEmail(addresses: Office.EmailAddressDetails[]) {\n addresses.forEach((a, i) => {\n const duplicates = addresses.filter(\n (d) => d.emailAddress === a.emailAddress && d != a\n );\n if (duplicates.length > 0) addresses.splice(i, 1);\n });\n return addresses;\n}\n","export function toIsoWithTimeZone(date: Date) {\n const tzo = -date.getTimezoneOffset(),\n dif = tzo >= 0 ? '+' : '-',\n pad = function (num: number) {\n const norm = Math.floor(Math.abs(num));\n return (norm < 10 ? '0' : '') + norm;\n };\n return (\n date.getFullYear() +\n '-' +\n pad(date.getMonth() + 1) +\n '-' +\n pad(date.getDate()) +\n 'T' +\n pad(date.getHours()) +\n ':' +\n pad(date.getMinutes()) +\n ':' +\n pad(date.getSeconds()) +\n dif +\n pad(tzo / 60) +\n ':' +\n pad(tzo % 60)\n );\n}\n\nexport function getDiffInHours(dateA: Date, dateB: Date) {\n if (!dateA || !dateB) return null;\n const diffInMs = Math.abs(\n (dateA as unknown as number) - (dateB as unknown as number)\n );\n\n const diffInHours = diffInMs / 1000 / 60 / 60;\n\n return diffInHours;\n}\n\nexport function getDiffInMinutes(dateA: Date, dateB: Date) {\n if (!dateA || !dateB) return null;\n const diffInMs = Math.abs(\n (dateA as unknown as number) - (dateB as unknown as number)\n );\n\n const diffInHours = diffInMs / 1000 / 60;\n\n return diffInHours;\n}\n","import {\r\n Client,\r\n ClientOptions,\r\n GraphError,\r\n GraphRequest,\r\n PageIterator,\r\n} from '@microsoft/microsoft-graph-client';\r\nimport * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\r\nimport { ItemIsNotSavedException } from 'common/exceptions/application/ItemIsNotSavedException';\r\nimport { OutlookApiException } from 'common/exceptions/outlook/OutlookApiException';\r\nimport { OutlookItemNotSupported } from 'common/exceptions/outlook/OutlookItemNotSupported';\r\nimport { AppointmentUids } from 'common/models/AppointmentUids';\r\nimport { GraphCollection } from 'common/models/graph/GraphCollection';\r\nimport CONFIG from 'config';\r\nimport { StatusCodes } from 'http-status-codes';\r\nimport { GraphAuthenticationProvider } from './graphAuthUtils';\r\nimport { getItemRestId } from './outlookItemUtils';\r\n\r\nconst TAG = 'GRA1: ';\r\n\r\nconst extendedPropertiesPropertyId = `String {00020329-0000-0000-C000-000000000046} Name cecp-${CONFIG.appId}`;\r\n\r\nconst expandExtendedProperties = `singleValueExtendedProperties($filter=id eq '${extendedPropertiesPropertyId}')`;\r\n\r\nconst contactFoldersCache = new Map();\r\n\r\nfunction filterExtendedProperties(propertyValue?: string): string {\r\n return (\r\n `singleValueExtendedProperties/Any(` +\r\n `ep: ep/id eq '${extendedPropertiesPropertyId}'` +\r\n (propertyValue !== undefined\r\n ? ` and contains(ep/value, '${propertyValue}')`\r\n : '') +\r\n `)`\r\n );\r\n}\r\n\r\nconst client = Client.initWithMiddleware({\r\n authProvider: new GraphAuthenticationProvider(),\r\n});\r\n\r\nexport async function getOrCreateContactGroup(name: string) {\r\n let group = await getContactGroup(name);\r\n if (!group) {\r\n if (contactFoldersCache.has(name)) {\r\n group = contactFoldersCache.get(name);\r\n } else {\r\n group = await createContactGroup(name);\r\n if (group) {\r\n contactFoldersCache.set(name, group);\r\n }\r\n }\r\n }\r\n return group;\r\n}\r\n\r\nasync function createContactGroup(name: string) {\r\n console.log(TAG, 'Creating contact group ', name);\r\n\r\n try {\r\n const response: MicrosoftGraph.ContactFolder = await client\r\n .api('/me/contactFolders')\r\n .post({ displayName: name });\r\n\r\n console.log(TAG, 'Created contact group ', response);\r\n\r\n return response;\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to create contact group with Graph API ',\r\n error\r\n );\r\n }\r\n}\r\n\r\nasync function getContactGroup(name: string) {\r\n console.log(TAG, 'Getting contact group ', name);\r\n try {\r\n const response: GraphCollection = await client\r\n .api('/me/contactFolders')\r\n .get();\r\n\r\n const groups: MicrosoftGraph.ContactFolder[] = [];\r\n\r\n const iterator = new PageIterator(\r\n client,\r\n response,\r\n (group: MicrosoftGraph.ContactFolder) => {\r\n groups.push(group);\r\n return true;\r\n }\r\n );\r\n\r\n await iterator.iterate();\r\n\r\n console.log(TAG, 'Contact groups ', groups);\r\n\r\n const group = groups.find((g) => g.displayName === name);\r\n console.log(TAG, 'Contact group is ', group);\r\n return group;\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to get contact groups from Graph API ',\r\n error\r\n );\r\n }\r\n}\r\n\r\nexport async function getContacts(groupId: string) {\r\n try {\r\n const response: GraphCollection = await client\r\n .api(`/me/contactFolders/${groupId}/contacts`)\r\n .get();\r\n\r\n const contacts = response.value;\r\n return contacts;\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to get contacts from Graph API ',\r\n error\r\n );\r\n }\r\n}\r\n\r\nexport async function getContact(email: string, contactGroupName: string) {\r\n const group = await getOrCreateContactGroup(contactGroupName);\r\n const contacts = await getContacts(group.id);\r\n\r\n const existingContact = contacts.find(\r\n (c) => c.emailAddresses[0] && c.emailAddresses[0].address === email\r\n );\r\n\r\n return existingContact;\r\n}\r\n\r\nexport async function createOrUpdateContact(\r\n contact: MicrosoftGraph.Contact,\r\n contactGroupName: string\r\n) {\r\n const group = await getOrCreateContactGroup(contactGroupName);\r\n const existingContact = await getContact(\r\n contact.emailAddresses[0].address,\r\n contactGroupName\r\n );\r\n\r\n if (!existingContact) {\r\n await createContact(group.id, contact);\r\n } else {\r\n contact.id = existingContact.id;\r\n await updateContact(contact);\r\n }\r\n}\r\n\r\nexport async function updateContact(contact: MicrosoftGraph.Contact) {\r\n console.log(TAG, 'Updating contact ', contact.emailAddresses[0].address);\r\n\r\n try {\r\n await client.api(`/me/contacts/${contact.id}`).patch(contact);\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to update contact with Graph API ',\r\n error\r\n );\r\n }\r\n}\r\n\r\nasync function createContact(\r\n contactGroupId: string,\r\n contact: MicrosoftGraph.Contact\r\n) {\r\n console.log(TAG, 'Creating contact ', contact.emailAddresses[0].address);\r\n\r\n try {\r\n await client\r\n .api(`/me/contactFolders/${contactGroupId}/contacts`)\r\n .post(contact);\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to create contact with Graph API ',\r\n error\r\n );\r\n }\r\n}\r\n\r\nexport async function deleteContactGroup(contactGroupName: string) {\r\n console.log(TAG, 'Deleting contacts from ', contactGroupName);\r\n const group = await getContactGroup(contactGroupName);\r\n if (!group) return;\r\n\r\n const contacts = await getContacts(group.id);\r\n for (const c of contacts) {\r\n await deleteContact(c.id);\r\n }\r\n}\r\n\r\nexport async function deleteContact(contactId: string) {\r\n console.log(TAG, 'Deleting contact ', contactId);\r\n\r\n try {\r\n await client.api(`/me/contacts/${contactId}`).delete();\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to delete contact with Graph API ',\r\n error\r\n );\r\n }\r\n}\r\n\r\nexport async function getMessages(addressesToDates: Map) {\r\n if (!addressesToDates.size) return [];\r\n const inbox = await getMessagesFromFolder('inbox', addressesToDates);\r\n const sent = await getMessagesFromFolder('sentItems', addressesToDates);\r\n\r\n let allMessages = [...inbox, ...sent];\r\n\r\n allMessages = allMessages.filter((m, i) => {\r\n return allMessages.findIndex((m2) => m2.id === m.id) === i;\r\n });\r\n\r\n return allMessages;\r\n}\r\n\r\nasync function getMessagesFromFolder(\r\n folder: 'inbox' | 'sentItems',\r\n addressesToDates: Map\r\n) {\r\n const requests: GraphRequest[] = [];\r\n\r\n const path = `/me/mailFolders/${folder}/messages`;\r\n\r\n const extrasLength =\r\n (client['config'] as ClientOptions).baseUrl.length +\r\n path.length +\r\n '?search=\"\"'.length +\r\n '&$top=200'.length +\r\n 134;\r\n\r\n let fullSearchExpression = '';\r\n addressesToDates.forEach((lastSyncDate: Date, address: string) => {\r\n const currentExpression =\r\n `((from:${address} OR to:${address}) AND ` +\r\n `(received>=${lastSyncDate.toISOString()} OR sent>=${lastSyncDate.toISOString()}))`;\r\n\r\n const combinedExpression = encodeURIComponent(\r\n `\"${fullSearchExpression}${currentExpression}\"`\r\n );\r\n\r\n // if full length of URL exceeds OData request length the limit\r\n // (with subtracted length for $skipToken for next page requests),\r\n // then add the URL without that expression to the request queue\r\n // and reset the current expression\r\n if (combinedExpression.length >= 2047 - extrasLength) {\r\n const request = client\r\n .api(path)\r\n .search(`\"${fullSearchExpression}\"`)\r\n .top(200);\r\n\r\n requests.push(request);\r\n fullSearchExpression = currentExpression;\r\n } else {\r\n // if there is already something in the search expression, add 'OR'\r\n if (fullSearchExpression) {\r\n fullSearchExpression += ' OR ' + currentExpression;\r\n } else {\r\n fullSearchExpression = currentExpression;\r\n }\r\n }\r\n });\r\n\r\n const request = client.api(path).search(`\"${fullSearchExpression}\"`).top(200);\r\n\r\n requests.push(request);\r\n\r\n const allMessages: MicrosoftGraph.Message[] = [];\r\n for (const request of requests) {\r\n const messages = await getAllPagedMessages(request);\r\n allMessages.push(...messages);\r\n }\r\n\r\n return allMessages;\r\n}\r\n\r\n/**\r\n * Makes requests for all pages and combines them into one array\r\n */\r\nasync function getAllPagedMessages(\r\n request: GraphRequest\r\n): Promise {\r\n const messages: MicrosoftGraph.Message[] = [];\r\n console.log(TAG, 'Making request for messages: ', request);\r\n\r\n const response: GraphCollection = await request.get();\r\n\r\n const iterator = new PageIterator(\r\n client,\r\n response,\r\n (message: MicrosoftGraph.Message) => {\r\n messages.push(message);\r\n return true;\r\n }\r\n );\r\n\r\n try {\r\n await iterator.iterate();\r\n } catch (error: unknown) {\r\n throw new OutlookApiException(\r\n 'Failed to get messages from Graph API',\r\n error\r\n );\r\n }\r\n\r\n return messages;\r\n}\r\n\r\nexport async function getEvent(\r\n itemId: string,\r\n sharedProperties: Office.SharedProperties | undefined\r\n): Promise {\r\n try {\r\n const response: MicrosoftGraph.Event = await client\r\n .api(\r\n `/${getUserGraphUrlSegment(sharedProperties)}/events/${getItemRestId(\r\n itemId\r\n )}`\r\n )\r\n .get();\r\n\r\n return response;\r\n } catch (error) {\r\n throw new OutlookApiException('Failed to get event from Graph API', error);\r\n }\r\n}\r\n\r\n/**\r\n * Note: The returned {@link AppointmentUids.recurrenceId} property will be different between this method and any legacy EWS ID\r\n * for the same event.\r\n */\r\nexport async function getAppointmentUids(\r\n itemId: string,\r\n sharedProperties: Office.SharedProperties | undefined\r\n): Promise {\r\n try {\r\n const event = await getEvent(itemId, sharedProperties);\r\n\r\n if (event.type === 'occurrence') {\r\n const seriesMaster = await getEvent(\r\n event.seriesMasterId,\r\n sharedProperties\r\n );\r\n\r\n return {\r\n uid: seriesMaster.iCalUId,\r\n recurrenceId: event.iCalUId,\r\n itemType: event.type,\r\n };\r\n }\r\n\r\n return {\r\n uid: event.iCalUId,\r\n recurrenceId: null,\r\n itemType: event.type,\r\n };\r\n } catch (error: unknown) {\r\n if (\r\n error instanceof OutlookApiException &&\r\n (error.apiResponse as GraphError).statusCode === StatusCodes.NOT_FOUND\r\n ) {\r\n console.log(TAG, 'Appointment not found: not saved?');\r\n // this occurs when we were able get item id from the Exchange Server,\r\n // but the since user hasn't yet saved the draft item,\r\n // Exchange Server is still refusing to acknowledge existence of the item with this id\r\n throw new ItemIsNotSavedException();\r\n }\r\n\r\n throw new OutlookApiException(\r\n 'Failed to get appointment Uid from Graph API',\r\n error\r\n );\r\n }\r\n}\r\n\r\n/** Searches all Appointments by custom property value. Returns ID of first Appointment with this property */\r\nexport async function getFirstEventIdByCustomProperty(\r\n propertyValue: string,\r\n sharedProperties: Office.SharedProperties | undefined\r\n) {\r\n try {\r\n const response: GraphCollection = await client\r\n .api(`${getUserGraphUrlSegment(sharedProperties)}/events`)\r\n .filter(filterExtendedProperties(propertyValue))\r\n .expand(expandExtendedProperties)\r\n .get();\r\n\r\n const events = response.value;\r\n\r\n if (!events || events.length === 0) {\r\n return null;\r\n }\r\n\r\n return events[0].id;\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to get events by custom property from Graph API',\r\n error\r\n );\r\n }\r\n}\r\n\r\nexport async function getAttachments(\r\n itemId: string,\r\n itemType: string,\r\n sharedProperties: Office.SharedProperties | undefined\r\n) {\r\n const restItemId = getItemRestId(itemId);\r\n\r\n const userSegment = getUserGraphUrlSegment(sharedProperties);\r\n\r\n let request: GraphRequest;\r\n if (itemType === 'message') {\r\n request = client.api(`/${userSegment}/messages/${restItemId}/attachments`);\r\n } else if (itemType === 'appointment') {\r\n request = client.api(`/${userSegment}/events/${restItemId}/attachments`);\r\n } else {\r\n throw new OutlookItemNotSupported();\r\n }\r\n\r\n console.log(TAG, 'Getting attachments from', request);\r\n\r\n const response: GraphCollection =\r\n await request.get();\r\n\r\n return response.value;\r\n}\r\n\r\nexport async function getExtendedProperty(\r\n message: MicrosoftGraph.Message,\r\n propertyName: string\r\n) {\r\n const appExtendedProperties = await getAppExtendedProperties(message);\r\n if (!appExtendedProperties) return undefined;\r\n const propertyValue = appExtendedProperties[propertyName];\r\n return propertyValue;\r\n}\r\n\r\nasync function getAppExtendedProperties(message: MicrosoftGraph.Message) {\r\n try {\r\n const response: MicrosoftGraph.Message = await client\r\n .api(`/me/messages/${message.id}`)\r\n .expand(expandExtendedProperties)\r\n .get();\r\n\r\n const appExtendedProperties = response.singleValueExtendedProperties?.find(\r\n (prop) => prop.id === extendedPropertiesPropertyId\r\n );\r\n\r\n if (appExtendedProperties) {\r\n return >JSON.parse(appExtendedProperties.value);\r\n }\r\n\r\n return undefined;\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to get extended properties from Graph API: ' + error.message,\r\n error\r\n );\r\n }\r\n}\r\n\r\nexport async function setExtendedProperty(\r\n message: MicrosoftGraph.Message,\r\n propertyName: string,\r\n propertyValue: string\r\n) {\r\n try {\r\n let currentProperties = await getAppExtendedProperties(message);\r\n\r\n if (!currentProperties) currentProperties = {};\r\n currentProperties[propertyName] = propertyValue;\r\n\r\n const json = JSON.stringify(currentProperties);\r\n\r\n const newMessage: MicrosoftGraph.Message = {\r\n singleValueExtendedProperties: [\r\n {\r\n id: extendedPropertiesPropertyId,\r\n value: json,\r\n },\r\n ],\r\n };\r\n\r\n await client.api(`/me/messages/${message.id}`).patch(newMessage);\r\n } catch (error) {\r\n throw new OutlookApiException(\r\n 'Failed to set extended property with Graph API: ' + error.message,\r\n error\r\n );\r\n }\r\n}\r\n\r\nexport function getUserGraphUrlSegment(\r\n sharedProperties: Office.SharedProperties | undefined\r\n) {\r\n return sharedProperties ? `/users/${sharedProperties.targetMailbox}` : '/me';\r\n}\r\n","import * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\r\nimport { getUserEmail } from './outlookItemUtils';\r\n\r\nexport function getDirectionForGraphItem(item: MicrosoftGraph.Message) {\r\n const userEmail = getUserEmail(undefined);\r\n const senderEmail = item.from.emailAddress.address;\r\n\r\n return senderEmail === userEmail ? 'OUT' : 'IN';\r\n}\r\n","import { AuthException } from 'common/exceptions/http/AuthException';\nimport AuthInvalidGrantException from 'common/exceptions/http/AuthInvalidGrantException';\nimport { ConnectionException } from 'common/exceptions/http/ConnectionException';\nimport { ForbiddenException } from 'common/exceptions/http/ForbiddenException';\nimport { InternalServerException } from 'common/exceptions/http/InternalServerException';\nimport { UnknownHttpException } from 'common/exceptions/http/UnknownHttpException';\nimport { StatusCodes } from 'http-status-codes';\nimport $ from 'jquery';\nimport * as UserSettings from './user-settings';\n\nexport function post(url: string, body: unknown, cache = false) {\n return new Promise(function (resolve, reject) {\n $.ajax({\n url: url,\n cache: cache,\n type: 'post',\n headers: {\n Authorization: 'bearer ' + UserSettings.getToken(),\n 'Content-Type': 'application/json',\n },\n data: JSON.stringify(body),\n\n success: function (response) {\n resolve(response as T);\n },\n error: function (err) {\n const processedError = processError(err);\n reject(processedError);\n },\n });\n });\n}\n\nexport function postForm(url: string, body: unknown) {\n return new Promise(function (resolve, reject) {\n $.ajax({\n url: url,\n type: 'post',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n data: body,\n\n success: function (response) {\n resolve(response as T);\n },\n error: function (err) {\n const processedError = processError(err);\n reject(processedError);\n },\n });\n });\n}\n\nexport function get(url: string, cache = false) {\n return new Promise(function (resolve, reject) {\n $.ajax({\n url: url,\n type: 'get',\n cache: cache,\n headers: {\n Authorization: 'bearer ' + UserSettings.getToken(),\n },\n success: function (response) {\n resolve(response as T);\n },\n error: function (err) {\n const processedError = processError(err);\n reject(processedError);\n },\n });\n });\n}\n\nfunction processError(httpError: JQuery.jqXHR) {\n if (httpError.status === 0) {\n return new ConnectionException(httpError.responseJSON);\n }\n if (httpError.status === StatusCodes.UNAUTHORIZED) {\n return new AuthException(httpError.responseJSON);\n }\n if (httpError.status === StatusCodes.FORBIDDEN) {\n return new ForbiddenException(httpError.responseJSON);\n }\n if (httpError.status === StatusCodes.INTERNAL_SERVER_ERROR) {\n return new InternalServerException(httpError);\n }\n if (\n httpError.status == StatusCodes.BAD_REQUEST &&\n httpError.responseText &&\n httpError.responseText.includes('invalid_grant')\n ) {\n return new AuthInvalidGrantException(httpError);\n }\n\n return new UnknownHttpException(httpError);\n}\n","// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.\n\nimport { Exception } from 'common/exceptions/Exception';\nimport { Dialog } from './dialog';\nimport { getLoginParams, IEndpointConfiguration } from './endpoint';\nimport { ICode, IError, IToken } from './token';\n\n/**\n * Custom error type to handle OAuth specific errors.\n */\nexport class AuthError extends Exception {\n constructor(message: string, public innerError?: Error) {\n super(message, innerError);\n }\n}\n\n/**\n * Helper for performing Implicit OAuth Authentication with registered endpoints.\n */\nexport class Authenticator {\n constructor(private endpoint: IEndpointConfiguration) {}\n\n authenticate(): Promise {\n return this._openAuthDialog();\n }\n\n /**\n * Check if the current url is running inside of a Dialog that contains an access_token, code, or error.\n * If true then it calls messageParent by extracting the token information, thereby closing the dialog.\n * Otherwise, the caller should proceed with normal initialization of their application.\n *\n * This logic assumes that the redirect url is your application and hence when your code runs again in\n * the dialog, this logic takes over and closes it for you.\n *\n * @return Returns false if the code is running inside of a dialog without the required information\n * or is not running inside of a dialog at all.\n */\n static isAuthDialog(): boolean {\n // If the url doesn't contain an access_token, code, or error then return false.\n // This is in scenarios where we don't want to automatically control what happens to the dialog.\n if (!/(access_token|code|error|state)/gi.test(location.href)) {\n return false;\n }\n\n Dialog.close(location.href);\n return true;\n }\n\n /**\n * Extract the token from the URL\n *\n * @param url The url to extract the token from.\n * @param exclude Exclude a particular string from the url, such as a query param or specific substring.\n * @param delimiter[optional] Delimiter used by OAuth provider to mark the beginning of token response. Defaults to #.\n * @return Returns the extracted token.\n */\n private static getUrlParams(\n url: string = location.href,\n exclude: string = location.origin,\n delimiter = '#'\n ): ICode | IToken | IError {\n if (exclude) {\n url = url.replace(exclude, '');\n }\n\n const [left, right] = url.split(delimiter);\n let tokenString = right == null ? left : right;\n\n if (tokenString.indexOf('?') !== -1) {\n tokenString = tokenString.split('?')[1];\n }\n\n return Authenticator.extractParams(tokenString);\n }\n\n private static extractParams(segment: string): ICode | IToken | IError {\n if (segment == null || segment.trim() === '') {\n return null;\n }\n\n const params: Partial = {};\n const regex = /([^&=]+)=([^&]*)/g;\n let matchParts;\n\n while ((matchParts = regex.exec(segment)) !== null) {\n // Fixes bugs when the state parameters contains a / before them\n if (matchParts[1] === '/state') {\n matchParts[1] = matchParts[1].replace('/', '');\n }\n params[decodeURIComponent(matchParts[1])] = decodeURIComponent(\n matchParts[2]\n );\n }\n\n return params as ICode | IToken | IError;\n }\n\n private async _openAuthDialog(): Promise {\n // Set the authentication state to redirect and begin the auth flow.\n const { state, url } = getLoginParams(this.endpoint);\n\n // Launch the dialog and perform the OAuth flow. We launch the dialog at the redirect\n // url where we expect the call to isAuthDialog to be available.\n const redirectUrl = await new Dialog(url, 1024, 768).result;\n\n // Try and extract the result and pass it along.\n return this._handleTokenResult(redirectUrl, this.endpoint, state);\n }\n\n private _handleTokenResult(\n redirectUrl: string,\n endpoint: IEndpointConfiguration,\n state: number\n ) {\n const result = Authenticator.getUrlParams(\n redirectUrl,\n endpoint.redirectUrl\n );\n if (result == null) {\n throw new AuthError('No access_token or code could be parsed.');\n } else if (endpoint.state && +result.state !== state) {\n throw new AuthError(\"State couldn't be verified\");\n } else if ('code' in result) {\n return result;\n } else {\n throw new AuthError((result as IError).error);\n }\n }\n}\n","// Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license.\nimport { generateCryptoSafeRandom } from './generateCryptoSafeRandom';\n\nexport interface IEndpointConfiguration {\n // Registered OAuth ClientID\n clientId?: string;\n\n // Base URL of the endpoint\n baseUrl?: string;\n\n // URL segment for OAuth authorize endpoint.\n // The final authorize url is constructed as (baseUrl + '/' + authorizeUrl).\n authorizeUrl?: string;\n\n // Registered OAuth redirect url.\n // Defaults to window.location.origin\n redirectUrl?: string;\n\n // Registered OAuth scope.\n scope?: string;\n\n // Resource parameter for the OAuth provider.\n resource?: string;\n\n // Automatically generate a state? defaults to false.\n state?: boolean;\n\n // Automatically generate a nonce? defaults to false.\n nonce?: boolean;\n\n // OAuth responseType.\n responseType?: string;\n\n // Additional object for query parameters.\n // Will be appending them after encoding the values.\n extraQueryParameters?: { [index: string]: string };\n}\n\n/**\n * Helper to generate the OAuth login url.\n * @param endpointConfig Valid Endpoint configuration.\n * @return Returns the added endpoint.\n */\nexport function getLoginParams(endpointConfig: IEndpointConfiguration): {\n url: string;\n state: number;\n} {\n const scope = endpointConfig.scope\n ? encodeURIComponent(endpointConfig.scope)\n : null;\n const resource = endpointConfig.resource\n ? encodeURIComponent(endpointConfig.resource)\n : null;\n const state = endpointConfig.state && generateCryptoSafeRandom();\n const nonce = endpointConfig.nonce && generateCryptoSafeRandom();\n\n const urlSegments = [\n `response_type=${endpointConfig.responseType}`,\n `client_id=${encodeURIComponent(endpointConfig.clientId)}`,\n `redirect_uri=${encodeURIComponent(endpointConfig.redirectUrl)}`,\n ];\n\n if (scope) {\n urlSegments.push(`scope=${scope}`);\n }\n if (resource) {\n urlSegments.push(`resource=${resource}`);\n }\n if (state) {\n urlSegments.push(`state=${state}`);\n }\n if (nonce) {\n urlSegments.push(`nonce=${nonce}`);\n }\n if (endpointConfig.extraQueryParameters) {\n for (const param of Object.keys(endpointConfig.extraQueryParameters)) {\n urlSegments.push(\n `${param}=${encodeURIComponent(\n endpointConfig.extraQueryParameters[param]\n )}`\n );\n }\n }\n\n return {\n url: `${endpointConfig.baseUrl}${\n endpointConfig.authorizeUrl\n }?${urlSegments.join('&')}`,\n state: state,\n };\n}\n","/**\n * Utility to generate crypto safe random numbers\n */\nexport function generateCryptoSafeRandom() {\n const random = new Uint32Array(1);\n if ('msCrypto' in window) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window).msCrypto.getRandomValues(random);\n } else if ('crypto' in window) {\n window.crypto.getRandomValues(random);\n } else {\n throw new Error(\n \"The platform doesn't support generation of cryptographically safe randoms. Please disable the state flag and try again.\"\n );\n }\n return random[0];\n}\n","/* global Office */\nimport { OutlookException } from 'common/exceptions/outlook/OutlookException';\nimport { OutlookWrongItemSelectedException } from 'common/exceptions/outlook/OutlookWrongItemSelectedException';\nimport { AddInFeatureNotSupportedException } from '../exceptions/application/AddInFeatureNotSupportedException';\nimport { SupportedOfficeItem } from './SupportedOfficeItem';\n\nexport function getAsyncBody(body: Office.Body) {\n return new Promise((resolve, reject) => {\n body.getAsync('html', (bodyResult) => {\n if (bodyResult.status === Office.AsyncResultStatus.Succeeded)\n resolve(bodyResult.value);\n else\n reject(\n processError('Failed to get outlook item body', bodyResult.error)\n );\n });\n });\n}\n\nexport function getAsyncRecipients(recipients: Office.Recipients) {\n const promise = new Promise(function (\n resolve,\n reject\n ) {\n recipients.getAsync((recipientsResult) => {\n if (recipientsResult.status === Office.AsyncResultStatus.Succeeded)\n resolve(recipientsResult.value);\n else\n reject(\n processError(\n 'Failed to get outlook item recipients',\n recipientsResult.error\n )\n );\n });\n });\n\n return promise;\n}\n\nexport function getAsyncOrganizer(organizer: Office.Organizer) {\n const promise = new Promise(function (\n resolve,\n reject\n ) {\n organizer.getAsync((organizerResult) => {\n if (organizerResult.status === Office.AsyncResultStatus.Succeeded)\n resolve(organizerResult.value);\n else\n reject(\n processError(\n 'Failed to get outlook item organizer',\n organizerResult.error\n )\n );\n });\n });\n return promise;\n}\n\nexport function getAsyncSubject(subject: Office.Subject) {\n const promise = new Promise(function (resolve, reject) {\n subject.getAsync((recipientsResult) => {\n if (recipientsResult.status === Office.AsyncResultStatus.Succeeded)\n resolve(recipientsResult.value);\n else\n reject(\n processError(\n 'Failed to get outlook item subject',\n recipientsResult.error\n )\n );\n });\n });\n return promise;\n}\n\nexport function getAsyncTime(time: Office.Time) {\n const promise = new Promise(function (resolve, reject) {\n time.getAsync((recipientsResult) => {\n if (recipientsResult.status === Office.AsyncResultStatus.Succeeded)\n resolve(recipientsResult.value);\n else\n reject(\n processError(\n 'Failed to get outlook item time',\n recipientsResult.error\n )\n );\n });\n });\n return promise;\n}\n\nexport function saveAsync(appointment: Office.AppointmentCompose) {\n // if API < 1.3\n if (!appointment.saveAsync) {\n throw new AddInFeatureNotSupportedException(\n 'Failed to get outlook item id: saving item is not supported in this version of outlook'\n );\n }\n\n const promise = new Promise(function (resolve, reject) {\n appointment.saveAsync((saveResult) => {\n if (saveResult.status === Office.AsyncResultStatus.Succeeded) {\n resolve(saveResult.value);\n } else {\n // on macOS \"Internal Error\" will be returned with code 5001\n if (saveResult.error.code == 5001) {\n reject(\n new AddInFeatureNotSupportedException(\n 'Failed to get item id: saving item is not supported in MacOS version of outlook'\n )\n );\n }\n reject(processError('Failed to save outlook item', saveResult.error));\n }\n });\n });\n return promise;\n}\n\nexport function getAsyncId(appointment: Office.AppointmentCompose) {\n // if API < 1.8\n if (!appointment.getItemIdAsync) {\n throw new AddInFeatureNotSupportedException(\n 'Failed to get outlook item id: not supported in this version of outlook'\n );\n }\n\n const promise = new Promise(function (resolve, reject) {\n appointment.getItemIdAsync((getIdResult) => {\n if (getIdResult.status === Office.AsyncResultStatus.Succeeded) {\n resolve(getIdResult.value);\n } else {\n // on macOS \"Internal Error\" will be returned with code 5001\n // I assume that getItemIdAsync is not supported on Mac, just like the saveAsync\n // although I didn't find any mention of this\n if (getIdResult.error.code == 5001) {\n reject(\n new AddInFeatureNotSupportedException(\n 'Failed to get item id: getting item is not supported in MacOS version of outlook'\n )\n );\n }\n reject(\n processError('Failed to get outlook item id', getIdResult.error)\n );\n }\n });\n });\n return promise;\n}\n\nexport function getAsyncCustomProperties(\n item: SupportedOfficeItem\n): Promise {\n return new Promise((resolve, reject) => {\n item.loadCustomPropertiesAsync((asyncResult) => {\n if (asyncResult.status == Office.AsyncResultStatus.Succeeded)\n resolve(asyncResult.value);\n else\n reject(\n processError(\n 'Failed to get outlook item custom properties',\n asyncResult.error\n )\n );\n });\n });\n}\n\nexport function saveAsyncCustomProperties(\n properties: Office.CustomProperties\n): Promise {\n return new Promise(function (resolve, reject) {\n properties.saveAsync((asyncResult) => {\n if (asyncResult.status === Office.AsyncResultStatus.Succeeded) resolve();\n else\n reject(\n processError(\n 'Failed to save outlook item custom properties',\n asyncResult.error\n )\n );\n });\n });\n}\n\n/**\n * Checks if item is a recurring appointment's master item\n * NOTE: this check is supported only on API >= 1.7. On lower versions always returns false\n * Add-in must check this again later using Graph API. This can't be done here because\n * if item wasn't saved yet, we can't retrieve item's ID for Graph API requests\n */\nexport function isRecurringMaster(item: SupportedOfficeItem): Promise {\n return new Promise((resolve, reject) => {\n // if NOT appointment OR API < 1.7, return false\n if (!item.recurrence) {\n resolve(false);\n } else if (item.recurrence.recurrenceType && !item.seriesId) {\n resolve(true);\n } else if (!item.recurrence.getAsync) {\n resolve(false);\n } else {\n item.recurrence.getAsync((asyncResult) => {\n if (asyncResult.status == Office.AsyncResultStatus.Succeeded) {\n if (\n asyncResult.value &&\n asyncResult.value.recurrenceType &&\n !item.seriesId\n ) {\n resolve(true);\n } else {\n resolve(false);\n }\n } else {\n reject(\n processError(\n 'Failed to check if outlook item is recurring master',\n asyncResult.error\n )\n );\n }\n });\n }\n });\n}\n\nexport function getSharedProperties(\n item: SupportedOfficeItem\n): Promise {\n return new Promise((resolve, reject) => {\n if (!item.getSharedPropertiesAsync) {\n return resolve(undefined);\n }\n\n item.getSharedPropertiesAsync((asyncResult) => {\n if (asyncResult.status == Office.AsyncResultStatus.Succeeded) {\n resolve(asyncResult.value);\n } else {\n reject(\n processError(\n 'Failed to get outlook item shared properties',\n asyncResult.error\n )\n );\n }\n });\n });\n}\n\nexport function getAttachments(\n item: SupportedOfficeItem\n): Promise {\n return new Promise((resolve, reject) => {\n if (item.attachments) {\n resolve(item.attachments);\n } else if (item.getAttachmentsAsync) {\n item.getAttachmentsAsync((asyncResult) => {\n if (asyncResult.status == Office.AsyncResultStatus.Succeeded) {\n resolve(asyncResult.value);\n } else {\n reject(\n processError(\n 'Failed to get outlook item attachments',\n asyncResult.error\n )\n );\n }\n });\n } else {\n reject(\n new AddInFeatureNotSupportedException(\n 'Failed to get outlook item attachments: not supported in this version of outlook'\n )\n );\n }\n });\n}\n\nexport function getAttachmentContent(\n item: SupportedOfficeItem,\n attachmentId: string\n): Promise {\n return new Promise((resolve, reject) => {\n if (item.getAttachmentContentAsync) {\n item.getAttachmentContentAsync(attachmentId, (asyncResult) => {\n if (asyncResult.status == Office.AsyncResultStatus.Succeeded) {\n resolve(asyncResult.value);\n } else {\n reject(\n processError(\n 'Failed to get outlook item attachment content',\n asyncResult.error\n )\n );\n }\n });\n } else {\n reject(\n new AddInFeatureNotSupportedException(\n 'Failed to get outlook item attachment content: not supported in this version of outlook'\n )\n );\n }\n });\n}\n\nfunction processError(message: string, error: Office.Error) {\n if (error && error.name === 'GenericResponseError' && error.code === 9020) {\n // see JSDoc for this class\n return new OutlookWrongItemSelectedException(error);\n }\n return new OutlookException(message, error);\n}\n","/* global Office */\nimport * as MicrosoftGraph from '@microsoft/microsoft-graph-types';\nimport { ApplicationException } from 'common/exceptions/application/ApplicationException';\nimport { ItemIsNotSavedException } from 'common/exceptions/application/ItemIsNotSavedException';\nimport { OutlookException } from 'common/exceptions/outlook/OutlookException';\nimport { OutlookItemNotSupported } from 'common/exceptions/outlook/OutlookItemNotSupported';\nimport { AppointmentUids } from 'common/models/AppointmentUids';\nimport CONFIG from 'config';\nimport { Attachment } from '../models/Attachment';\nimport { findDuplicateMeeting } from './api';\nimport { assertHasGraphApi } from './assertHasGraphApi';\nimport { toIsoWithTimeZone } from './dateUtils';\nimport * as GraphApi from './graphApi';\nimport * as OutlookAsyncUtils from './outlookAsyncUtils';\nimport { SupportedOfficeItem } from './SupportedOfficeItem';\n\nconst TAG = 'OIU3: ';\n\nexport function getUserEmail(\n sharedProperties: Office.SharedProperties | undefined\n) {\n return sharedProperties\n ? sharedProperties.owner\n : Office.context.mailbox.userProfile.emailAddress;\n}\n\nexport function getAsyncLocation(location: Office.Location) {\n const promise = new Promise(function (resolve, reject) {\n location.getAsync((recipientsResult) => {\n if (recipientsResult.status === Office.AsyncResultStatus.Succeeded)\n resolve(recipientsResult.value);\n else reject(recipientsResult.error);\n });\n });\n return promise;\n}\n\nexport function getDirectionFromOutlookItem(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n) {\n const userEmail = getUserEmail(sharedProperties);\n\n let senderEmail = '';\n\n if (item.itemType === 'message') {\n const message = item as Office.MessageRead;\n senderEmail = message.from.emailAddress;\n } else if (item.itemType === 'appointment') {\n if (isAppointmentReadMode(item)) {\n const appointmentRead = item as Office.AppointmentRead;\n senderEmail = appointmentRead.organizer.emailAddress;\n } else {\n senderEmail = userEmail;\n }\n } else {\n throw new OutlookItemNotSupported();\n }\n\n return senderEmail === userEmail ? 'OUT' : 'IN';\n}\n\nexport async function getLocationFromOutlookItem(\n item: SupportedOfficeItem\n): Promise {\n if (item.itemType === 'message') {\n return null;\n } else if (item.itemType === 'appointment') {\n if (isAppointmentReadMode(item)) {\n const appointment = item as Office.AppointmentRead;\n return appointment.location;\n } else {\n const appointment = item as Office.AppointmentCompose;\n return await getAsyncLocation(appointment.location);\n }\n } else {\n throw new OutlookItemNotSupported();\n }\n}\n\nexport async function getSubjectFromOutlookItem(\n item: Office.MessageRead & Office.AppointmentCompose & Office.AppointmentRead\n) {\n if (item.itemType === 'message') {\n const message = item as Office.MessageRead;\n return message.subject || 'No subject';\n } else if (item.itemType === 'appointment') {\n if (isAppointmentReadMode(item)) {\n const appointment = item as Office.AppointmentRead;\n return appointment.subject || 'No subject';\n } else {\n const appointment = item as Office.AppointmentCompose;\n return (\n (await OutlookAsyncUtils.getAsyncSubject(appointment.subject)) ||\n 'No subject'\n );\n }\n } else {\n throw new OutlookItemNotSupported();\n }\n}\n\nexport function getInteractionMethodFromOutlookItem(\n item: Office.MessageRead & Office.AppointmentCompose & Office.AppointmentRead\n) {\n if (item.itemType === 'message') return 'Email';\n else if (item.itemType === 'appointment') return 'Meeting';\n else throw new OutlookItemNotSupported();\n}\n\nexport async function getDateFromOutlookItem(\n item: Office.MessageRead & Office.AppointmentRead & Office.AppointmentCompose\n): Promise {\n if (item.itemType === 'message') {\n const message = item as Office.MessageRead;\n return message.dateTimeCreated;\n } else if (item.itemType === 'appointment') {\n if (isAppointmentReadMode(item)) {\n const appointment = item as Office.AppointmentRead;\n return appointment.start;\n } else {\n const appointment = item as Office.AppointmentCompose;\n const date = await OutlookAsyncUtils.getAsyncTime(appointment.start);\n return date || new Date();\n }\n }\n}\n\nexport async function getEndDateFromOutlookItem(\n item: Office.MessageRead & Office.AppointmentRead & Office.AppointmentCompose\n): Promise {\n if (item.itemType === 'message') {\n return null;\n } else if (item.itemType === 'appointment') {\n if (isAppointmentReadMode(item)) {\n const appointment = item as Office.AppointmentRead;\n return appointment.end;\n } else {\n const appointment = item as Office.AppointmentCompose;\n const date = await OutlookAsyncUtils.getAsyncTime(appointment.end);\n return date || new Date();\n }\n }\n}\n\nexport function isAppointmentReadMode(outlookItem: Office.AppointmentRead) {\n return outlookItem.itemType === 'appointment' && outlookItem.itemId;\n}\n\n/** Tries to retrieve item ID using a few different methods */\nexport async function getItemId(\n outlookItem: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n): Promise {\n // if it's not a Compose mode, simply return the ID\n if (outlookItem.itemId) return outlookItem.itemId;\n\n // if it's Compose mode, itemId property is not available\n\n // first, try getting id with getAsyncId\n // which doesn't work if:\n // 0. API version < 1.8\n // 1. It's MacOS, in which case: getIdError instanceof AddInFeatureNotSupportedException\n // 2. id can't be retrieved because item is new and wasn't saved, in which case: getIdError.code === 9046\n // 3. It's Internet Explorer, in which case error message or description will be \"Permission denied\"\n // then, try getting id with saveAsync\n // which doesn't work if:\n // 1. It's MacOS, , in which case: getIdError instanceof AddInFeatureNotSupportedException\n // 2. Not sure if will work on IE\n // then, try the workaround with saving custom properties\n // which doesn't work if:\n // 1. custom properties are not saved yet, in which case: getItemIdBySearchOnCustomPropertiesError instanceof ItemIsNotSavedException\n // if nothing worked, combine all errors and rethrow\n\n try {\n return await OutlookAsyncUtils.getAsyncId(outlookItem);\n } catch (getIdError) {\n // if not supported, or any other error, try saveAsync\n try {\n return await OutlookAsyncUtils.saveAsync(outlookItem);\n } catch (saveError) {\n // if save function is not supported, try the workaround\n try {\n return await getItemIdBySearchOnCustomProperties(\n outlookItem,\n sharedProperties\n );\n } catch (getItemIdBySearchOnCustomPropertiesError) {\n // if item is not saved, UI should inform user\n if (\n getItemIdBySearchOnCustomPropertiesError instanceof\n ItemIsNotSavedException\n ) {\n throw getItemIdBySearchOnCustomPropertiesError;\n }\n // if problem is somewhere else, rethrow everything\n else {\n const errorsDescription = {\n getIdError: getIdError,\n saveError: saveError,\n getItemIdBySearchOnCustomPropertiesError:\n getItemIdBySearchOnCustomPropertiesError,\n };\n throw new ApplicationException(\n 'Failed to get id for outlook item',\n errorsDescription\n );\n }\n }\n }\n }\n}\n\n/** This workaround is for MacOS, where save() function is not supported, and it's impossible to get item ID for items in Compose mode.\n * https://docs.microsoft.com/en-US/outlook/troubleshoot/calendars/cannot-save-meeting-as-draft-in-outlook-for-mac\n * Original workaround described in the article doesn't work: REST and Graph methods require back-end,\n * and EWS method throws errors when trying to sync items.\n * This method works differently: instead of using EWS syncing, it searches through all Appointments using a flag\n * saved in item's custom properties.\n * If flag wasn't yet set, then user must manually save the item.\n * @throws ItemIsNotSavedException\n */\nasync function getItemIdBySearchOnCustomProperties(\n outlookItem: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n): Promise {\n assertHasGraphApi();\n\n const properties = await OutlookAsyncUtils.getAsyncCustomProperties(\n outlookItem\n );\n console.log(TAG, 'Retrieving item ID by search on custom properties');\n\n let searchFlagValue: string = properties.get('flag_for_mac_save_workaround');\n // if flag was set, search all Appointments by it's value\n if (searchFlagValue) {\n console.log(\n TAG,\n 'Found flag_for_mac_save_workaround flag: ',\n searchFlagValue\n );\n\n const id = await GraphApi.getFirstEventIdByCustomProperty(\n searchFlagValue,\n sharedProperties\n );\n\n if (id) {\n console.log(TAG, 'Item Id found by the flag: ', id);\n return id;\n } else {\n // if flag is set, but not found in EWS, that means that flag wasn't yet saved to the server\n console.log(TAG, 'Item Id was not found by the flag');\n throw new ItemIsNotSavedException();\n }\n }\n // if flag wasn't set, then set the flag to any unique string\n // and ask user to save the item, so the flag could be read when this function runs again\n else {\n console.log(TAG, 'Flag was not set, setting the flag');\n searchFlagValue = new Date().valueOf().toString();\n properties.set('flag_for_mac_save_workaround', searchFlagValue);\n await OutlookAsyncUtils.saveAsyncCustomProperties(properties);\n throw new ItemIsNotSavedException();\n }\n}\n\nexport async function getSupportedAttachmentsForItem(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n) {\n // If the client doesn't support getAttachmentContentAsync (requirement set 1.8), fall back to the REST API\n if (!Office.context.requirements.isSetSupported('Mailbox', '1.8')) {\n const itemId = await getItemId(item, sharedProperties);\n\n return await getSupportedAttachmentsForItemId(\n itemId,\n item.itemType,\n sharedProperties\n );\n }\n\n const attachments = await OutlookAsyncUtils.getAttachments(item);\n\n const attachmentsWithContent = await Promise.all(\n attachments\n .filter(\n (attachment) =>\n attachment.attachmentType ===\n Office.MailboxEnums.AttachmentType.File ||\n attachment.attachmentType === Office.MailboxEnums.AttachmentType.Item\n )\n .map(async (attachment) => {\n try {\n const content = await OutlookAsyncUtils.getAttachmentContent(\n item,\n attachment.id\n );\n\n return { attachment, content };\n } catch (error: unknown) {\n if (\n error instanceof OutlookException &&\n (error.originalException as Office.Error)?.name ===\n 'AttachmentTypeNotSupported'\n ) {\n console.log(TAG, 'Skipping unsupported attachment', attachment);\n\n return undefined;\n }\n\n throw error;\n }\n })\n );\n\n const convertedAttachments = attachmentsWithContent\n .filter((pair) => pair?.content.content)\n .map((pair): Attachment => {\n const base64Content: string =\n pair.content.format ===\n Office.MailboxEnums.AttachmentContentFormat.Eml ||\n pair.content.format ===\n Office.MailboxEnums.AttachmentContentFormat.ICalendar\n ? btoa(pair.content.content)\n : pair.content.content;\n\n return {\n id: pair.attachment.id,\n name: pair.attachment.name,\n contentType: undefined,\n contentBytes: base64Content,\n size: pair.attachment.size,\n attachmentType: 0,\n isInline: pair.attachment.isInline,\n DataType:\n pair.attachment.attachmentType ===\n Office.MailboxEnums.AttachmentType.File\n ? 'FileAttachment'\n : 'ItemAttachment',\n };\n });\n\n return convertedAttachments;\n}\n\nexport async function getSupportedAttachmentsForItemId(\n itemId: string,\n itemType: string,\n sharedProperties: Office.SharedProperties | undefined\n): Promise {\n try {\n const attachments = await GraphApi.getAttachments(\n itemId,\n itemType,\n sharedProperties\n );\n\n const convertedAttachments = attachments\n .filter(\n (attachment): attachment is MicrosoftGraph.FileAttachment =>\n !!(attachment as MicrosoftGraph.FileAttachment).contentBytes\n )\n .map((attachment) => {\n const mailbox = Office.context.mailbox;\n\n const ewsAttachmentId = mailbox.convertToEwsId(\n attachment.id,\n Office.MailboxEnums.RestVersion.v2_0\n );\n\n const a: Attachment = {\n id: ewsAttachmentId,\n name: attachment.name,\n contentType: attachment.contentType,\n contentBytes: attachment.contentBytes,\n size: attachment.size,\n attachmentType: 0,\n isInline: attachment.isInline,\n DataType: attachment['@odata.type'],\n };\n\n return a;\n });\n\n const supportedAttachments = convertedAttachments.filter(\n (a) => !a.isInline\n );\n\n return supportedAttachments;\n } catch (error) {\n if (error.status === 404) {\n // this occurs when we were able get item id from the Exchange Server,\n // but the since user hasn't yet saved the draft item,\n // Exchange Server is still refusing to acknowledge existence of the item with this id\n throw new ItemIsNotSavedException();\n }\n throw error;\n }\n}\n\nexport async function getAppointmentUids(\n itemId: string,\n sharedProperties: Office.SharedProperties | undefined\n): Promise {\n return await GraphApi.getAppointmentUids(itemId, sharedProperties);\n}\n\nexport async function isReadOnlySharedItem(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties | undefined\n): Promise {\n if (!sharedProperties) {\n return false;\n }\n\n if (\n (sharedProperties.delegatePermissions &\n Office.MailboxEnums.DelegatePermissions.EditOwn) ===\n 0 &&\n (sharedProperties.delegatePermissions &\n Office.MailboxEnums.DelegatePermissions.EditAll) ===\n 0\n ) {\n return true;\n }\n\n try {\n console.log(TAG, 'Checking if shared item is read-only');\n\n const propertyName = 'read_only_permission_test';\n const properties = await OutlookAsyncUtils.getAsyncCustomProperties(item);\n\n properties.set(propertyName, '1');\n await OutlookAsyncUtils.saveAsyncCustomProperties(properties);\n\n properties.remove(propertyName);\n await OutlookAsyncUtils.saveAsyncCustomProperties(properties);\n\n console.log(\n TAG,\n 'Checking if shared item is read-only: ',\n 'Able to save custom properties, not read-only'\n );\n\n return false;\n } catch (error: unknown) {\n console.log(\n TAG,\n 'Checking if shared item is read-only: ',\n 'Received error saving custom properties, assuming read-only',\n error\n );\n\n return true;\n }\n}\n\nexport async function isSavedMeeting(\n item: SupportedOfficeItem,\n sharedProperties: Office.SharedProperties\n) {\n if (!CONFIG.isGraphApiEnabled) {\n return false;\n }\n\n if (item.itemType !== Office.MailboxEnums.ItemType.Appointment) {\n return false;\n }\n\n const itemId = await getItemId(item, sharedProperties);\n\n const [uids, startDate] = await Promise.all([\n getAppointmentUids(itemId, sharedProperties),\n getDateFromOutlookItem(item),\n ]);\n\n const response = await findDuplicateMeeting({\n MeetingUID: uids.uid,\n MeetingRecurrenceID: uids.recurrenceId,\n StartDate: toIsoWithTimeZone(startDate),\n });\n\n return response.IsMatchFound;\n}\n\nexport function getItemRestId(itemId: string) {\n if (Office.context.mailbox.diagnostics.hostName === 'OutlookIOS') {\n // itemId is already REST-formatted.\n return itemId;\n } else {\n // Convert to an item ID for API v2.0.\n return Office.context.mailbox.convertToRestId(\n itemId,\n Office.MailboxEnums.RestVersion.v2_0\n );\n }\n}\n","export function sleep(ms: number) {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve();\n }, ms);\n });\n}\n","import { Exception } from 'common/exceptions/Exception';\nimport { SupportedOfficeItem } from 'common/utils/SupportedOfficeItem';\nimport CONFIG from 'config';\nimport $ from 'jquery';\nimport * as App from '../app/app';\nimport { AddInStakeholder } from '../models/AddInStakeholder';\nimport { DomainDetails } from '../models/DomainDetails';\nimport { Option } from '../models/Option';\nimport { ProjectInfo } from '../models/ProjectInfo';\nimport { Region } from '../models/Region';\nimport { Stakeholder } from './../models/Stakeholder';\nimport { getPrimaryStakeholders } from './contactUtils';\nimport * as OutlookAsyncUtils from './outlookAsyncUtils';\nimport * as UserSettings from './user-settings';\n\nconst TAG = 'AUI3: ';\nexport function showMessageAutosaved() {\n $('#was-autosaved-page').show();\n}\n\nexport function showMessageSaved() {\n $('#was-saved-page').show();\n}\n\nexport function showSeriesEventNotSupported() {\n $('#series-event-not-supported-page').show();\n}\n\nexport function showReadOnlySharedItemNotSupported() {\n $('#read-only-shared-item-not-supported-page').show();\n}\n\nexport async function showPrimaryStakeholdersInfo(item: SupportedOfficeItem) {\n const sharedProperties = await OutlookAsyncUtils.getSharedProperties(item);\n const primaryStakeholders = await getPrimaryStakeholders(\n item,\n sharedProperties\n );\n\n const names = primaryStakeholders.map((s) => s.fullName).join('
');\n const emails = primaryStakeholders.map((s) => s.email).join('
');\n\n changeLabelsByItemType(item);\n\n if (\n !CONFIG.isGraphApiEnabled ||\n item.itemType === 'appointment' ||\n sharedProperties\n ) {\n $('#autoSaveAll').hide();\n $('#autoSaveAllLabel').hide();\n $('#autoSaveAll').removeAttr('checked');\n\n $('#autoSaveOne').attr('checked', 'checked');\n UserSettings.setAutosave(false);\n }\n\n $('#detail-page').show();\n\n $('#user-id').html(names);\n $('#user-sub-text').html(emails);\n}\n\nexport function showStakeholdersForm(\n primaryStakeholders: AddInStakeholder[],\n additionalStakeholders: AddInStakeholder[],\n itemType: string\n) {\n if (itemType === 'appointment') {\n $('#primary-stakeholder-detail').hide();\n $('#save-all-or-primary').hide();\n $('#save-or-cancel-buttons-1').hide();\n $('#cc-bcc-email-main').show();\n $('#cc-bcc-email-main').html('Stakeholders:');\n showAllStakeholders(primaryStakeholders);\n $('input[name=\"save-all-future-email\"]:checked').val('all');\n } else {\n const primaryStakeholder = primaryStakeholders[0];\n $('#item-from').val(primaryStakeholder.email);\n $('#item-org2').val(primaryStakeholder.fullName);\n $('#item-from-fname').val(primaryStakeholder.firstName);\n $('#item-from-lname').val(primaryStakeholder.lastName);\n\n showAdditionalStakeholders(additionalStakeholders);\n }\n}\n\nexport function showAdditionalStakeholders(stakeholders: AddInStakeholder[]) {\n let additionalStakeholdersHtml = '';\n\n let index = 0;\n stakeholders.forEach((stakeholder) => {\n additionalStakeholdersHtml += getStkFormAdd(index++, stakeholder, false);\n });\n\n $('#cc-bcc-emails').html(additionalStakeholdersHtml);\n\n if (stakeholders.length > 0) {\n $('#cc-bcc-email-main').show();\n $('#secondSubmit').show();\n } else {\n $('#cc-bcc-email-main').hide();\n $('#secondSubmit').hide();\n }\n}\n\nexport function showAllStakeholders(stakeholders: AddInStakeholder[]) {\n let additionalStakeholdersHtml = '';\n\n let index = 0;\n stakeholders.forEach((stakeholder) => {\n additionalStakeholdersHtml += getStkFormAdd(index++, stakeholder, true);\n });\n\n $('#cc-bcc-emails').html(additionalStakeholdersHtml);\n\n if (stakeholders.length > 0) {\n $('#secondSubmit').show();\n } else {\n $('#secondSubmit').hide();\n }\n}\n\nfunction getStkFormAdd(\n index: number,\n stakeholder: AddInStakeholder,\n showCheckboxes: boolean\n) {\n let html =\n '
\\\n ';\n\n if (showCheckboxes) {\n html +=\n '\\\n \\\n \\\n ';\n }\n html +=\n '\\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n \\\n
Save this stakeholder
Individual/Organisation\\\n
\\\n \\\n \\\n
\\\n
Email' +\n stakeholder.email +\n '
First Name\\\n
\\\n \\\n
\\\n
Last Name\\\n
\\\n \\\n
\\\n
Organisation\\\n
\\\n \\\n
\\\n
Organisation\\\n
\\\n \\\n
\\\n
Position\\\n
\\\n \\\n
\\\n
Phone\\\n
\\\n \\\n
\\\n
\\\n
';\n\n return html;\n}\n\nexport function getStakeholdersFromUi() {\n const stakeholders = Array();\n const itemEmail = getStringValueOrNull('#item-from');\n const itemPos = getStringValueOrNull('#item-pos');\n const contactGroupsArray = getMultiSelectValues('#item-contact-group');\n const stakeholderType = getStringValueOrNull('#select-individual-main');\n let itemOrg = getStringValueOrNull('#item-org');\n if (stakeholderType != 'Individual') {\n itemOrg = getStringValueOrNull('#item-org2');\n }\n const fname = getStringValueOrNull('#item-from-fname');\n const lname = getStringValueOrNull('#item-from-lname');\n const itemMobile = getStringValueOrNull('#item-mobile');\n\n const primaryStakeholder: Stakeholder = {\n ID: undefined,\n StakeholderType: stakeholderType,\n FirstName: stakeholderType != 'Individual' ? itemOrg : fname,\n LastName: lname,\n Email: itemEmail,\n ContactGroupIDs: contactGroupsArray,\n Organisations: [\n {\n Name: stakeholderType != 'Individual' ? '' : itemOrg,\n Position: stakeholderType != 'Individual' ? '' : itemPos,\n },\n ],\n MobileNumber: undefined,\n WorkPhoneNumber: undefined,\n };\n if (stakeholderType != 'Individual') {\n primaryStakeholder.WorkPhoneNumber = itemMobile;\n } else {\n primaryStakeholder.MobileNumber = itemMobile;\n }\n\n if (primaryStakeholder.Email) {\n stakeholders.push(primaryStakeholder);\n }\n\n if ($('input[name=\"save-all-future-email\"]:checked').val() == 'all') {\n $('.cc-bcc-single-details').each(function () {\n const saveCheckbox = $(this).find('.cc-check');\n if (saveCheckbox.length > 0 && !saveCheckbox.prop('checked')) {\n return;\n }\n\n const itemEmailTo = $(this).find('.emailaddress').html();\n let itemOrgTo = '';\n if ($(this).find('.cc_stakeholder_type').val() == 'Individual') {\n itemOrgTo = $(this).find('.cc-bcc-org').val().toString();\n } else {\n itemOrgTo = $(this).find('.cc-bcc-org2').val().toString();\n }\n const itemPosTo = $(this).find('.cc-bcc-pos').val().toString();\n const itemMobileTo = $(this).find('.cc-bcc-mobile').val().toString();\n const StakeholderTypeTo = $(this)\n .find('.cc_stakeholder_type')\n .val()\n .toString();\n const fnameTo = $(this).find('.cc-bcc-fname').val().toString();\n const lnameTo = $(this).find('.cc-bcc-lname').val().toString();\n const additionalStakeholder: Stakeholder = {\n ID: undefined,\n StakeholderType: StakeholderTypeTo,\n FirstName: StakeholderTypeTo != 'Individual' ? itemOrgTo : fnameTo,\n LastName: lnameTo,\n Email: itemEmailTo,\n ContactGroupIDs: contactGroupsArray,\n Organisations: [\n {\n Name: StakeholderTypeTo != 'Individual' ? '' : itemOrgTo,\n Position: StakeholderTypeTo != 'Individual' ? '' : itemPosTo,\n },\n ],\n MobileNumber: undefined,\n WorkPhoneNumber: undefined,\n };\n if (StakeholderTypeTo != 'Individual') {\n additionalStakeholder.WorkPhoneNumber = itemMobileTo;\n } else {\n additionalStakeholder.MobileNumber = itemMobileTo;\n }\n stakeholders.push(additionalStakeholder);\n });\n }\n return stakeholders;\n}\n\nfunction changeLabelsByItemType(item: SupportedOfficeItem) {\n if (item.itemType === 'appointment') {\n const labels = [\n '#login-text',\n\n '#autoSaveAllLabel',\n '#autoSaveOneLabel',\n\n '#save-email-detail',\n '#save-email-detail2',\n\n '#item-saved-successfully',\n ];\n\n let tooltip = $('#futureAllTooltip').attr('title');\n if (tooltip) {\n tooltip = tooltip.replace('email', 'event');\n }\n $('#futureAllTooltip').attr('title', tooltip);\n\n $('#div-interaction-method').hide();\n\n labels.forEach((l) => changeLabelByItemType(l));\n }\n}\n\nfunction changeLabelByItemType(id: string) {\n let currentLabel = $(id).html();\n if (currentLabel) {\n currentLabel = currentLabel.replace('email', 'event');\n currentLabel = currentLabel.replace('Email', 'Event');\n }\n $(id).html(currentLabel);\n}\n\nexport function setIcon(path: string, width: number) {\n $('#header-logo').attr('width', width);\n $('#header-logo').attr('src', path);\n}\n\nexport function setAppName(name: string) {\n const elements = ['#login-text', '#item-saved-successfully'];\n for (const el of elements) {\n setAppNameInElement(el, name);\n }\n}\n\nexport function setFreeTrialUrl(url: string) {\n const id = '#login-text__free-trial';\n $(id).attr('href', url);\n}\n\nexport function setOptions(\n isComplaintsEnabled: boolean,\n isConfidentialOptionsEnabled: boolean\n) {\n if (isComplaintsEnabled) $('#div-interaction-method').show();\n else $('#div-interaction-method').hide();\n\n if (isConfidentialOptionsEnabled) $('#form-confidentiality').show();\n else {\n $('#form-confidentiality').hide();\n }\n}\n\nfunction setAppNameInElement(id: string, name: string) {\n let html = $(id).html();\n html = html.replace(/APP_NAME/g, name);\n $(id).html(html);\n}\n\nexport function renderOptions(\n options: Option[],\n selector: string,\n addEmptyOption = false\n) {\n let html = '';\n if (addEmptyOption) {\n html = '';\n }\n\n options.forEach(function (item) {\n html += '';\n });\n\n $(selector).html(html);\n\n if (html == '') {\n $(selector.replace('#', '.') + '-main').hide();\n } else {\n $(selector.replace('#', '.') + '-main').show();\n }\n}\n\nexport function showRegions(regions: Region[]) {\n const regionSelect = $('#select-domain-login');\n\n const domain = UserSettings.getDomain();\n\n let selected = false;\n let options = '';\n regions.forEach(function (item) {\n if (domain == item.api_url) {\n selected = true;\n options +=\n '';\n } else {\n options +=\n '';\n }\n });\n\n if (!selected) {\n options =\n '' + options;\n }\n\n regionSelect.html(options);\n}\n\nexport function showErrorInForm(message: string, error?: Exception) {\n $('#loader').hide();\n\n $('#error__message-details').hide();\n\n if (error) {\n let errorDetails: string;\n if (error instanceof Error) {\n // instance of \"Error\" cannot be stringified, just show the stack. it will include the error message.\n errorDetails = error.stack;\n } else {\n errorDetails = JSON.stringify(error);\n }\n\n $('#error__message-details').html('
' + errorDetails);\n\n $('#error__btn-details').show();\n } else {\n $('#error__btn-details').hide();\n }\n $('#error__message').html(message);\n\n $('#error-dialog').show();\n}\n\nexport function showInfoDialog(message: string) {\n $('#loader').hide();\n $('#dialog-info p').html(message);\n $('#dialog-info').show();\n}\n\nexport function hideInfoDialog() {\n $('#dialog-info').hide();\n}\n\nexport function showAuthErrorDialog(message: string | null) {\n $('#loader').hide();\n $('#detail-save-error p').html(message);\n $('#detail-save-error').show();\n}\n\nexport function showLogoutSuccessDialog() {\n $('#loader').hide();\n $('#dialog-logout-success').show();\n}\n\nexport function refreshDomains(\n domains: DomainDetails[],\n favouriteDomainAndGroup: ProjectInfo,\n projectGroupAvailable: boolean\n) {\n let domainOption = '';\n if (domains.length > 1) {\n domainOption = '';\n }\n if (favouriteDomainAndGroup) {\n domainOption = '';\n }\n for (let index = 0; index < domains.length; index++) {\n domainOption +=\n '';\n }\n $('#save-domain').html(domainOption);\n if (favouriteDomainAndGroup) {\n $('#save-domain').val(favouriteDomainAndGroup.domainId).trigger('change');\n if (projectGroupAvailable) {\n $('#save-proj-group')\n .val(favouriteDomainAndGroup.projectGroupId)\n .trigger('change');\n }\n $('#save-project').val(favouriteDomainAndGroup.projectId).trigger('change');\n } else {\n const domainOptions = $('#save-domain').find('option');\n // select the first domain OR the placeholder option\n const defaultOption =\n domainOptions.length > 1 ? domainOptions[1] : domainOptions[0];\n\n defaultOption.setAttribute('selected', 'true');\n $('#save-domain').trigger('change');\n }\n\n $('#form-domain').show();\n $('#ProjectGroupContainer').show();\n $('#form-project').show();\n\n // if there is only one domain, hide the dropdown\n if (domains.length == 1) {\n $('#form-domain').hide();\n const domain = domains[0];\n\n if (projectGroupAvailable) {\n const groupsWithAccessibleProjects = domain.ProjectGroups.filter(\n (g) => g.Projects && g.Projects.length\n );\n // if there is only one project group, select it and hide the dropdown\n if (groupsWithAccessibleProjects.length == 1) {\n const group = groupsWithAccessibleProjects[0];\n if (!favouriteDomainAndGroup) {\n $('#save-proj-group').val(group.ID).trigger('change');\n }\n $('#ProjectGroupContainer').hide();\n\n // if there is only one project within the only one project group, hide the dropdown and select the project\n if (group.Projects.length == 1 && !favouriteDomainAndGroup) {\n $('#form-project').hide();\n $('#save-project').val(group.Projects[0].ID).trigger('change');\n }\n }\n } else {\n $('#ProjectGroupContainer').hide();\n // if no project groups and there is only one project, hide the dropdown and select the project\n if (domain.Projects.length == 1 && !favouriteDomainAndGroup) {\n $('#form-project').hide();\n $('#save-project').val(domain.Projects[0].ID).trigger('change');\n }\n }\n }\n}\n\nexport function checkSaveForm(): boolean {\n console.log(TAG, 'Validating the form');\n const projectGroup = $('#save-proj-group').val();\n const project = $('#save-project').val();\n let priorities = false;\n let assignedTo = false;\n if ($('#item-communication').val() == 'Complaint') {\n priorities = $('#complaint-priorities').val() ? false : true;\n assignedTo = $('#item-assigned-to').val() ? false : true;\n }\n\n if (\n (projectGroup == null || projectGroup == '') &&\n App.projectGroupAvailable\n ) {\n $('#project-group-error').html('Please select Project Group');\n $('#save-proj-group').focus();\n console.log(TAG, 'Validation not passed: project group');\n return false;\n } else if (project == null || project == '') {\n $('#project-group-error').html('');\n $('#project-error').html('Please select Project');\n $('#save-project').focus();\n console.log(TAG, 'Validation not passed: project');\n return false;\n } else if (CONFIG.isComplaintsEnabled && assignedTo) {\n $('#item-assigned-to-error').html('Please select Assign To');\n $('#item-assigned-to').focus();\n console.log(TAG, 'Validation not passed: item assigned to');\n return false;\n } else if (CONFIG.isComplaintsEnabled && priorities) {\n $('#complaint-priorities-error').html('Please select Complaint Priorities');\n $('#complaint-priorities').focus();\n console.log(TAG, 'Validation not passed: complaint priorities');\n return false;\n } else {\n $('#project-group-error').html('');\n $('#project-error').html('');\n $('#item-assigned-to-error').html('');\n $('#complaint-priorities-error').html('');\n console.log(TAG, 'Validation passed');\n return true;\n }\n}\n\nexport function hidePages() {\n $('#welcome-pg').hide();\n\n $('#series-event-not-supported-page').hide();\n $('#was-saved-page').hide();\n $('#was-autosaved-page').hide();\n\n $('#login-page').hide();\n $('#detail-page').hide();\n hideDocumentDetailsPage();\n $('#detail-final').hide();\n $('#item-not-supported-page').hide();\n}\n\nfunction getStringValueOrNull(id: string) {\n const value = $(id).val();\n if (value) {\n return value.toString();\n } else {\n return null;\n }\n}\n\nfunction getMultiSelectValues(id: string): string[] {\n const data = $(id).select2('data');\n\n return data.map((value) => value.id);\n}\n\nexport function hideDocumentDetailsPage() {\n $('#detail-final').hide();\n}\n\nexport function showSaveSuccessfulDialog() {\n $('#detail-save-pop').show();\n}\n\nexport function hideSaveSuccessfulDialog() {\n $('#detail-save-pop').hide();\n}\n\nexport function showItemNotSupportedPage() {\n $('#item-not-supported-page').show();\n}\n","import CONFIG from 'config';\n\nexport function getDomain(): string {\n return localStorage.getItem(CONFIG.appPrefix + '_' + 'selectDomainDarzin');\n}\n\nexport function setDomain(value: string) {\n localStorage.setItem(CONFIG.appPrefix + '_' + 'selectDomainDarzin', value);\n}\n\nexport function setClientCode(value: string) {\n localStorage.setItem(CONFIG.appPrefix + '_' + 'clientCode', value);\n}\n\nexport function getClientCode(): string {\n return localStorage.getItem(CONFIG.appPrefix + '_' + 'clientCode');\n}\n\nexport function setProject(value: string | null) {\n if (!value) {\n localStorage.removeItem(CONFIG.appPrefix + '_' + 'project_id');\n } else {\n localStorage.setItem(CONFIG.appPrefix + '_' + 'project_id', value);\n }\n}\n\nexport function getProject(): string | null {\n return localStorage.getItem(CONFIG.appPrefix + '_' + 'project_id');\n}\n\nexport function setToken(value: string) {\n localStorage.setItem(CONFIG.appPrefix + '_' + 'token', value);\n}\n\nexport function getToken(): string {\n return localStorage.getItem(CONFIG.appPrefix + '_' + 'token');\n}\n\nexport function setTokenExpire(value: string) {\n localStorage.setItem(CONFIG.appPrefix + '_' + 'token_expire', value);\n}\n\nexport function getTokenExpire(): string {\n return localStorage.getItem(CONFIG.appPrefix + '_' + 'token_expire');\n}\n\nexport function setRefreshToken(value: string) {\n localStorage.setItem(CONFIG.appPrefix + '_' + 'refresh_token', value);\n}\n\nexport function getRefreshToken(): string {\n return localStorage.getItem(CONFIG.appPrefix + '_' + 'refresh_token');\n}\n\nexport function setAutosave(value: boolean) {\n localStorage.setItem(CONFIG.appPrefix + '_' + 'autosave', String(value));\n}\n\nexport function getAutosave(): boolean {\n const value = localStorage.getItem(CONFIG.appPrefix + '_' + 'autosave');\n return value === 'true';\n}\n","import 'common/index';\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkaddon_stakeholder\"] = self[\"webpackChunkaddon_stakeholder\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [707,278,286,514], function() { return __webpack_require__(88639); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","savingMessage","autosavingMessages","lastAutosave","autosaveTimerId","startingApp","currentItem","OutlookWrongItemSelectedException_1","require","OutlookItemUtils","__importStar","sleep_1","config_1","__importDefault","jquery_1","Api","contactUtils_1","OutlookAsyncUtils","Ui","UserSettings","dateUtils_1","AppAutosave","errorHandler_1","ItemProperties","AppSave","exports","TAG","tryAutosaveIfDue","console","log","getDiffInMinutes","Date","default","autosaveIntervalInMinutes","waitForAllTasks","_a","sent","autosaveNewMessages","errorHandler","error_2","start","item","getSharedProperties","sharedProperties","isReadOnlySharedItem","showReadOnlySharedItemNotSupported","isItemSavedThroughApi","showMessageSaved","isAutosaved","showMessageAutosaved","isRecurringMaster","showSeriesEventNotSupported","isSavedMeeting","showPrimaryStakeholdersInfo","sleep","OutlookWrongItemSelectedException","error_1","showItemNotSupportedPage","isGraphApiEnabled","clearInterval","undefined","window","setInterval","saveMessage","error_3","getAutosave","each","this","val","prop","_b","Promise","all","getPrimaryStakeholders","getAdditionalStakeholders","primaryStakeholders","additionalStakeholders","showStakeholdersForm","itemType","getDomainList","domainsInfo","DomainDetails","ProjectGroupAvailable","favouriteDomainAndGroup","domainList","FavouriteProjectDetails","favProjectName","ProjectName","projectGroupAvailable","domains","favouriteProject","projectInfos","forEach","domain","ProjectGroups","projectGroup","Projects","project","push","domainId","ID","projectGroupId","projectId","find","projectInfo","getFavDomainAndGroup","refreshDomains","_j","_i","domains_1","length","_c","_d","group","_e","_f","_g","_h","localStorage","clear","showLogoutSuccessDialog","allNewMessages","ApplicationException_1","Auth","GraphApi","graphItemUtils_1","outlookItemUtils_1","AppContacts","getAutosaveContacts","getOrCreateContactGroup","contactGroupName","getContacts","id","contacts","autosaveMessagesForContact","contact","emailAddresses","address","ApplicationException","JSON","stringify","customFields","getClientCode","getDomain","clientId","domainUrl","isCorrectClientCode","getCustomFields","lastSyncDate","isNaN","Number","lastModifiedDateTime","messages","email","filter","m","clone","adjustedLastSyncDate","setSeconds","getSeconds","receivedDateTime","from","emailAddress","toRecipients","r","getMessages","setProject","refreshToken","findStakeholder","stakeholder","stakeholderId","deleteContact","concat","Email","appName","messageSaved","messages_1","shouldSaveMessage","message","autosaveMessage","markItemAsSavedThroughGraph","setLastSyncDate","prepareMessages","addressesToDates","Map","contacts_2","fields","set","allMessages","contactMessagesAscending","sort","a","b","aDate","bDate","isItemSavedThroughGraph","subject","isExcludedPromise","ensureEmailSubjectIsNotExcluded","Subject","isSavedPromise","allowToSaveMessageAgain","findDuplicateEmail","EmailAddresses","__spreadArray","map","to","Message","body","content","DateTime","toIsoWithTimeZone","IsMatchFound","isEmailADuplicate","isExcluded","isSavedOnServer","emailType","saveInteraction","saveComplaint","uploadAttachmentsForItemId","attachmentsIds","getInteractionForAutosave","interaction","interactionId","linkInteractionToStakeholders","linkInteractionToAttachments","trackVitallyEvent","eventName","getComplaintForAutosave","complaint","complaintId","linkComplaintToStakeholders","linkComplaintToAttachments","direction","getDirectionForGraphItem","dateTime","template","communicationTemplate","getDirectionFromServer","communicationDirection","Location","CommunicationDate","Method","Text","Direction","Confidential","Duration","AssignedTo","DateOpened","Priority","Status","getDateFromOutlookItem","messageDate","setMilliseconds","getAllStakeholders","stakeholders","itemContacts","c","stakeholders_1","autosavedForAllContacts","every","givenName","startAutosaveDate","contacts_1","ContactCustomFields_1","setCustomFields","personalNotes","parsed","Object","assign","ContactCustomFields","parse","updateDate","error","firstSaveDate","getContact","existingContact","FirstName","surname","LastName","name","children","existingCustomFields","createOrUpdateContact","date","updateContact","AddInFeatureNotSupportedException_1","ApiException_1","ItemIsNotSavedException_1","MeetingAlreadySavedException_1","AuthException_1","AuthInvalidGrantException_1","ConnectionException_1","ForbiddenException_1","OutlookApiException_1","OutlookException_1","OutlookItemNotSupported_1","friendlyMessage","errorMessage","friendlyMessageWithColon","friendlyMessageWithErrorMessage","ItemIsNotSavedException","showInfoDialog","MeetingAlreadySavedException","OutlookItemNotSupported","AddInFeatureNotSupportedException","ApiException","showErrorInForm","ConnectionException","AuthException","showAuthErrorDialog","ForbiddenException","OutlookApiException","OutlookException","outlookAsyncUtils_1","getAsyncCustomProperties","properties","isSaved","get","appPrefix","getExtendedProperty","property","saveAsyncCustomProperties","setExtendedProperty","getContactGroups","contactGroups","renderOptions","show","getConfidentialities","confidentialities","getUsers","users","trigger","getPriorities","priorities","getStatuses","statuses","getSubjectFromOutlookItem","apply","saveStakeholders","savingStakeholders","createOrUpdateStakeholder","stakeholderIds","uploadAttachmentsIfSupported","getInteractionFromUi","getItemId","getAppointmentUids","uids","uid","MeetingUID","MeetingRecurrenceID","recurrenceId","getComplaintFromUi","getLocationFromOutlookItem","location","getDirectionFromOutlookItem","getEndDateFromOutlookItem","endDateTime","duration","getDiffInHours","getAsyncBody","confidentialValue","confidential","isConfidentialOptionsEnabled","Value","getInteractionMethodFromOutlookItem","priorityValue","assignedTo","statusValue","priority","toString","status","uploadAttachmentsForItem","isAttachmentsEnabled","getSupportedAttachmentsForItem","uploadAttachmentContent","attachments","attachment","attachmentSize","size","request","FileName","SizeKb","validateAttachment","index","indexOf","splice","uploadOutlookAttachments","isInline","response","ResponsesByAttachment","IsSuccess","FileID","mergeStakeholderInfo","saveStakeholder","checks","DocumentType","DocumentID","ensureEmailIsNotDuplicate","getStakeholdersFromUi","stakeholdersIds","communication","markItemAsSavedThroughApi","showSaveSuccessfulDialog","hide","createAutosaveContact","getProject","saveAutosaveContact","itemId","getSupportedAttachmentsForItemId","_super","call","__extends","Exception","originalException","AuthInvalidGrantException","InternalServerException","UnknownHttpException","apiResponse","_this","App","AppOptions","Authenticator_1","$","jQuery","permissionDialog","selectDomain","processingProjectChange","isProjectOptionsUpdated","handleSelectedOutlookItemChanged","Office","context","mailbox","isTokenValid","hideSaveSuccessfulDialog","hidePages","startAutosaveTimer","tryStart","handleSignInClick","domainElement","ui","displayDialogAsync","urls","origin","height","width","promptBeforeOpen","onPermissionDialogLoad","asyncResult","value","addEventHandler","EventType","DialogMessageReceived","onPermissionDialogResult","arg","close","permissionGranted","html","endsWith","slice","setDomain","Authenticator","baseUrl","authorizeUrl","auth","client_id","redirectUrl","form","scope","responseType","extraQueryParameters","login_hint","userProfile","authenticate","focus","getToken","code","refreshClientCode","selectAnyProjectId","innerError","handleSignInPermissionAllowedClick","handleLoginConfirmClick","handleAutosaveOptionClick","e","setAutosave","target","handleAutosaveOptionChosen","error_4","handleDomainChange","event","selectedDomain","projectGroupOption","singleProjectGroup","j","ProjectGroupName","projectOption","singleProject","dataProject","handleProjectChanged","blur","optionPromises","refreshContactGroups","refreshConfidentialities","refreshUsers","refreshPriorities","refreshComplaintStatuses","error_5","handleProjectGroupChange","selectedProjectGroup","handleEmailTypeChange","handleItemAssignedToChange","handleComplaintPriorityChange","handleStakeholderTypeChange","parent","handleAdditionalStakeholderTypeChanged","pTable","handleSaveClick","checkSaveForm","trySaveMessage","handleSaveCancelClick","handleLogoutClick","logout","handleErrorDialogCloseClick","handleErrorDialogDetailsClick","handleInfoDialogOkClick","hideInfoDialog","handleLogoutSuccessDialogOkClick","reload","handleSavedDialogCloseClick","hideDocumentDetailsPage","handleSessionExpiredDialogOkClick","initialize","isAuthDialog","version","enableDemoAPIRegion","setAppName","setFreeTrialUrl","freeTrialUrl","setIcon","appIcon","appIconWidth","setOptions","isComplaintsEnabled","showRegions","regions","click","isTokenExpired","onReady","document","ready","addHandlerAsync","ItemChanged","select2","on","CommunicationTemplate_1","defineProperty","prototype","startDate","cleanTemplate","CommunicationTemplate","key","hasOwnProperty","Http","linkEntities","post","Success","LinkEntityType","getOptions","url","Array","isArray","outlookItemDirection","d","IsSubjectExcluded","ErrorCode","EntityID","stackHolderIds","LinkID","ToIDs","LinkPropertyAndStakholder","attachmentIds","toLowerCase","responsesByAttachment","failedAttachments","join","ClientCode","checkUrl","StakeholderType","dto","isRefreshingToken","getTokenExpire","payload","grant_type","client_secret","redirect_uri","postForm","setTokenExpire","setToken","setRefreshToken","refresh_token","getRefreshToken","clientCode","setClientCode","getAllPartiesFromMessage","outlookItem","addresses","cc","removeDuplicatesByEmail","getAllPartiesFromAppointment","appointment","isAppointmentReadMode","appointmentRead","requiredAttendees","optionalAttendees","appointmentCompose","getAsyncRecipients","organizer","getAsyncOrganizer","officeItem","userEmail","getUserEmail","getAllParties","parties","__assign","fullName","displayName","getFirstAndLastName","firstName","lastName","split","substr","i","tzo","getTimezoneOffset","dif","pad","num","norm","Math","floor","abs","getFullYear","getMonth","getDate","getHours","getMinutes","dateA","dateB","microsoft_graph_client_1","http_status_codes_1","graphAuthUtils_1","extendedPropertiesPropertyId","appId","expandExtendedProperties","contactFoldersCache","filterExtendedProperties","propertyValue","client","Client","initWithMiddleware","authProvider","GraphAuthenticationProvider","getContactGroup","has","createContactGroup","api","groups_1","iterator","PageIterator","iterate","g","groupId","patch","createContact","contactGroupId","contactId","delete","error_6","getMessagesFromFolder","folder","requests","path","extrasLength","fullSearchExpression","currentExpression","toISOString","encodeURIComponent","request_2","search","top","requests_1","getAllPagedMessages","error_7","getEvent","getUserGraphUrlSegment","getItemRestId","error_8","getAppExtendedProperties","expand","appExtendedProperties","singleValueExtendedProperties","error_11","targetMailbox","inbox","findIndex","m2","event_1","type","seriesMasterId","iCalUId","error_9","statusCode","StatusCodes","NOT_FOUND","events","error_10","restItemId","userSegment","propertyName","currentProperties","json","newMessage","error_12","InternalServerException_1","UnknownHttpException_1","processError","httpError","responseJSON","UNAUTHORIZED","FORBIDDEN","INTERNAL_SERVER_ERROR","BAD_REQUEST","responseText","includes","cache","resolve","reject","ajax","headers","Authorization","data","success","err","processedError","Exception_1","dialog_1","endpoint_1","AuthError","endpoint","_openAuthDialog","test","href","Dialog","getUrlParams","exclude","delimiter","replace","left","right","tokenString","extractParams","segment","trim","matchParts","params","regex","exec","decodeURIComponent","getLoginParams","state","result","_handleTokenResult","generateCryptoSafeRandom_1","endpointConfig","resource","generateCryptoSafeRandom","nonce","urlSegments","keys","param","random","Uint32Array","msCrypto","getRandomValues","Error","crypto","getAsync","bodyResult","AsyncResultStatus","Succeeded","recipients","recipientsResult","organizerResult","time","saveAsync","saveResult","getItemIdAsync","getIdResult","loadCustomPropertiesAsync","recurrence","recurrenceType","seriesId","getSharedPropertiesAsync","getAttachmentsAsync","attachmentId","getAttachmentContentAsync","api_1","assertHasGraphApi_1","owner","getAsyncLocation","dateTimeCreated","getAsyncTime","getAsyncId","getItemIdBySearchOnCustomProperties","getItemIdBySearchOnCustomPropertiesError_1","errorsDescription","getIdError","getIdError_1","saveError","saveError_1","getItemIdBySearchOnCustomPropertiesError","assertHasGraphApi","searchFlagValue","getFirstEventIdByCustomProperty","valueOf","getAttachments","contentBytes","convertToEwsId","MailboxEnums","RestVersion","v2_0","contentType","attachmentType","DataType","senderEmail","getAsyncSubject","end","requirements","isSetSupported","AttachmentType","File","Item","__awaiter","getAttachmentContent","pair","base64Content","format","AttachmentContentFormat","Eml","ICalendar","btoa","delegatePermissions","DelegatePermissions","EditOwn","EditAll","remove","ItemType","Appointment","findDuplicateMeeting","StartDate","diagnostics","hostName","convertToRestId","ms","setTimeout","showAdditionalStakeholders","additionalStakeholdersHtml","getStkFormAdd","showAllStakeholders","showCheckboxes","setAppNameInElement","getStringValueOrNull","names","s","emails","tooltip","attr","l","currentLabel","changeLabelsByItemType","removeAttr","primaryStakeholder","itemEmail","itemPos","contactGroupsArray","stakeholderType","itemOrg","fname","lname","itemMobile","ContactGroupIDs","Organisations","Name","Position","MobileNumber","WorkPhoneNumber","saveCheckbox","itemOrgTo","itemEmailTo","itemPosTo","itemMobileTo","StakeholderTypeTo","fnameTo","additionalStakeholder","elements_1","options","selector","addEmptyOption","regionSelect","selected","api_url","label","errorDetails","stack","domainOption","DomainName","domainOptions","setAttribute","groupsWithAccessibleProjects","getItem","setItem","removeItem","String","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","module","__webpack_modules__","O","chunkIds","fn","notFulfilled","Infinity","fulfilled","definition","o","enumerable","globalThis","Function","obj","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","bind","__webpack_exports__"],"sourceRoot":""}