{"version":3,"file":"91168.04803af21abfb763.js","mappings":"4OAMO,IAAMA,EAA8B,MAArC,MAAOA,UAAsCC,IAE/CC,+BAA+BC,GAE3B,OAAOC,KAAKC,KADSD,KAAKE,gBAAkB,sCACnBC,KAAKC,UAAUL,GAC5C,CAEAM,qBAAqBC,GAEjB,OAAON,KAAKC,KADSD,KAAKE,gBAAkB,0CACnBC,KAAKC,UAAUE,GAC5C,CAEOC,iCAAiCC,GAEpC,OAAOR,KAAKC,KADSD,KAAKE,gBAAkB,wCACnBC,KAAKC,UAAUI,GAC5C,oEAfSZ,KAA6Ba,GAA7Bb,EAA6B,qCAA7BA,EAA6Bc,QAA7Bd,EAA6Be,mBAA7Bf,CAA8B,KAkBrC,MAAOgB,EACTC,qBAA+B,KAC/BC,SAAmB,KACnBC,YAAsB,KAEpB,MAAOC,EACTC,GAAa,KACbC,QAAkB,KAGhB,MAAOC,EACTN,qBAA+B,KAC/BI,GAAa,KACbG,eAAyB,KAEvB,MAAOC,EACTJ,GAAa,KACbJ,qBAA+B,KAC/BS,YAAsB,KACtBC,gBAA0B,wFCtCpBC,MAAA,WACEA,MAAA,kBACFA,+BADcA,QAAcA,MAAd,OAAAC,EAAAC,KAAcF,CAAD,YAAAC,EAAAE,YAAAC,2CAI3BJ,MAAA,WACEA,MAAA,WACFA,QACAA,MAAA,WACEA,MAAA,kBACFA,+BAJOA,cAAA,YAAAC,EAAAI,4BAAAX,QAAAM,OAGOA,MAAA,GAAcA,MAAd,OAAAC,EAAAC,KAAcF,CAAD,YAAAC,EAAAE,YAAAG,mDAI3BN,MAAA,WAEEA,MADA,iBACAA,CADoF,kBAEtFA,+BAFcA,QAAcA,MAAd,OAAAC,EAAAC,KAAcF,CAAD,YAAAC,EAAAE,YAAAI,oBACbP,QAAcA,MAAd,OAAAC,EAAAC,KAAcF,CAAD,YAAAC,EAAAE,YAAAK,iEAlBjCR,MAAA,YAAoCA,MAAA,sBAAAA,MAAAS,GAAA,MAAAR,EAAAD,QAAA,OAAAA,MAAYC,EAAAS,WAAU,GACxDV,MAAA,WAcEA,MAbA,EAAAW,EAAA,YAaAX,CAboB,EAAAY,EAAA,IAapBZ,CARsB,EAAAa,EAAA,aAe1Bb,kCAtBMA,MAAA,YAAAC,EAAAC,MAEFF,MAAA,GAAAA,MAAAC,EAAAa,aAAA,MAKAd,cAAAC,EAAAc,eAAA,MAQAf,cAAAC,EAAAe,mBAAA,+CAUJhB,MAAA,cAAoFA,MAAA,mBAAAA,MAAAiB,GAAA,MAAAhB,EAAAD,QAAA,OAAAA,MAASC,EAAAiB,aAAY,GAAElB,MAAA,eAASA,gCAAxDA,MAAA,WAAAC,EAAAkB,qDAG5DnB,MAAA,cAAoFA,MAAA,mBAAAA,MAAAoB,GAAA,MAAAnB,EAAAD,QAAA,OAAAA,MAASC,EAAAoB,iBAAgB,GAAErB,MAAA,YAAMA,gCAAzDA,MAAA,WAAAC,EAAAkB,qDAG5DnB,MAAA,cAAoFA,MAAA,mBAAAA,MAAAsB,GAAA,MAAArB,EAAAD,QAAA,OAAAA,MAASC,EAAAsB,uBAAsB,GAAEvB,MAAA,qBAAeA,gCAAxEA,MAAA,WAAAC,EAAAkB,aCZzD,IAAMK,EAAgC,MAAvC,MAAOA,UAAwCC,IA4CrCC,YACAC,MACAC,OACAC,8BACAC,kBA/C0CC,SAC7CC,mBAA6B,GAC7BC,SAAmB,KAClBC,uBAA4C,IAAIC,MAC1DjC,KACAkC,SAAmB,EACX7D,4BAAmE,IAAIa,EAC/EiB,4BAAmE,IAAIb,EAC/DR,0BAA+D,IAAIa,EACnEwC,8BAA2E,IAAI1C,EAEvFmB,cAAwB,EAChBwB,WAAqB,EAC7BvB,gBAA0B,EAC1BC,oBAA8B,EAE9Bb,YAAc,CACVC,gBAA4B,CACxBmC,IAAK,WACLC,MAAO,WACPC,KAAM,CAAEC,KAAM,QAASC,UAAW,KAClCC,WAAY,CAACC,cAAqBC,qBAEtCxC,wBAAoC,CAChCiC,IAAK,iBACLC,MAAO,OACPC,KAAM,CAAEE,UAAW,GACnBC,WAAY,CAACC,gBAEjBtC,mBAA+B,CAC3BgC,IAAK,cACLC,MAAO,eACPC,KAAM,CAAEC,KAAM,WAAYC,UAAW,IACrCC,WAAY,CAACC,gBAEjBrC,uBAAmC,CAC/B+B,IAAK,kBACLC,MAAO,mBACPC,KAAM,CAAEC,KAAM,WAAYC,UAAW,IACrCC,WAAY,CAACC,iBAGrBE,YACYrB,EACAC,EACAC,EACAC,EACAC,GAERkB,QANQxE,KAAAkD,cACAlD,KAAAmD,QACAnD,KAAAoD,SACApD,KAAAqD,gCACArD,KAAAsD,mBAGZ,CAEOmB,WACHzE,KAAKD,4BAA4Bc,qBAAuBb,KAAKmD,MAAMuB,SAASC,OAAOC,qBAC9EC,uBAAgC7E,KAAKyD,YACtCzD,KAAKD,4BAA4Be,SAAWd,KAAKyD,UAErDzD,KAAK0B,KAAO1B,KAAKkD,YAAY4B,MAAM9E,KAAKD,6BACnCC,KAAKD,4BAA4Bc,sBAAiF,WAAzDb,KAAKD,4BAA4Bc,sBAI/Fb,KAAK4D,SAAU,EACf5D,KAAKuD,SAASwB,QAJV/E,KAAK6B,4BAA4BX,QAAU,2DAKnD,CACA,cAAIyB,GACA,OAAQ3C,KAAK0B,KAAKsD,OAAShF,KAAK8D,SACpC,CAEMpB,aAAU,IAAAuC,EAAAjF,KAAA,SAAAkF,KAAA,YACZD,EAAKnB,WAAY,EAEjBqB,OAAOC,OAAOH,EAAKlF,4BAA6BkF,EAAKvD,KAAK2D,eAC1DJ,EAAKlF,4BAA4BgB,YAAckE,EAAKzB,mBAEpDyB,EAAKK,gBACDL,EAAK5B,8BAA8BvD,+BAA+BmF,EAAKlF,6BAClEwF,UACIC,IACGP,EAAKrB,SAAU,EACfqB,EAAK3C,cAAe,EACpB6C,OAAOC,OAAOH,EAAKpD,4BAA6B2D,GAChDP,EAAKpB,8BAA8B5C,GAAKgE,EAAKzE,0BAA0BS,GAAKuE,EAAWvE,GACvFgE,EAAKvD,KAAOuD,EAAK/B,YAAY4B,MAAMG,EAAKpB,+BACxCoB,EAAK1C,gBAAiB,EACtB0C,EAAKrB,SAAU,EACfqB,EAAKnB,WAAY,GAErB2B,IACIR,EAAKnB,WAAY,GAClB,EArBH,EAsBhB,CAGOjB,iBACH7C,KAAK8D,WAAY,EACjBqB,OAAOC,OAAOpF,KAAK6D,8BAA+B7D,KAAK0B,KAAK2D,eAC5DrF,KAAK6D,8BAA8BhD,qBAAuBb,KAAKD,4BAA4Bc,qBAC3Fb,KAAKsF,gBACDtF,KAAKqD,8BAA8BhD,qBAAqBL,KAAK6D,+BACxD0B,UACIG,IACG1F,KAAK4D,SAAU,EACf5D,KAAKuC,gBAAiB,EACtBvC,KAAK0B,KAAO1B,KAAKkD,YAAY4B,MAAM9E,KAAKQ,2BACxCR,KAAK2F,qBAAqBD,GAC1B1F,KAAKwC,oBAAqB,EAC1BxC,KAAK4D,SAAU,EACf5D,KAAK8D,WAAY,GAErB2B,IACIzF,KAAK8D,WAAY,EACb2B,EAAMA,OAA+B,oJAAtBA,EAAMA,MAAMA,OAC3BzF,KAAK0D,uBAAuBkC,MAAI,EAGxD,CAGO7C,uBACH/C,KAAK8D,WAAY,EACjBqB,OAAOC,OAAOpF,KAAKQ,0BAA2BR,KAAK0B,KAAK2D,eACxDrF,KAAKQ,0BAA0BK,qBAAuBb,KAAK6D,8BAA8BhD,qBACzFb,KAAKsF,gBACDtF,KAAKqD,8BAA8B9C,iCAAiCP,KAAKQ,2BACpE+E,UACG,KACIvF,KAAK8D,WAAY,EACjB9D,KAAK0D,uBAAuBkC,MAAI,EAEpCH,IACIzF,KAAK8D,WAAY,EACb2B,EAAMA,OAA+B,oJAAtBA,EAAMA,MAAMA,OAC3BzF,KAAK0D,uBAAuBkC,MAAI,EAGxD,CAEOC,eACH7F,KAAK0D,uBAAuBkC,MAChC,CAEQD,qBAAqBD,GACzB,IAAItB,EAAa,CAACC,eAAqBqB,EAAmBI,wBACtDC,EAAqB,CACrBC,UAAW,iCAAiCN,EAAmBI,0CAG/DJ,EAAmBO,yBACnB7B,EAAW8B,KAAK5B,uBAChByB,EAAmBI,kBAAuB,uCAG1CT,EAAmBU,yBACnBhC,EAAW8B,KAAK5B,wBAChByB,EAAmBM,mBAAwB,uCAG3CX,EAAmBY,4BACnBlC,EAAW8B,KAAK5B,wBAChByB,EAAmBQ,mBAAwB,oCAG/CvG,KAAK2B,YAAYI,mBAAmBqC,WAAapE,KAAK2B,YAAYI,mBAAmBqC,WAAWoC,OAAOpC,GACvGpE,KAAK2B,YAAYI,mBAAmBgE,mBAAqBA,EAIzD/F,KAAK2B,YAAYK,uBAAuBoC,WAAapE,KAAK2B,YAAYK,uBAAuBoC,WAAWoC,OAAOlC,qBAFzFtE,KAAK0B,KAAK+E,SAASzG,KAAK2B,YAAYI,mBAAmBgC,OAG7E/D,KAAK2B,YAAYK,uBAAuB+D,mBAAqB,CACzDW,iBAAkB,8CAE1B,4CA7KS1D,GAA+BxB,MAAAmF,MAAAnF,MAAAoF,MAAApF,MAAAoF,MAAApF,MAAAqF,GAAArF,MAAAsF,KAAA,+BAA/B9D,EAA+B+D,UAAA,+BAAAC,UAAA,SAAAC,EAAAC,MAAA,EAAAD,QAC7BE,IAAe,oNALf,CAACvH,EAA+BwH,MAAyB5F,aAAA6F,MAAA,EAAAC,KAAA,EAAAC,OAAA,mVAAAC,SAAA,SAAAP,EAAAC,GAAA,EAAAD,IDjBxEzF,MAAA,kBAA2CA,MAAA,0BAAS0F,EAAArB,cAAc,GAgChErE,MA/BA,EAAAiG,EAAA,aA+BAjG,CA/Be,EAAAkG,EAAA,eA+BflG,CANoB,EAAAmG,EAAA,eAMpBnG,CAHsB,EAAAoG,EAAA,gBAMxBpG,eAlCEA,cAAA0F,EAAAtD,QAAA,MAyBApC,cAAA0F,EAAA5E,aAAA,MAGAd,cAAA0F,EAAA3E,eAAA,MAGAf,cAAA0F,EAAA1E,mBAAA,sBCbY2E,IAAiBU,KAAWlB,UAAEmB,KAAmBnB,KAAEoB,KAAeC,cAAA,WAEnEhF,CAAgC,8BCZnCxB,MAAA,WAA2BA,MAAA,GAAeA,QAC1CA,MAAA,8BAD2BA,cAAAyG,EAAAC,sDAO3B1G,MADF,UACEA,CADuB,eACoBA,MAAA,mBAAAA,MAAA2G,GAAA,MAAAF,EAAAzG,QAAA,OAAAA,MAASyG,EAAAG,gBAAe,GAAE5G,MAAA,sBACvEA,mDASNA,MAAA,iCAEAA,MAAA,oCAAAA,MAAAiB,GAAA,MAAAwF,EAAAzG,QAAA,OAAAA,MAA0ByG,EAAAI,2BAA0B,GAAE7G,gCADVA,MAA1C,qBAAAyG,EAAAzE,mBAA0ChC,CAAD,WAAAyG,EAAAxE,WChBtC,IAAK6E,EAAZ,SAAYA,GACRA,WAAAC,cAAA,mBACAD,IAAAE,eAAA,oBAFQF,CAGZ,CAHA,CAAYA,GAAU,IAWf,IAAMG,EAAc,MAArB,MAAOA,EAkDGtF,MACAC,OACAF,YACAwF,aACApF,kBArDJqF,MAAoB,IAAIC,IAChCC,wBAAyB,EACzBnH,KAAkB,KAClBwG,YAAsB,KACdY,WAAyBR,EAAWC,cAC5CQ,yBAAmC,EACnCvF,mBAA6B,KACrBwF,UAAoB,KAC5BvF,SAAmB,KACVwF,2BAA6B,+BAEtC,wBAAIC,GACA,OAAOlJ,KAAK8I,YAAcR,EAAWC,aACzC,CAEA,6BAAIY,GACA,OAAOC,aAAaC,QAAQC,wBAChC,CAEA,mBAAIC,GACA,IAAIC,EAAa,GAGjB,OAAIxJ,KAAK8I,aAAeR,EAAWC,cAC/BiB,EAAa,QACNxJ,KAAK8I,aAAeR,EAAWE,iBACtCgB,EALU,oEAQPA,CACX,CAEA7H,YAAc,CACV8H,gBAA4B,CACxB1F,IAAK,WACLC,MAAO,YACPC,KAAM,CAAEyF,MAAO,KAEnBC,gBAA4B,CACxB5F,IAAK,WACLC,MAAO,WACPC,KAAM,CACFyF,MAAO,GACPxF,KAAM,cAKlBK,YACYpB,EACAC,EACAF,EACAwF,EACApF,GAJAtD,KAAAmD,QACAnD,KAAAoD,SACApD,KAAAkD,cACAlD,KAAA0I,eACA1I,KAAAsD,mBAEZ,CAEMmB,WAAQ,IAAAQ,EAAAjF,KAAA,SAAAkF,KAAA,YAWV,GATAD,EAAKyD,aAAakB,SAElB3E,EAAK4D,wBAAyB,EAC9B5D,EAAK0D,MAAMkB,qBAAuB5E,EAAK9B,MAAMuB,SAASC,OAAOC,qBAC7DwE,aAAaU,QAAQR,qBAA0C,GAAGrE,EAAK0D,MAAMkB,wBAC7E5E,EAAKvD,KAAOuD,EAAK/B,YAAY4B,MAAMG,EAAK0D,OAExC1D,EAAKzB,yBAA2ByB,EAAK3B,kBAAkByG,8BAElD9E,EAAK0D,MAAMkB,sBAA4D,YAApC5E,EAAK0D,MAAMkB,qBAE/C,YADA5E,EAAKiD,YAAc,6DAGvB,GAAwC,WAApCjD,EAAK0D,MAAMkB,qBAEX,YADA5E,EAAKiD,YAAc,8DAGvBjD,EAAK+D,UAAY,qBACjB/D,EAAK9B,MAAM6G,YACNzE,UAAUZ,IACHA,EAAOqE,YACP/D,EAAK+D,UAAYiB,mBAAmBtF,EAAOqE,WAAY,GAInE,MAAMkB,QAAqBjF,EAAKyD,aAAayB,0BAA0BlF,EAAK0D,MAAMkB,sBAAsBO,YACxGnF,EAAK4D,uBAAyBqB,EAAaG,uBAAwB,EA5BzD,EA6Bd,CAEMnI,WAAQ,IAAAoI,EAAAtK,KAAA,SAAAkF,KAAA,YACVoF,EAAKxB,WAAaR,EAAWE,eAC7BrD,OAAOC,OAAOkF,EAAK3B,MAAO2B,EAAK5I,KAAK2D,eACpCiF,EAAK3B,MAAM4B,YAAcD,EAAK9G,mBAG9B4F,aAAaU,QAAQR,oBAAyCgB,EAAK3B,MAAM6B,UAEzEF,EAAK5B,aAAa+B,MAAMH,EAAK3B,OAAOpD,UAAU,CAC1CmF,KAAMA,KACFJ,EAAKpC,YAAc,KACnBoC,EAAKlH,OAAOuH,cAAcL,EAAKtB,WAC/BsB,EAAKxB,WAAaR,EAAWC,eAEjC9C,MAAOA,IACH,IAAImF,EAAU,yDACVnF,EAAMA,OAASA,EAAMA,MAAMA,QAC3BmF,EAAUnF,EAAMA,MAAMA,MACnBmF,IAAYN,EAAKrB,6BAChBqB,EAAK7G,SAAW6G,EAAK3B,MAAM6B,SAC3BF,EAAKvB,yBAA0B,IAGvCuB,EAAKpC,YAAc0C,EACnBN,EAAKxB,WAAaR,EAAWC,gBAElC,EA1BO,EA2Bd,CAEAH,gBACIpI,KAAK+I,yBAA0B,CACnC,CAEAV,2BACIrI,KAAKyD,SAAW,KAChBzD,KAAK+I,yBAA0B,CACnC,4CA7HSN,GAAcjH,MAAAmF,MAAAnF,MAAAmF,MAAAnF,MAAAoF,MAAApF,MAAAqF,MAAArF,MAAAsF,KAAA,+BAAd2B,EAAc1B,UAAA,mBAAA8D,YAAA,EAAAC,SAAA,CAAAtJ,MAJZ,CAAC4F,MAAyB5F,OAAA6F,MAAA,GAAAC,KAAA,GAAAC,OAAA,2aAAAC,SAAA,SAAAP,EAAAC,GAAA,EAAAD,IDjBvCzF,MADF,UACEA,CAD2B,WAEzBA,MAAA,WACAA,MAAA,YAAoCA,MAAA,6BAAY0F,EAAAhF,UAAU,GAExDV,MADA,iBACAA,CADqG,kBAGrGA,MAAA,WACEA,MAAA,EAAAuJ,EAAA,KAIAvJ,MAAA,cACFA,QACAA,MAAA,EAAAwJ,EAAA,aAMJxJ,UAEEA,MADF,WACEA,CAD8B,WACxBA,MAAA,IAEVA,YACAA,MAAA,GAAAyJ,EAAA,yCAtBUzJ,MAAA,GAAAA,MAAA,YAAA0F,EAAAxF,MACQF,QAAwDA,MAAxD,OAAA0F,EAAAxF,KAAwDF,CAA3C,YAAA0F,EAAAvF,YAAA8H,gBAA2CjI,CAAD,mBACvDA,QAAwDA,MAAxD,OAAA0F,EAAAxF,KAAwDF,CAA3C,YAAA0F,EAAAvF,YAAAgI,gBAA2CnI,CAAD,sBAGjEA,MAAA,GAAAA,MAAA0F,EAAAgB,YAAA,MAI8C1G,QAAmCA,MAAnC,YAAA0F,EAAAgC,qBAAmC1H,CAAD,YAAA0F,EAAAqC,gBAAA/H,OAElFA,cAAA0F,EAAA2B,uBAAA,MAQIrH,MAAA,GAAAA,MAAA0F,EAAAiC,2BAGV3H,cAAA0F,EAAA6B,wBAAA,uBCLclB,KAAWjB,UAAEkB,KAAmBlB,KAAEmB,IAAiB/E,GAA+BgF,cAAA,WAEnFS,CAAc,oBCjB3B,MAAMyC,EAAiB,CACnB,CAAEC,KAAM,GAAIC,WAAY,UAAWC,UAAW,QAC9C,CAAEF,KAAM,wBAAyBG,UAAW7C,IAazC,IAAM8C,EAAW,MAAlB,MAAOA,+CAAW,+BAAXA,qCARLC,cAAsBN,GACtBO,IACAhD,EACAzF,YAKKuI,CAAW,6PCNV/J,MAAA,cACqBA,MAAA,mBAAAA,MAAAS,GAAA,MAAAR,EAAAD,MAAA,GAASC,SAAAiK,MAAK,GAAKlK,MAACC,EAAAkK,MAAA/F,OAAY,GACnDpE,MAAA,UACAA,MAAA,aAAyBA,MAAA,GAC3BA,mCAD2BA,MAAA,GAAAA,MAAAC,EAAAmK,yCAL7BpK,MADF,UACEA,CADwB,UACAA,MAAA,GAAcA,QACtCA,MAAA,EAAAqK,EAAA,gBAOFrK,8BAR0BA,MAAA,GAAAA,MAAAC,EAAAqK,YACxBtK,cAAAC,EAAAsK,iBAAA,+CAqBMvK,MAAA,eACEA,MAAA,mBAAAA,MAAAiB,GAAA,MAAAhB,EAAAD,MAAA,GAASC,SAAAiK,MAAK,GAAKlK,MAACC,EAAAkK,MAAA/F,OAAY,GAChCpE,MAAA,GACFA,iCADEA,cAAA,IAAAC,EAAAmK,cAAA,+BARNpK,MAFJ,UAEIA,CAF8B,WAE9BA,CADe,YAEbA,MAAA,KACFA,QACAA,MAAA,YACEA,MAAA,KACAA,MAAA,EAAAwK,EAAA,iBAQNxK,kCARMA,MAAA,GAAAA,MAAAC,EAAAsK,iBAAA,OCvBT,IAAM5E,EAAe,MAAtB,MAAOA,EACA2E,WAAqB,GACrBG,YAAsB,GACtBL,cAAwB,QACxBM,UAAoB,EACpBC,YAAsB,EACtBC,KAAqD,GACrDC,eAAyB,EACzBC,eAA2BA,OAC3BxI,WAAqB,EACrBiI,kBAA4B,EAC5BQ,kBAA4B,EAC5BC,uBAAiC,EAChCb,MAAgC,IAAIhI,MACI8I,UAC1CC,WACAC,UACRC,cAAwB,EACxBC,QAAkB,EAGXC,iBAEPrI,WACIzE,KAAK8M,iBAAmB9M,KAAK0L,KAAKqB,KAAK/M,KAC3C,CAEAgN,WAAWC,GACPjN,KAAK6M,QAAU7M,KAAK6M,OACpBK,MAAMC,iBACND,MAAME,iBACV,CAEAC,aACIrN,KAAK0L,MAAK,GACV1L,KAAK2L,MAAM/F,MACf,CAEAb,OACI/E,KAAKyM,UAAUa,cAAcC,UAAY,EACzCvN,KAAK6M,QAAS,EACd7M,KAAK0M,WAAa1M,KAAKyM,UAAUa,cAAcE,aAC/CxN,KAAK2M,UAAYc,SAASC,gBAAgBC,aACtC3N,KAAKuM,kBAAoBvM,KAAK2M,UAAa3M,KAAK0M,aAChD1M,KAAK4M,cAAe,EAE5B,CAEAlB,KAAKkC,KACI5N,KAAKqM,eAAiBuB,KACvB5N,KAAK6M,QAAS,EAEtB,4CApDS1F,EAAe,+BAAfA,EAAeJ,UAAA,iBAAAC,UAAA,SAAAC,EAAAC,MAAA,EAAAD,qsCDDtBzF,MATN,UASMA,CAT+D,UAS/DA,CAFc,UAEdA,CADyB,oBAEvBA,MAAA,EAAAqM,EAAA,aAYArM,MAAA,gBACEA,MAAA,GACFA,QACAA,MAAA,EAAAsM,EAAA,aAqBRtM,qBA9C+CA,MAAA,OAAA0F,EAAA2F,QAE3CrL,QAIAA,MAJA,uBAAA0F,EAAAsF,sBAIAhL,CAJoD,qBAAA0F,EAAAkF,KAIpD5K,CAHmC,sBAAA0F,EAAAkF,KAGnC5K,CAFoC,qBAAA0F,EAAAkF,KAEpC5K,CADmC,sBAAA0F,EAAAkF,MAInB5K,MAAA,GAAAA,MAAA,YAAA0F,EAAApD,WACZtC,cAAA0F,EAAA4E,WAAA,MAYiFtK,cAAA,aAAA0F,EAAA+E,aAAnCzK,MAA9B,aAAA0F,EAAAgF,SAA8B1K,CAAD,cAAA0F,EAAA0F,cAG7CpL,MAAA,GAAAA,MAAA0F,EAAAiF,WAAA,sBCjBM4B,KAAiB/F,cAAA,WAElBb,CAAe,gECLrB,IAAM7C,EAAgB,MAAvB,MAAOA,EAET0J,gBAA0B,yCAC1BA,sBAAgC,+DAChCA,gBAA0B,yEAC1BA,qBAA+B,uBAE/B,gCAAOC,GACH,OAAQC,GACGA,EAAQC,2BAA6BD,EAAQE,QAAU,KAAO,CACjEH,0BAA2B,gDAGvC,CAEA,qBAAOI,CAAeH,GAElB,OAAOrJ,6BAAsCqJ,EAAQxE,MAAO,SAAW,KAAO,CAC1E2E,eAAgB,CACZrJ,OAAO,GAInB,CAEA,6BAAOsJ,CAAuBJ,GAC1B,OAAwB,MAAjBA,EAAQxE,MAAgB,KAAOpF,EAAiB+J,eAAeH,EAC1E,CAEA,iCAAOK,CAA2BL,GAE9B,IAAKrJ,uBAAgCqJ,EAAQxE,OACzC,OAAO7E,6BAAsCqJ,EAAQxE,MAAO,SAAW,KAAO,CAC1E8E,eAAgB,CACZxJ,OAAO,GAIvB,CACA,qBAAOwJ,CAAeN,GAElB,OAAOrJ,6BAAsCqJ,EAAQxE,MAAO,SAAW,KAAO,CAC1E8E,eAAgB,CACZxJ,OAAO,GAInB,CAEA,0BAAOyJ,CAAoBP,GACvB,OAAKQ,MAAMC,QAAQT,GAASxE,QACpBwE,GAASxE,OAAOkF,OAAS,GAA+B,IAA1BV,GAASxE,OAAOmF,OACvC,CAAEJ,oBAAqB,CAAEzJ,OAAO,IAGxC,IACX,CAEA,+BAAO8J,CAAyBZ,GAE5B,IAAKrJ,uBAAgCqJ,EAAQxE,OACzC,OAAO7E,6BAAsCqJ,EAAQxE,MAAO,OAAS,KAAO,CACxEqF,aAAc,CACV/J,OAAO,GAIvB,CAEA,mBAAO+J,CAAab,GAEhB,OAAOrJ,6BAAsCqJ,EAAQxE,MAAO,OAAS,KAAO,CACxEqF,aAAc,CACV/J,OAAO,GAInB,CAEA,qBAAOgK,CAAeA,GAClB,OAAQd,GAOKc,EAAeC,KAHRf,EAAQxE,OAGU,IAK1B,KAJJ,CACIsF,eAAgB,CACZhK,OAAO,GAS3B,CAEA,0BAAOkK,CAAoBF,GACvB,OAAQd,GACGrJ,uBAAgCqJ,EAAQxE,QAAUsF,EAAeC,KAAKf,EAAQxE,OACjF,KACE,CACEwF,oBAAqB,CACjBlK,OAAO,GAI3B,CAEA,qBAAOmK,CAAeC,EAAeC,GACjC,OAAQnB,IACJ,IAAIoB,EAAYpB,EAAQxE,MACxB,MAAgB,iBAAL4F,IACPA,EAAIzK,gBAAyByK,IAEnB,MAALA,GAAsB,MAATF,GAAiBE,EAAIF,GAAgB,MAALE,GAAsB,MAATD,GAAiBC,EAAID,EACpF,CAAEF,eAAgB,CAAEnK,OAAO,IACzB,KAEd,CAEA,yBAAOuK,CAAmBC,GACtB,OAAQtB,GACAsB,EACyD,IAAlDA,EAAOC,OAAOC,GAAKA,GAAKxB,EAAQxE,OAAOkF,OAAe,KAAO,CAAEW,mBAAoB,CAAEvK,OAAO,IAGhG,IAEf,CAEA,wBAAO2K,CAAkBP,GACrB,OAAQlB,IACJ,IAAIoB,EAAYpB,EAAQxE,MACxB,MAAgB,iBAAL4F,IACPA,EAAIzK,gBAAyByK,IAEnB,MAALA,GAAsB,MAATF,GAAiBE,EAAIF,EACvC,CAAEO,kBAAmB,CAAE3K,OAAO,IAC5B,KAEd,CAEA,wBAAO4K,CAAkBP,GACrB,OAAQnB,IACJ,IAAIoB,EAAYpB,EAAQxE,MACxB,MAAgB,iBAAL4F,IACPA,EAAIzK,gBAAyByK,IAEnB,MAALA,GAAsB,MAATD,GAAiBC,EAAID,EACvC,CAAEO,kBAAmB,CAAE5K,OAAO,IAC5B,KAEd,CAEA,oBAAO6K,CAAc3B,GAEjB,OADcA,EAAQxE,OAAQoG,EAAO5B,EAAQxE,MAAO,YAAY,GAAMqG,UACrD,KAAO,CACpBF,cAAe,CACX7K,OAAO,GAGnB,CAEA,wBAAOmB,CAAkB+H,GACrB,OAAsB,OAAlBA,EAAQxE,MACD,MAAMuF,KAAKf,EAAQxE,OAAS,KAAO,CACtCvD,kBAAmB,CACfnB,OAAO,IAIZ,IACX,CAEA,yBAAOqB,CAAmB6H,GACtB,OAAsB,OAAlBA,EAAQxE,MACD,MAAMuF,KAAKf,EAAQxE,OAAS,KAAO,CACtCrD,mBAAoB,CAChBrB,OAAO,IAIZ,IACX,CAEA,yBAAOuB,CAAmB2H,GACtB,OAAsB,OAAlBA,EAAQxE,MACDwE,EAAQxE,OAASwE,EAAQxE,MAAMsG,eAAiB9B,EAAQxE,OAASwE,EAAQxE,MAAMuG,cAAgB,KAAO,CACzG1J,mBAAoB,CAChBvB,OAAO,IAIZ,IACX,CAEA,oBAAOkL,CAAchC,GACjB,GAAIA,EACA,MAAO,CACHgC,cAAe,CACXlL,OAAO,GAIvB,CAEA,mCAAOmL,CAA6BC,EAAgCC,GAChE,IAAI9K,GAAY,EAChB,OAAQ2I,IACJ,GAAsB,OAAlBkC,EAAwB,CACxB,IAAIE,EACJ,MAAiB,QAAbD,EACAC,EAASF,EAAc1G,MAAQwE,EAAQxE,MAAQ,KAAO,CAClDyG,8BAA8B,GAGhB,QAAbE,IACLC,EAASF,EAAc1G,MAAQwE,EAAQxE,MAAQ,KAAO,CAClDyG,8BAA8B,IAGjC5K,EAKDA,GAAY,GAJZA,GAAY,EACZ6K,EAAcG,0BAKXD,CACX,CACA,OAAO,KAEf,CAEA,uBAAO5J,CAAiB8J,GAEpB,OAAQtC,GAQGsC,EAAa9G,QAAUwE,EAAQxE,MAAQ,KAAO,CAAEhD,kBAAkB,EAEjF,CAEA,8BAAO+J,CAAwBC,EAA8BC,GACzD,IAAIZ,GAAmB,EACvB,OAAQ7B,IACJ,OAAQyC,GACJ,IAAK,UACDZ,EAAUD,EAAO5B,EAAQxE,OAAOkH,QAAQd,EAAOY,EAAYhH,QAC3D,MACJ,IAAK,gBACDqG,EAAUD,EAAO5B,EAAQxE,OAAOmH,cAAcf,EAAOY,EAAYhH,QACjE,MACJ,IAAK,WACDqG,EAAUD,EAAO5B,EAAQxE,OAAOoH,SAAShB,EAAOY,EAAYhH,QAC5D,MACJ,IAAK,iBACDqG,EAAUD,EAAO5B,EAAQxE,OAAOqH,eAAejB,EAAOY,EAAYhH,QAK1E,OAAOqG,EAAU,KAAO,CAAEU,yBAAyB,EAAI,CAE/D,CAEA,iBAAOO,CAAWC,EAAmCrG,EAAkB,sBACnE,OAAQsD,IAEJ,MAAMgD,EAAepB,EAAO5B,EAAQxE,OAC9ByH,EAAoBrB,EAAOmB,EAAiBvH,OAElD,OAAIwH,EAAanB,WAAaoB,EAAkBpB,WACxCmB,EAAaN,QAAQO,GACd,CACHC,KAAMxG,GAKX,KAEf,CAEA,gBAAOyG,CAAUJ,EAAmCrG,EAAkB,sBAClE,OAAQsD,IAEJ,MAAMgD,EAAepB,EAAO5B,EAAQxE,OAC9ByH,EAAoBrB,EAAOmB,EAAiBvH,OAElD,OAAIwH,EAAanB,WAAaoB,EAAkBpB,WACxCmB,EAAaJ,SAASK,GACf,CACHC,KAAMxG,GAKX,KAEf,CAEA,qBAAO0G,CAAeC,EAAqB3G,EAAkB,MACzD,IAAI4G,EAAuB,wBAAwBD,IAEnD,OAAI3G,IACA4G,EAAe5G,GAGXsD,IACJ,MAAMgD,EAAepB,EAAO5B,EAAQxE,OAC9B+H,EAAiB3B,EAAOyB,GAE9B,OAAIL,EAAanB,WACb0B,EAAe1B,WACfmB,EAAaN,QAAQa,GACd,CACHH,eAAgBE,GAIjB,KAEf,CAEA,oBAAOE,CAAcH,EAAqB3G,EAAkB,MACxD,IAAI4G,EAAuB,yBAAyBD,IAEpD,OAAI3G,IACA4G,EAAe5G,GAGXsD,IACJ,MAAMgD,EAAepB,EAAO5B,EAAQxE,OAC9B+H,EAAiB3B,EAAOyB,GAE9B,OAAIL,EAAanB,WACb0B,EAAe1B,WACfmB,EAAaJ,SAASW,GACf,CACHC,cAAeF,GAIhB,KAEf,CAEA,yBAAOG,CAAmBC,EAAkBC,GACxC,OAAQ3D,IACJ,MACM4D,EADY5D,EACMzH,SAASmL,GAAUlI,MACrCqI,EAFY7D,EAEIzH,SAASoL,GAAQnI,MAEvC,IAAKoI,IAAUC,EACX,OAAO,KAGX,MAAMC,EAAYlC,EAAOgC,GACnBG,EAAUnC,EAAOiC,GAEvB,OAAIE,EAAQnB,SAASkB,GACV,CAAEE,kBAAoB,GAG7BD,EAAQE,OAAOH,GACR,CAAEI,yBAA2B,GAGjC,KAEf,SA7XS9N,CAAgB","names":["ExternalForgotPasswordService","ClientPortalBaseService","externalSendForgotPasswordCode","forgotPasswordSendCodeModel","this","post","clientPortalAPI","JSON","stringify","externalValidateUser","forgotPasswordUserValidation","externalSaveForgotPasswordChange","forgotPasswordChangeModel","__ngFactoryType__","factory","ɵfac","ExternalForgotPasswordSendCodeModel","FinancialInstitution","UserName","FingerPrint","ExternalForgotPasswordUserInfoModel","Id","Message","ExternalForgotPasswordUserValidationModel","ValidationCode","ExternalForgotPasswordChangeModel","NewPassword","ConfirmPassword","i0","ctx_r1","form","controlList","userNameControl","forgotPasswordUserInfoModel","verificationCodeControl","newPasswordControl","confirmPasswordControl","_r1","onSubmit","ExternalForgotPasswordComponent_Conditional_1_Conditional_2_Template","ExternalForgotPasswordComponent_Conditional_1_Conditional_3_Template","ExternalForgotPasswordComponent_Conditional_1_Conditional_4_Template","showUserName","showValidation","showChangePassword","_r3","onSendCode","isDisabled","_r4","onValidateUser","_r5","onChangePasswordSave","ExternalForgotPasswordComponent","ComponentBase","formBuilder","route","router","externalForgotPasswordService","deviceFingerprint","modalDlg","browserFingerprint","username","forgotPasswordComplete","EventEmitter","isReady","forgotPasswordValidationModel","isLoading","key","label","data","type","maxLength","validators","Validators","CustomValidators","constructor","super","ngOnInit","snapshot","params","financialinstitution","AppFunctions","group","show","valid","_this","_asyncToGenerator","Object","assign","getRawValue","addSubscription","subscribe","fpUserInfo","error","passwordComplexity","setControlValidators","emit","onModalClose","PasswordMinimumLength","validationMessages","minlength","PasswordRequiresNumber","push","hasDigitValidator","PasswordRequiresSymbol","hasSymbolValidator","PasswordRequiresMixedCase","mixedCaseValidator","concat","controls","equalToValidator","i1","i2","i3","i4","selectors","viewQuery","rf","ctx","ModalRComponent","DeviceFingerprintService","decls","vars","consts","template","ExternalForgotPasswordComponent_Conditional_1_Template","ExternalForgotPasswordComponent_Conditional_2_Template","ExternalForgotPasswordComponent_Conditional_3_Template","ExternalForgotPasswordComponent_Conditional_4_Template","FormsModule","ReactiveFormsModule","InputRComponent","encapsulation","ctx_r0","userMessage","_r2","onForgotClick","onForgotPasswordComplete","LoginState","ReadyForLogin","Authenticating","LoginComponent","loginService","model","LoginModel","showForgotPasswordLink","loginState","showForgotPasswordModal","returnUrl","passwordChangeErrorMessage","isLoginButtonEnabled","releaseVersionDescription","localStorage","getItem","ClientPortalAppSettings","loginButtonText","buttonText","usernameControl","value","passwordControl","logout","financialInstitution","setItem","generateBrowserFingerprint","queryParams","decodeURIComponent","loginDetails","getAuthenticationSettings","toPromise","IsForgotPasswordEnabled","_this2","fingerprint","userName","login","next","navigateByUrl","message","standalone","features","LoginComponent_Conditional_7_Template","LoginComponent_Conditional_9_Template","LoginComponent_Conditional_13_Template","routes","path","redirectTo","pathMatch","component","LoginModule","RouterModule","ClientPortalCoreModule","hide","close","closeBtnTitle","ModalRComponent_Conditional_4_Conditional_3_Template","modalTitle","showCloseOptions","ModalRComponent_Conditional_8_Conditional_6_Template","modalHeight","showBody","showFooter","size","isMultiSelect","onCloseHandler","enableAutoHeight","containsLargeDropdown","modalBody","viewHeight","docHeight","isAutoHeight","isOpen","theCloseCallback","bind","toggleOpen","$event","event","preventDefault","stopPropagation","closeModal","nativeElement","scrollTop","offsetHeight","document","documentElement","clientHeight","forceClose","ModalRComponent_Conditional_4_Template","ModalRComponent_Conditional_8_Template","LoadingRComponent","static","sectionPrefilledValidator","control","sectionIsPreFillConfirmed","touched","emailValidator","nullableEmailValidator","phoneValidatorWithRequired","phoneValidator","blankSpaceValidator","Array","isArray","length","trim","urlValidatorWithRequired","urlValidator","regExValidator","test","httpsRegExValidator","rangeValidator","lower","upper","v","duplicateValidator","values","filter","x","minValueValidator","maxValueValidator","dateValidator","moment","isValid","toLowerCase","toUpperCase","failValidator","minMaxNumberCompareValidator","numberControl","minOrMax","result","updateValueAndValidity","equalControl","dateComparisonValidator","compareWith","comparisonType","isAfter","isSameOrAfter","isBefore","isSameOrBefore","beforeDate","otherDateControl","controlValue","otherControlValue","date","afterDate","dateBeforeOrOn","dateToCompare","errorMessage","compareToValue","dateOnOrAfter","dateRangeValidator","startKey","endKey","start","end","startDate","endDate","invalidDateRange","isSame","sameStartDateAndEndDate"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/client-portal/forgot-password/external-forgot-password.api.service.ts","./src/app/client-portal/forgot-password/external-forgot-password.component.html","./src/app/client-portal/forgot-password/external-forgot-password.component.ts","./src/app/client-portal/login.component.html","./src/app/client-portal/login.component.ts","./src/app/client-portal/login.module.ts","./src/app/shared/controls/reactive/bh-r-modal.component.html","./src/app/shared/controls/reactive/bh-r-modal.component.ts","./src/app/shared/controls/validators/custom.validator.ts"],"sourcesContent":["import { Injectable } from \"@angular/core\";\r\nimport { Observable } from \"rxjs\";\r\nimport { PasswordComplexityDto } from '@shared/common/admin/users/password-complexity.model';\r\nimport { ClientPortalBaseService } from \"../client-portal-base.service\";\r\n\r\n@Injectable()\r\nexport class ExternalForgotPasswordService extends ClientPortalBaseService {\r\n \r\n externalSendForgotPasswordCode(forgotPasswordSendCodeModel: ExternalForgotPasswordSendCodeModel): Observable {\r\n let apiUrl: string = this.clientPortalAPI + 'User/ExternalSendForgotPasswordCode';\r\n return this.post(apiUrl, JSON.stringify(forgotPasswordSendCodeModel));\r\n }\r\n\r\n externalValidateUser(forgotPasswordUserValidation: ExternalForgotPasswordUserValidationModel): Observable {\r\n let apiUrl: string = this.clientPortalAPI + 'User/ExternalValidateForgotPasswordCode';\r\n return this.post(apiUrl, JSON.stringify(forgotPasswordUserValidation));\r\n }\r\n\r\n public externalSaveForgotPasswordChange(forgotPasswordChangeModel: ExternalForgotPasswordChangeModel): Observable {\r\n let apiUrl: string = this.clientPortalAPI + `User/ExternalSaveForgotPasswordChange`\r\n return this.post(apiUrl, JSON.stringify(forgotPasswordChangeModel));\r\n }\r\n}\r\n\r\nexport class ExternalForgotPasswordSendCodeModel {\r\n FinancialInstitution: string = null;\r\n UserName: string = null;\r\n FingerPrint: string = null;\r\n}\r\nexport class ExternalForgotPasswordUserInfoModel {\r\n Id: string = null;\r\n Message: string = null\r\n}\r\n\r\nexport class ExternalForgotPasswordUserValidationModel {\r\n FinancialInstitution: string = null;\r\n Id: string = null;\r\n ValidationCode: string = null;\r\n}\r\nexport class ExternalForgotPasswordChangeModel {\r\n Id: string = null;\r\n FinancialInstitution: string = null;\r\n NewPassword: string = null;\r\n ConfirmPassword: string = null;\r\n}\r\n","\r\n @if (isReady) {\r\n
\r\n
\r\n @if (showUserName) {\r\n
\r\n \r\n
\r\n }\r\n @if (showValidation) {\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n }\r\n @if (showChangePassword) {\r\n
\r\n \r\n \r\n
\r\n }\r\n
\r\n
\r\n }\r\n @if (showUserName) {\r\n \r\n }\r\n @if (showValidation) {\r\n \r\n }\r\n @if (showChangePassword) {\r\n \r\n }\r\n
\r\n\r\n","import { Component, EventEmitter, Input, OnInit, ViewChild, Output } from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { FormBuilder, FormGroup, Validators, FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { ExternalForgotPasswordService, ExternalForgotPasswordSendCodeModel, ExternalForgotPasswordUserInfoModel, ExternalForgotPasswordUserValidationModel,ExternalForgotPasswordChangeModel} from '@client-portal/forgot-password/external-forgot-password.api.service';\r\nimport { ModalRComponent } from \"@shared/controls/reactive/bh-r-modal.component\";\r\nimport { ComponentBase } from \"@shared/components/component-base\";\r\nimport { BhControl } from \"@shared/controls/helpers/bh-control.class\";\r\nimport { CustomValidators } from \"@shared/controls/validators/custom.validator\";\r\nimport { DeviceFingerprintService } from \"../../device-fingerprint.service\";\r\nimport { PasswordComplexityDto } from '@shared/common/admin/users/password-complexity.model';\r\nimport { InputRComponent } from \"../../shared/controls/reactive/bh-r-input.component\";\r\nimport { AppFunctions } from 'shared/app.functions';\r\n\r\n\r\n@Component({\r\n selector: 'external-forgot-password',\r\n templateUrl: 'external-forgot-password.component.html',\r\n providers: [ExternalForgotPasswordService, DeviceFingerprintService],\r\n standalone: true,\r\n imports: [ModalRComponent, FormsModule, ReactiveFormsModule, InputRComponent]\r\n})\r\nexport class ExternalForgotPasswordComponent extends ComponentBase implements OnInit {\r\n @ViewChild(ModalRComponent, { static: true }) private modalDlg: ModalRComponent;\r\n @Input() browserFingerprint: string = '';\r\n @Input() username: string = null;\r\n @Output() forgotPasswordComplete: EventEmitter = new EventEmitter();\r\n form: FormGroup;\r\n isReady: boolean = false;\r\n private forgotPasswordSendCodeModel: ExternalForgotPasswordSendCodeModel = new ExternalForgotPasswordSendCodeModel();\r\n forgotPasswordUserInfoModel: ExternalForgotPasswordUserInfoModel = new ExternalForgotPasswordUserInfoModel();\r\n private forgotPasswordChangeModel: ExternalForgotPasswordChangeModel = new ExternalForgotPasswordChangeModel();\r\n private forgotPasswordValidationModel: ExternalForgotPasswordUserValidationModel = new ExternalForgotPasswordUserValidationModel();\r\n\r\n showUserName: boolean = true;\r\n private isLoading: boolean = false;\r\n showValidation: boolean = false;\r\n showChangePassword: boolean = false;\r\n\r\n controlList = {\r\n userNameControl: {\r\n key: 'UserName',\r\n label: 'UserName',\r\n data: { type: 'email', maxLength: 100 },\r\n validators: [Validators.required, CustomValidators.emailValidator]\r\n },\r\n verificationCodeControl: {\r\n key: 'ValidationCode',\r\n label: 'Code',\r\n data: { maxLength: 6 },\r\n validators: [Validators.required]\r\n },\r\n newPasswordControl: {\r\n key: 'NewPassword',\r\n label: 'New Password',\r\n data: { type: 'password', maxLength: 50 },\r\n validators: [Validators.required]\r\n },\r\n confirmPasswordControl: {\r\n key: 'ConfirmPassword',\r\n label: 'Confirm Password',\r\n data: { type: 'password', maxLength: 50 },\r\n validators: [Validators.required]\r\n }\r\n };\r\n constructor(\r\n private formBuilder: FormBuilder,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private externalForgotPasswordService: ExternalForgotPasswordService,\r\n private deviceFingerprint: DeviceFingerprintService\r\n ) {\r\n super()\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.forgotPasswordSendCodeModel.FinancialInstitution = this.route.snapshot.params['financialinstitution'];\r\n if (!AppFunctions.IsNullOrWhiteSpace(this.username)) {\r\n this.forgotPasswordSendCodeModel.UserName = this.username;\r\n }\r\n this.form = this.formBuilder.group(this.forgotPasswordSendCodeModel);\r\n if (!this.forgotPasswordSendCodeModel.FinancialInstitution || this.forgotPasswordSendCodeModel.FinancialInstitution == 'unknown') {\r\n this.forgotPasswordUserInfoModel.Message = 'Unable to proceed. Check the provided URL and try again.';\r\n return;\r\n }\r\n this.isReady = true;\r\n this.modalDlg.show();\r\n }\r\n get isDisabled() {\r\n return !this.form.valid || this.isLoading;\r\n }\r\n\r\n async onSendCode() {\r\n this.isLoading = true;\r\n\r\n Object.assign(this.forgotPasswordSendCodeModel, this.form.getRawValue() as ExternalForgotPasswordSendCodeModel)\r\n this.forgotPasswordSendCodeModel.FingerPrint = this.browserFingerprint;\r\n\r\n this.addSubscription =\r\n this.externalForgotPasswordService.externalSendForgotPasswordCode(this.forgotPasswordSendCodeModel)\r\n .subscribe(\r\n (fpUserInfo: ExternalForgotPasswordUserInfoModel) => {\r\n this.isReady = false;\r\n this.showUserName = false;\r\n Object.assign(this.forgotPasswordUserInfoModel, fpUserInfo);\r\n this.forgotPasswordValidationModel.Id = this.forgotPasswordChangeModel.Id = fpUserInfo.Id;\r\n this.form = this.formBuilder.group(this.forgotPasswordValidationModel);\r\n this.showValidation = true;\r\n this.isReady = true;\r\n this.isLoading = false;\r\n },\r\n error => {\r\n this.isLoading = false;\r\n });\r\n }\r\n\r\n\r\n public onValidateUser(): void {\r\n this.isLoading = true;\r\n Object.assign(this.forgotPasswordValidationModel, this.form.getRawValue() as ExternalForgotPasswordUserValidationModel);\r\n this.forgotPasswordValidationModel.FinancialInstitution = this.forgotPasswordSendCodeModel.FinancialInstitution;\r\n this.addSubscription =\r\n this.externalForgotPasswordService.externalValidateUser(this.forgotPasswordValidationModel)\r\n .subscribe(\r\n (passwordComplexity: PasswordComplexityDto) => {\r\n this.isReady = false;\r\n this.showValidation = false;\r\n this.form = this.formBuilder.group(this.forgotPasswordChangeModel);\r\n this.setControlValidators(passwordComplexity);\r\n this.showChangePassword = true;\r\n this.isReady = true;\r\n this.isLoading = false;\r\n },\r\n error => {\r\n this.isLoading = false;\r\n if (error.error && error.error.error === 'An unexpected error occured. Please refresh the screen and try again. If this issue persists, please contact a system administrator for help.') {\r\n this.forgotPasswordComplete.emit();\r\n }\r\n });\r\n }\r\n\r\n\r\n public onChangePasswordSave(): void {\r\n this.isLoading = true;\r\n Object.assign(this.forgotPasswordChangeModel, this.form.getRawValue() as ExternalForgotPasswordChangeModel)\r\n this.forgotPasswordChangeModel.FinancialInstitution = this.forgotPasswordValidationModel.FinancialInstitution;\r\n this.addSubscription =\r\n this.externalForgotPasswordService.externalSaveForgotPasswordChange(this.forgotPasswordChangeModel)\r\n .subscribe(\r\n () => {\r\n this.isLoading = false;\r\n this.forgotPasswordComplete.emit();\r\n },\r\n error => {\r\n this.isLoading = false;\r\n if (error.error && error.error.error === 'An unexpected error occured. Please refresh the screen and try again. If this issue persists, please contact a system administrator for help.') {\r\n this.forgotPasswordComplete.emit();\r\n }\r\n });\r\n }\r\n\r\n public onModalClose(): void {\r\n this.forgotPasswordComplete.emit();\r\n }\r\n\r\n private setControlValidators(passwordComplexity: PasswordComplexityDto): void {\r\n let validators = [Validators.minLength(passwordComplexity.PasswordMinimumLength)];\r\n let validationMessages = {\r\n minlength: `The password must be at least ${passwordComplexity.PasswordMinimumLength} characters long.`\r\n };\r\n\r\n if (passwordComplexity.PasswordRequiresNumber) {\r\n validators.push(CustomValidators.hasDigitValidator);\r\n validationMessages['hasDigitValidator'] = 'The password must contain a number.';\r\n }\r\n\r\n if (passwordComplexity.PasswordRequiresSymbol) {\r\n validators.push(CustomValidators.hasSymbolValidator);\r\n validationMessages['hasSymbolValidator'] = 'The password must contain a symbol.';\r\n }\r\n\r\n if (passwordComplexity.PasswordRequiresMixedCase) {\r\n validators.push(CustomValidators.mixedCaseValidator);\r\n validationMessages['mixedCaseValidator'] = 'The password must be mixed case.';\r\n }\r\n\r\n this.controlList.newPasswordControl.validators = this.controlList.newPasswordControl.validators.concat(validators);\r\n this.controlList.newPasswordControl.validationMessages = validationMessages;\r\n\r\n let passwordControl = this.form.controls[this.controlList.newPasswordControl.key];\r\n\r\n this.controlList.confirmPasswordControl.validators = this.controlList.confirmPasswordControl.validators.concat(CustomValidators.equalToValidator(passwordControl));\r\n this.controlList.confirmPasswordControl.validationMessages = {\r\n equalToValidator: 'Password and Confirm Password do not match.'\r\n };\r\n }\r\n\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n \r\n \r\n\r\n
\r\n @if (userMessage) {\r\n
{{userMessage}}
\r\n
\r\n }\r\n \r\n
\r\n @if (showForgotPasswordLink) {\r\n
\r\n \r\n
\r\n }\r\n
\r\n
\r\n
\r\n {{releaseVersionDescription}}\r\n
\r\n
\r\n@if (showForgotPasswordModal) {\r\n \r\n}","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { FormBuilder, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { LoginModel, LoginService } from './login.service';\r\nimport { BhControl } from '@shared/controls/helpers/bh-control.class';\r\nimport { DeviceFingerprintService } from '../device-fingerprint.service';\r\nimport { ClientPortalAppSettings } from \"./app.globals\";\r\nimport { ExternalForgotPasswordComponent } from './forgot-password/external-forgot-password.component';\r\n\r\nimport { InputRComponent } from 'shared/controls/reactive/bh-r-input.component';\r\n\r\nexport enum LoginState {\r\n ReadyForLogin,\r\n Authenticating\r\n}\r\n\r\n@Component({\r\n templateUrl: 'login.component.html',\r\n providers: [DeviceFingerprintService],\r\n standalone: true,\r\n imports: [FormsModule, ReactiveFormsModule, InputRComponent, ExternalForgotPasswordComponent]\r\n})\r\nexport class LoginComponent implements OnInit {\r\n private model: LoginModel = new LoginModel();\r\n showForgotPasswordLink = false;\r\n form: FormGroup = null;\r\n userMessage: string = null;\r\n private loginState: LoginState = LoginState.ReadyForLogin;\r\n showForgotPasswordModal: boolean = false;\r\n browserFingerprint: string = null;\r\n private returnUrl: string = null;\r\n username: string = null;\r\n readonly passwordChangeErrorMessage = \"Please change your password.\";\r\n\r\n get isLoginButtonEnabled(): boolean {\r\n return this.loginState == LoginState.ReadyForLogin;\r\n }\r\n\r\n get releaseVersionDescription(): string {\r\n return localStorage.getItem(ClientPortalAppSettings.storageKeyUiVersion);\r\n };\r\n\r\n get loginButtonText(): string {\r\n let buttonText = '';\r\n let spinner = '';\r\n\r\n if (this.loginState === LoginState.ReadyForLogin) {\r\n buttonText = 'LOGIN';\r\n } else if (this.loginState === LoginState.Authenticating) {\r\n buttonText = spinner + 'Authenticating';\r\n }\r\n\r\n return buttonText;\r\n }\r\n\r\n controlList = {\r\n usernameControl: {\r\n key: 'userName',\r\n label: 'User Name',\r\n data: { value: '' }\r\n },\r\n passwordControl: {\r\n key: 'password',\r\n label: 'Password',\r\n data: {\r\n value: '',\r\n type: 'password'\r\n }\r\n },\r\n }\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private formBuilder: FormBuilder,\r\n private loginService: LoginService,\r\n private deviceFingerprint: DeviceFingerprintService) {\r\n\r\n }\r\n\r\n async ngOnInit(): Promise {\r\n // logout someone if they were logged in.\r\n this.loginService.logout();\r\n\r\n this.showForgotPasswordLink = false;\r\n this.model.financialInstitution = this.route.snapshot.params['financialinstitution'];\r\n localStorage.setItem(ClientPortalAppSettings.storageKeyFiName, `${this.model.financialInstitution}`);\r\n this.form = this.formBuilder.group(this.model);\r\n\r\n this.browserFingerprint = await this.deviceFingerprint.generateBrowserFingerprint();\r\n\r\n if (!this.model.financialInstitution || this.model.financialInstitution === 'unknown') {\r\n this.userMessage = 'Unable to proceed. Check the provided URL and try again.';\r\n return;\r\n }\r\n if (this.model.financialInstitution === 'logout') {\r\n this.userMessage = 'The current user has logged out, please close the browser.';\r\n return;\r\n }\r\n this.returnUrl = '/clientportal/auth';\r\n this.route.queryParams\r\n .subscribe(params => {\r\n if (params['returnUrl']) {\r\n this.returnUrl = decodeURIComponent(params['returnUrl']);\r\n }\r\n\r\n });\r\n const loginDetails = await this.loginService.getAuthenticationSettings(this.model.financialInstitution).toPromise();\r\n this.showForgotPasswordLink = loginDetails.IsForgotPasswordEnabled;\r\n }\r\n\r\n async onSubmit() {\r\n this.loginState = LoginState.Authenticating;\r\n Object.assign(this.model, this.form.getRawValue());\r\n this.model.fingerprint = this.browserFingerprint;\r\n\r\n // Adding solely for the MFA screen to be able to obtain the user's email address\r\n localStorage.setItem(ClientPortalAppSettings.storageKeyEmail, this.model.userName);\r\n\r\n this.loginService.login(this.model).subscribe({\r\n next: () => {\r\n this.userMessage = null;\r\n this.router.navigateByUrl(this.returnUrl);\r\n this.loginState = LoginState.ReadyForLogin;\r\n },\r\n error: error => {\r\n let message = 'An error occurred while logging in. Please try again.';\r\n if (error.error && error.error.error) {\r\n message = error.error.error;\r\n if(message === this.passwordChangeErrorMessage) {\r\n this.username = this.model.userName;\r\n this.showForgotPasswordModal = true;\r\n }\r\n }\r\n this.userMessage = message;\r\n this.loginState = LoginState.ReadyForLogin;\r\n }\r\n });\r\n }\r\n\r\n onForgotClick() {\r\n this.showForgotPasswordModal = true;\r\n }\r\n\r\n onForgotPasswordComplete() {\r\n this.username = null;\r\n this.showForgotPasswordModal = false;\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { LoginComponent } from './login.component';\r\nimport { ClientPortalCoreModule } from './client-portal-core.module';\r\nimport { ExternalForgotPasswordComponent } from '@client-portal/forgot-password/external-forgot-password.component';\r\nconst routes: Routes = [\r\n { path: '', redirectTo: 'unknown', pathMatch: 'full' },\r\n { path: ':financialinstitution', component: LoginComponent },\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n RouterModule.forChild(routes),\r\n ClientPortalCoreModule,\r\n LoginComponent,\r\n ExternalForgotPasswordComponent,\r\n ],\r\n exports: [],\r\n providers: []\r\n})\r\nexport class LoginModule { }\r\n","
\r\n
\r\n
\r\n \r\n @if (modalTitle) {\r\n
\r\n
{{modalTitle}}
\r\n @if (showCloseOptions) {\r\n \r\n }\r\n
\r\n }\r\n
\r\n \r\n
\r\n @if (showFooter) {\r\n \r\n }\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, Input, Output, EventEmitter, OnInit, ViewChild } from '@angular/core';\r\n\r\nimport { LoadingRComponent } from './bh-r-loading.component';\r\n\r\n@Component({\r\n selector: 'bh-r-modal',\r\n templateUrl: 'bh-r-modal.component.html',\r\n standalone: true,\r\n imports: [LoadingRComponent]\r\n})\r\nexport class ModalRComponent implements OnInit {\r\n @Input() modalTitle: string = '';\r\n @Input() modalHeight: string = '';\r\n @Input() closeBtnTitle: string = 'Close';\r\n @Input() showBody: boolean = true;\r\n @Input() showFooter: boolean = true;\r\n @Input() size: 'small' | 'large' | 'xlarge' | 'medium' | '' = '';\r\n @Input() isMultiSelect: boolean = false;\r\n @Input() onCloseHandler: Function = () => { };\r\n @Input() isLoading: boolean = false;\r\n @Input() showCloseOptions: boolean = true;\r\n @Input() enableAutoHeight: boolean = true;\r\n @Input() containsLargeDropdown: boolean = false;\r\n @Output() close: EventEmitter = new EventEmitter();\r\n @ViewChild('modalBody', { static: true }) private modalBody;\r\n private viewHeight: number;\r\n private docHeight: number;\r\n isAutoHeight: boolean = false;\r\n isOpen: boolean = false;\r\n\r\n // extra steps to scope correctly, otherwise the callback won't have a 'this'\r\n public theCloseCallback: Function;\r\n\r\n ngOnInit() {\r\n this.theCloseCallback = this.hide.bind(this);\r\n }\r\n\r\n toggleOpen($event: MouseEvent) {\r\n this.isOpen = !this.isOpen;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n closeModal() {\r\n this.hide(true);\r\n this.close.emit();\r\n }\r\n\r\n show() {\r\n this.modalBody.nativeElement.scrollTop = 0;\r\n this.isOpen = true;\r\n this.viewHeight = this.modalBody.nativeElement.offsetHeight;\r\n this.docHeight = document.documentElement.clientHeight;\r\n if (this.enableAutoHeight && this.docHeight > (this.viewHeight)) {\r\n this.isAutoHeight = true;\r\n }\r\n }\r\n\r\n hide(forceClose?: boolean) {\r\n if (!this.isMultiSelect || forceClose) {\r\n this.isOpen = false;\r\n }\r\n }\r\n}\r\n","import {FormControl, AbstractControl, ValidatorFn, ValidationErrors, FormGroup} from '@angular/forms';\r\nimport { AppFunctions } from '../../app.functions';\r\nimport * as moment from 'moment';\r\nimport { SectionFormGroup } from '../../applications/section-form-group.class';\r\n\r\nexport class CustomValidators {\r\n\r\n static regexSsn: RegExp = /(^$)|(^\\d{9}$)|(^\\d{3}\\-\\d{2}\\-\\d{4}$)/;\r\n static regexSsnOrMask: RegExp = /(^$)|(^\\d{9}$)|(^\\d{3}\\-\\d{2}\\-\\d{4}$)|(^X{3}\\-X{2}\\-\\d{4}$)/;\r\n static regexTin: RegExp = /^(\\d{2}-\\d{7})?$|((?!000|9\\d{2})\\d{3}-(?!00)\\d{2}-(?!0{4})\\d{4})$|null/;\r\n static regexCurrency: RegExp = /(^[0-9]\\d*(\\.\\d+)?$)/;\r\n\r\n static sectionPrefilledValidator(): ValidatorFn | null {\r\n return (control: SectionFormGroup): { [key: string]: any } => {\r\n return control.sectionIsPreFillConfirmed || control.touched ? null : {\r\n sectionPrefilledValidator: \"Confirm the information in prefilled section.\"\r\n };\r\n };\r\n }\r\n\r\n static emailValidator(control: FormControl) {\r\n\r\n return AppFunctions.regularExpressionMatched(control.value, 'email') ? null : {\r\n emailValidator: {\r\n valid: false\r\n }\r\n };\r\n\r\n }\r\n\r\n static nullableEmailValidator(control: FormControl) {\r\n return control.value == null ? null : CustomValidators.emailValidator(control);\r\n }\r\n\r\n static phoneValidatorWithRequired(control: FormControl) {\r\n\r\n if (!AppFunctions.IsNullOrWhiteSpace(control.value)) {\r\n return AppFunctions.regularExpressionMatched(control.value, 'phone') ? null : {\r\n phoneValidator: {\r\n valid: false\r\n }\r\n };\r\n }\r\n }\r\n static phoneValidator(control: FormControl) {\r\n\r\n return AppFunctions.regularExpressionMatched(control.value, 'phone') ? null : {\r\n phoneValidator: {\r\n valid: false\r\n }\r\n };\r\n\r\n }\r\n\r\n static blankSpaceValidator(control: FormControl) {\r\n if (!Array.isArray(control?.value)) {\r\n if (control?.value?.length > 0 && control?.value?.trim() == '') {\r\n return { blankSpaceValidator: { valid: false } }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n static urlValidatorWithRequired(control: FormControl) {\r\n\r\n if (!AppFunctions.IsNullOrWhiteSpace(control.value)) {\r\n return AppFunctions.regularExpressionMatched(control.value, 'url') ? null : {\r\n urlValidator: {\r\n valid: false\r\n }\r\n };\r\n }\r\n }\r\n\r\n static urlValidator(control: FormControl) {\r\n\r\n return AppFunctions.regularExpressionMatched(control.value, 'url') ? null : {\r\n urlValidator: {\r\n valid: false\r\n }\r\n };\r\n\r\n }\r\n\r\n static regExValidator(regExValidator: RegExp): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n // check to see if the this control has a required validator on it\r\n //if (Validators.required(control)) return null;\r\n\r\n var v: string = control.value;\r\n //let REGEXP = new RegExp(regExValidator);\r\n\r\n return !(regExValidator.test(v ?? '')) ?\r\n {\r\n regExValidator: {\r\n valid: false\r\n }\r\n } : null;\r\n\r\n // cool patern, keeping it in comments for reference for later, gdo 9/9/2016\r\n //return v.length < minLength ?\r\n //\t{ 'minlength': { 'requiredLength': minLength, 'actualLength': v.length } } :\r\n //\tnull;\r\n };\r\n }\r\n\r\n static httpsRegExValidator(regExValidator: RegExp): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n return AppFunctions.IsNullOrWhiteSpace(control.value) || regExValidator.test(control.value) ?\r\n null\r\n : {\r\n httpsRegExValidator: {\r\n valid: false\r\n }\r\n };\r\n };\r\n }\r\n\r\n static rangeValidator(lower: number, upper: number): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n let v: number = control.value;\r\n if (typeof v == 'string') { // Currency Type BhControl\r\n v = AppFunctions.validNumber(v);\r\n }\r\n return ((v != null && lower != null && v < lower) || (v != null && upper != null && v > upper)) ?\r\n { rangeValidator: { valid: false } }\r\n : null;\r\n };\r\n }\r\n\r\n static duplicateValidator(values: any[]): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n if (values) {\r\n return values.filter(x => x == control.value).length === 1 ? null : { duplicateValidator: { valid: false } };\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n\r\n static minValueValidator(lower: number): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n let v: number = control.value;\r\n if (typeof v == 'string') {\r\n v = AppFunctions.validNumber(v);\r\n }\r\n return ((v != null && lower != null && v < lower)) ?\r\n { minValueValidator: { valid: false } }\r\n : null;\r\n };\r\n }\r\n\r\n static maxValueValidator(upper: number): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n let v: number = control.value;\r\n if (typeof v == 'string') {\r\n v = AppFunctions.validNumber(v);\r\n }\r\n return ((v != null && upper != null && v > upper)) ?\r\n { maxValueValidator: { valid: false } }\r\n : null;\r\n };\r\n }\r\n\r\n static dateValidator(control: FormControl) {\r\n let isValid = control.value ? moment(control.value, \"M/D/YYYY\", true).isValid() : true;\r\n return isValid ? null : {\r\n dateValidator: {\r\n valid: false\r\n }\r\n };\r\n }\r\n\r\n static hasDigitValidator(control: FormControl) {\r\n if (control.value !== null) {\r\n return /\\d+/.test(control.value) ? null : {\r\n hasDigitValidator: {\r\n valid: false\r\n }\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n static hasSymbolValidator(control: FormControl) {\r\n if (control.value !== null) {\r\n return /\\W+/.test(control.value) ? null : {\r\n hasSymbolValidator: {\r\n valid: false\r\n }\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n static mixedCaseValidator(control: FormControl) {\r\n if (control.value !== null) {\r\n return control.value != control.value.toLowerCase() && control.value != control.value.toUpperCase() ? null : {\r\n mixedCaseValidator: {\r\n valid: false\r\n }\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n static failValidator(control: FormControl) {\r\n if (control) {\r\n return {\r\n failValidator: {\r\n valid: false\r\n }\r\n };\r\n }\r\n }\r\n\r\n static minMaxNumberCompareValidator(numberControl: AbstractControl, minOrMax: string): ValidatorFn {\r\n let subscribe = false;\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n if (numberControl !== null) {\r\n let result;\r\n if (minOrMax === \"Max\") {\r\n result = numberControl.value < control.value ? null : {\r\n minMaxNumberCompareValidator: true\r\n };\r\n }\r\n else if (minOrMax === \"Min\") {\r\n result = numberControl.value > control.value ? null : {\r\n minMaxNumberCompareValidator: true\r\n };\r\n }\r\n if (!subscribe) {\r\n subscribe = true;\r\n numberControl.updateValueAndValidity();\r\n }\r\n else {\r\n subscribe = false;\r\n }\r\n return result;\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n static equalToValidator(equalControl: AbstractControl): ValidatorFn {\r\n //let subscribe: boolean = false;\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n //if (!subscribe) {\r\n // subscribe = true;\r\n // equalControl.valueChanges.subscribe(() => {\r\n // control.updateValueAndValidity();\r\n // });\r\n //}\r\n\r\n return equalControl.value === control.value ? null : { equalToValidator: true };\r\n };\r\n }\r\n\r\n static dateComparisonValidator(compareWith: AbstractControl, comparisonType: string): ValidatorFn {\r\n let isValid: boolean = false;\r\n return (control: AbstractControl): { [key: string]: any } => {\r\n switch (comparisonType) {\r\n case 'isAfter':\r\n isValid = moment(control.value).isAfter(moment(compareWith.value));\r\n break;\r\n case 'isSameOrAfter':\r\n isValid = moment(control.value).isSameOrAfter(moment(compareWith.value));\r\n break;\r\n case 'isBefore':\r\n isValid = moment(control.value).isBefore(moment(compareWith.value));\r\n break;\r\n case 'isSameOrBefore':\r\n isValid = moment(control.value).isSameOrBefore(moment(compareWith.value));\r\n break;\r\n default:\r\n break;\r\n }\r\n return isValid ? null : { dateComparisonValidator: true };\r\n };\r\n }\r\n\r\n static beforeDate(otherDateControl: AbstractControl, message: string = 'Invalid date value'): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n const controlValue = moment(control.value);\r\n const otherControlValue = moment(otherDateControl.value);\r\n\r\n if (controlValue.isValid() && otherControlValue.isValid()) {\r\n if (controlValue.isAfter(otherControlValue)) {\r\n return {\r\n date: message\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n static afterDate(otherDateControl: AbstractControl, message: string = 'Invalid date value'): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n\r\n const controlValue = moment(control.value);\r\n const otherControlValue = moment(otherDateControl.value);\r\n\r\n if (controlValue.isValid() && otherControlValue.isValid()) {\r\n if (controlValue.isBefore(otherControlValue)) {\r\n return {\r\n date: message\r\n };\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n static dateBeforeOrOn(dateToCompare: Date, message: string = null): ValidatorFn {\r\n let errorMessage: string = `Date cannot be after ${dateToCompare}`;\r\n\r\n if (message) {\r\n errorMessage = message;\r\n }\r\n\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const controlValue = moment(control.value);\r\n const compareToValue = moment(dateToCompare);\r\n\r\n if (controlValue.isValid() &&\r\n compareToValue.isValid() &&\r\n controlValue.isAfter(compareToValue)) {\r\n return {\r\n dateBeforeOrOn: errorMessage\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n static dateOnOrAfter(dateToCompare: Date, message: string = null): ValidatorFn {\r\n let errorMessage: string = `Date cannot be before ${dateToCompare}`;\r\n\r\n if (message) {\r\n errorMessage = message;\r\n }\r\n\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const controlValue = moment(control.value);\r\n const compareToValue = moment(dateToCompare);\r\n\r\n if (controlValue.isValid() &&\r\n compareToValue.isValid() &&\r\n controlValue.isBefore(compareToValue)) {\r\n return {\r\n dateOnOrAfter: errorMessage\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n static dateRangeValidator(startKey: string, endKey: string): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n const formGroup = control as FormGroup;\r\n const start = formGroup.controls[startKey].value;\r\n const end = formGroup.controls[endKey].value;\r\n\r\n if (!start || !end) {\r\n return null;\r\n }\r\n\r\n const startDate = moment(start);\r\n const endDate = moment(end);\r\n\r\n if (endDate.isBefore(startDate)) {\r\n return { 'invalidDateRange': true };\r\n }\r\n\r\n if (endDate.isSame(startDate)) {\r\n return { 'sameStartDateAndEndDate': true };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n}\r\n"],"x_google_ignoreList":[]}