@axcode/axcloud-sdk 0.2.0-dev.1e6c3d5 → 0.2.0-dev.5dc7e06
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/dist/barnsport.d.mts +39 -0
- package/dist/barnsport.d.ts +39 -0
- package/dist/barnsport.js +73 -0
- package/dist/barnsport.js.map +1 -0
- package/dist/barnsport.mjs +4 -0
- package/dist/barnsport.mjs.map +1 -0
- package/dist/chunk-2IVJTMRB.js +519 -0
- package/dist/chunk-2IVJTMRB.js.map +1 -0
- package/dist/chunk-7IPCZJ5Q.mjs +273 -0
- package/dist/chunk-7IPCZJ5Q.mjs.map +1 -0
- package/dist/chunk-7K5N3DQ4.js +231 -0
- package/dist/chunk-7K5N3DQ4.js.map +1 -0
- package/dist/chunk-CACQMQCJ.mjs +506 -0
- package/dist/chunk-CACQMQCJ.mjs.map +1 -0
- package/dist/chunk-PMMCOWL3.mjs +223 -0
- package/dist/chunk-PMMCOWL3.mjs.map +1 -0
- package/dist/chunk-ZOQAXLCZ.js +290 -0
- package/dist/chunk-ZOQAXLCZ.js.map +1 -0
- package/dist/client-FOpKwe3e.d.mts +75 -0
- package/dist/client-FOpKwe3e.d.ts +75 -0
- package/dist/index.d.mts +41 -819
- package/dist/index.d.ts +41 -819
- package/dist/index.js +130 -889
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -839
- package/dist/index.mjs.map +1 -1
- package/dist/public.d.mts +27 -0
- package/dist/public.d.ts +27 -0
- package/dist/public.js +131 -0
- package/dist/public.js.map +1 -0
- package/dist/public.mjs +99 -0
- package/dist/public.mjs.map +1 -0
- package/dist/useBarnsport-C6uDSuHf.d.mts +583 -0
- package/dist/useBarnsport-C6uDSuHf.d.ts +583 -0
- package/dist/useContent-1WbKvPY4.d.mts +508 -0
- package/dist/useContent-Cl7dvERE.d.ts +508 -0
- package/package.json +15 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/errors.ts","../src/core/client.ts","../src/core/analytics.ts","../src/core/contentSlots.ts","../src/core/types.ts","../src/core/forms.ts","../src/core/voting.ts","../src/react/context.tsx","../src/react/analytics.ts","../src/react/auth/auth0Invitation.ts","../src/react/provider.tsx","../src/react/auth/useAuth.ts","../src/react/auth/useUser.ts","../src/react/hooks/useOrg.ts","../src/react/contentQueryPolicy.ts","../src/react/hooks/useContent.ts","../src/react/hooks/useNews.ts","../src/react/hooks/useMySection.ts","../src/react/hooks/useForms.ts","../src/react/hooks/useVoting.ts","../src/react/hooks/useLinkedAccounts.ts","../src/react/hooks/useMedia.ts","../src/react/hooks/useDocuments.ts","../src/react/hooks/useBarnsport.ts","../src/react/components/LoginButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/ModuleGate.tsx","../src/react/components/LinkedAccountsList.tsx"],"names":["createContext","useContext","useState","useRef","useCallback","useEffect","useMemo","QueryClient","useAuth0","useLayoutEffect","jsx","QueryClientProvider","Auth0Provider","organizationId","useQuery","useQueryClient","useMutation","Fragment","jsxs"],"mappings":";;;;;;;;AAcO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,KAAA,CAAM;AAAA,EAKtC,WAAA,CACE,OAAA,EACA,IAAA,EACA,MAAA,EACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,MAAM,gBAAA,GAAmB,KAAA;AAGzB,IAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,MAAA,gBAAA,CAAiB,iBAAA,CAAkB,MAAM,aAAY,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,OAAO,YAAA,CAAa,MAAA,EAAgB,IAAA,EAA8B;AAChE,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAS,QAAA,GAAY,IAAA,GAAmC,MAAA;AAC/E,IAAA,MAAM,OAAA,GAAA,CACH,OAAO,OAAA,EAAS,OAAA,KAAY,QAAA,GAAW,OAAA,CAAQ,OAAA,GAAU,MAAA,MACzD,OAAO,OAAA,EAAS,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,GAAQ,MAAA,CAAA;AAExD,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,aAAA;AAAA,UACT,OAAA,IAAW,yBAAA;AAAA,UACX,cAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,aAAA,CAAa,OAAA,IAAW,eAAA,EAAiB,WAAA,EAAa,QAAQ,OAAO,CAAA;AAAA,MAClF,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,aAAA,CAAa,OAAA,IAAW,oBAAA,EAAsB,WAAA,EAAa,QAAQ,OAAO,CAAA;AAAA,MACvF,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,aAAA;AAAA,UACT,OAAA,IAAW,mBAAA;AAAA,UACX,kBAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AACE,QAAA,IAAI,UAAU,GAAA,EAAK;AACjB,UAAA,OAAO,IAAI,aAAA,CAAa,OAAA,IAAW,cAAA,EAAgB,cAAA,EAAgB,QAAQ,OAAO,CAAA;AAAA,QACpF;AACA,QAAA,OAAO,IAAI,aAAA,CAAa,OAAA,IAAW,mBAAA,EAAqB,eAAA,EAAiB,QAAQ,OAAO,CAAA;AAAA;AAC5F,EACF;AAAA,EAEA,OAAO,aAAa,aAAA,EAAqC;AAGvD,IAAA,MAAM,QAAQ,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,KAAK,QAAA,KAAa,aAAA;AAC1E,IAAA,MAAM,OAAA,GACJ,KAAA,IAAS,aAAA,EAAe,OAAA,GAAU,cAAc,OAAA,GAAU,wBAAA;AAE5D,IAAA,OAAO,IAAI,aAAA;AAAA,MACT,OAAA;AAAA,MACA,eAAA;AAAA,MACA,CAAA;AAAA,MACA,KAAA,GAAQ,EAAE,aAAA,EAAe,aAAA,EAAe,SAAQ,GAAI;AAAA,KACtD;AAAA,EACF;AAAA,EAEA,OAAO,aAAa,SAAA,EAAiC;AACnD,IAAA,OAAO,IAAI,aAAA,CAAa,CAAA,wBAAA,EAA2B,SAAS,CAAA,EAAA,CAAA,EAAM,iBAAiB,CAAA,EAAG;AAAA,MACpF,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACF;AAEO,SAAS,eAAe,KAAA,EAAuC;AACpE,EAAA,OAAO,KAAA,YAAiB,YAAA;AAC1B;;;ACzEO,IAAM,gBAAN,MAAoB;AAAA,EAMzB,YAAY,MAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAC7B,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,OAAA,IAAW,GAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,MAAA,EAA2C;AAC9D,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAS,MAAc,MAAA,EAAwE;AACrG,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAE5C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,QAAA,IAAI,UAAU,MAAA,EAAW;AACvB,UAAA,GAAA,CAAI,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC5C;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,IAAA,EAAuB;AAChD,IAAA,MAAM,aAAa,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AACzD,IAAA,OACE,UAAA,CAAW,UAAA,CAAW,UAAU,CAAA,IAChC,UAAA,CAAW,UAAA,CAAW,cAAc,CAAA,IACpC,UAAA,CAAW,UAAA,CAAW,kBAAkB,CAAA,IACxC,UAAA,CAAW,WAAW,gBAAgB,CAAA,IACtC,UAAA,CAAW,UAAA,CAAW,oBAAoB,CAAA,IAC1C,UAAA,CAAW,UAAA,CAAW,oBAAoB,CAAA,IAC1C,UAAA,CAAW,UAAA,CAAW,wBAAwB,CAAA;AAAA,EAElD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAW,IAAA,EAAc,OAAA,GAA0B,EAAC,EAAe;AACvE,IAAA,MAAM,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,eAAe,OAAA,EAAS,GAAG,aAAY,GAAI,OAAA;AAG1E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB;AAAA,KAClB;AAGA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,mBAAA,GAAsB,aAAA;AAC5B,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,mBAAmB,CAAA;AAAA,IAC5C;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA,EAAG;AAChD,MAAA,OAAA,CAAQ,WAAW,IAAI,IAAA,CAAK,MAAA;AAAA,IAC9B;AAGA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,cAAA,EAAe;AACxC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAA,QAC5C;AAAA,MACF,SAAS,KAAA,EAAO;AAGd,QAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK,aAAa,aAAA,EAAe;AAC7E,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,6CAAA;AAAA,YACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,WAC3C;AAAA,QACF;AAAA,MAEF;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAGtC,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,cAAA,GAAiB,WAAW,IAAA,CAAK,cAAA;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,cAAc,CAAA;AAErE,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,GAAG,WAAA;AAAA,QACH,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QACpC,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAGD,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,MAAA,MAAM,MAAA,GAAS,WAAA,EAAa,QAAA,CAAS,kBAAkB,CAAA;AAEvD,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,SAAA,GAAY,SAAS,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA,GAAI,IAAA;AACrE,QAAA,MAAM,YAAA,CAAa,YAAA,CAAa,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AAAA,MAC5D;AAGA,MAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,OAAO,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,KAAU,EAAC;AAAA,IAC5C,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,YAAA,EAAc;AACjC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,YAAA,CAAa,aAAa,cAAc,CAAA;AAAA,MAChD;AACA,MAAA,MAAM,YAAA,CAAa,YAAA,CAAa,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAS,CAAA;AAAA,IAC5E,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAO,MAAc,MAAA,EAA4E;AAC/F,IAAA,OAAO,KAAK,OAAA,CAAW,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAQ,MAAc,IAAA,EAA4B;AAChD,IAAA,OAAO,KAAK,OAAA,CAAW,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,GAAA,CAAO,MAAc,IAAA,EAA4B;AAC/C,IAAA,OAAO,KAAK,OAAA,CAAW,IAAA,EAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAS,MAAc,IAAA,EAA4B;AACjD,IAAA,OAAO,KAAK,OAAA,CAAW,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAU,IAAA,EAA0B;AAClC,IAAA,OAAO,KAAK,OAAA,CAAW,IAAA,EAAM,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EACnD;AACF;AAIA,IAAM,cAAA,uBAAqB,OAAA,EAA+B;AAMnD,SAAS,YAAA,CAAa,QAAsB,GAAA,EAA6B;AAC9E,EAAA,MAAM,MAAA,GAAS,IAAI,aAAA,CAAc,MAAM,CAAA;AACvC,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,cAAA,CAAe,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,UAAU,GAAA,EAA6B;AACrD,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,MAAM,IAAI,MAAM,+GAA+G,CAAA;AACjI;;;ACxLA,IAAM,kBAAA,GAAqB,wBAAA;AAC3B,IAAM,oBAAA,GAAuB,wBAAA;AAC7B,IAAM,0BAAA,GACJ,mFAAA;AACF,IAAM,mBAAA,GAAsB,4BAAA;AAC5B,IAAM,uBAAA,GAA0B;AAAA,EAC9B,+BAAA;AAAA,EACA,yFAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,WAAA,uBAAkB,GAAA,EAA2B;AAE5C,SAAS,yBAAyB,QAAA,EAA2B;AAClE,EAAA,OAAO,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,KAAA;AAC9E;AAEO,SAAS,qBAAA,CACd,UACA,gBAAA,EACe;AACf,EAAA,MAAM,UAAU,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAChD,EAAA,MAAM,kBAAkB,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,GAAI,OAAA,GAAU,IAAI,OAAO,CAAA,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,mBAAmB,eAAe,CAAA;AACjD,EAAA,IAAI,MAAA,KAAW,MAAM,OAAO,IAAA;AAC5B,EAAA,MAAM,OAAO,MAAA,IAAU,eAAA;AACvB,EAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,CAAC,CAAA,IAAK,GAAA;AAE9C,EAAA,MAAM,WAAW,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,OAAA,KAAY;AACrD,IAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,IAAA,IAAI,OAAA,GAAU,OAAA;AACd,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,mBAAmB,OAAO,CAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,uBAAA,CAAwB,KAAK,CAAC,OAAA,KAAY,QAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,GAAI,KAAA,GAAQ,OAAA;AAAA,EACpF,CAAC,CAAA;AAED,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,IAAK,GAAA;AAC/B;AAEO,SAAS,2BACd,IAAA,EACgC;AAChC,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,MAAM,YAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,QAAQ,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG;AAClE,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AACtC,IAAA,IAAI,CAAC,qBAAqB,IAAA,CAAK,GAAG,KAAK,0BAAA,CAA2B,IAAA,CAAK,GAAG,CAAA,EAAG;AAE7E,IAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,MAAA,MAAM,KAAA,GAAQ,SAAS,IAAA,EAAK;AAC5B,MAAA,IAAI,CAAC,SAAS,KAAA,CAAM,MAAA,GAAS,OAAO,mBAAA,CAAoB,IAAA,CAAK,KAAK,CAAA,EAAG;AACrE,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,KAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC7D,MAAA,SAAA,CAAU,GAAG,CAAA,GAAI,QAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,QAAA,KAAa,SAAA,EAAW,SAAA,CAAU,GAAG,CAAA,GAAI,QAAA;AAAA,EACtD;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,GAAS,IAAI,SAAA,GAAY,MAAA;AACzD;AAEO,SAAS,uBAAA,CACd,WACA,aAAA,EACS;AACT,EAAA,OAAO,kBAAA,CAAmB,KAAK,SAAS,CAAA,IAAK,QAAQ,aAAA,EAAe,QAAA,CAAS,SAAS,CAAC,CAAA;AACzF;AAEA,eAAsB,2BAA2B,KAAA,EAOd;AACjC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,wBAAA,CAA0B,CAAA;AACxD,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AACzC,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,OAAO,CAAA;AAC7C,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AACzC,EAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,KAAA,CAAM,QAAQ,CAAA;AAE/C,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAChC,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA,IACtC,QAAQ,KAAA,CAAM;AAAA,GACf,CAAA;AACD,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACvF,EAAA,OAAO,SAAS,IAAA,EAAK;AACvB;AAEO,SAAS,mBAAA,CACd,MAAA,EACA,GAAA,GAAgB,QAAA,EACD;AACf,EAAA,IAAI,CAAC,OAAO,OAAA,IAAW,CAAC,OAAO,SAAA,IAAa,CAAC,OAAO,SAAA,EAAW;AAC7D,IAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,KAAA,CAAM,+CAA+C,CAAC,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,MAAM,CAAA,EAAG,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI,OAAO,SAAS,CAAA,CAAA;AACnD,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAC3C,EAAA,IAAI,iBAAiB,OAAO,eAAA;AAE5B,EAAA,MAAM,WAAW,GAAA,CAAI,aAAA;AAAA,IACnB,CAAA,oCAAA,EAAuC,OAAO,SAAS,CAAA,EAAA;AAAA,GACzD;AACA,EAAA,IAAI,QAAA,IAAa,GAAA,CAAI,WAAA,EAAoC,KAAA,EAAO;AAC9D,IAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,EACzB;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACrD,IAAA,MAAM,MAAA,GAAS,QAAA,IAAY,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC7B,IAAA,MAAM,UAAU,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,kCAAkC,CAAC,CAAA;AAC1E,IAAA,MAAA,CAAO,iBAAiB,MAAA,EAAQ,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAM,CAAA;AACtD,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAExD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAA,CAAO,MAAM,MAAA,CAAO,SAAA;AACpB,MAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,MAAA,MAAA,CAAO,OAAA,CAAQ,YAAY,MAAA,CAAO,SAAA;AAClC,MAAA,MAAA,CAAO,OAAA,CAAQ,uBAAuB,MAAA,CAAO,SAAA;AAC7C,MAAA,MAAA,CAAO,OAAA,CAAQ,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,cAAc,IAAI,CAAA;AAC3D,MAAA,IAAI,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,UAAU,MAAA,CAAO,OAAA;AACpD,MAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ,MAAA,CAAO,QAAQ,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAC5E,MAAA,IAAI,MAAA,CAAO,iBAAA,KAAsB,KAAA,EAAO,MAAA,CAAO,QAAQ,UAAA,GAAa,MAAA;AACpE,MAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,KAAA,EAAO,MAAA,CAAO,QAAQ,aAAA,GAAgB,MAAA;AACnE,MAAA,IAAI,MAAA,CAAO,WAAA,KAAgB,KAAA,EAAO,MAAA,CAAO,QAAQ,WAAA,GAAc,MAAA;AAC/D,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAClB,IAAA,WAAA,CAAY,OAAO,GAAG,CAAA;AACtB,IAAA,MAAM,KAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,WAAA,CAAY,GAAA,CAAI,KAAK,OAAO,CAAA;AAC5B,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,qBAAA,CACd,QAAA,EACA,OAAA,EACA,YAAA,GAAuB,MAAA,EACd;AACT,EAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,QAAA,EAAU,OAAA,CAAQ,aAAa,CAAA;AAClE,EAAA,MAAM,QAAS,YAAA,CAA6B,KAAA;AAC5C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO,OAAO,KAAA;AAC5B,EAAA,KAAA,CAAM,KAAA,CAAM,EAAE,GAAA,EAAK,IAAA,EAAM,OAAO,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA;AAC7D,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kBAAA,CACd,SAAA,EACA,IAAA,EACA,aAAA,EACA,eAAuB,MAAA,EACd;AACT,EAAA,MAAM,QAAS,YAAA,CAA6B,KAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,wBAAwB,SAAA,EAAW,aAAa,GAAG,OAAO,KAAA;AACzE,EAAA,KAAA,CAAM,KAAA,CAAM,SAAA,EAAW,0BAAA,CAA2B,IAAI,CAAC,CAAA;AACvD,EAAA,OAAO,IAAA;AACT;;;ACtLA,IAAM,mBAAA,GAAsB,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,MAAM,CAAA;AAEpD,SAAS,kBAAkB,OAAA,EAAyE;AACzG,EAAA,MAAM,MAAA,GAAyB,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA,GAAI,EAAE,GAAI,OAAA,EAAS,MAAA,EAA0B,GAAI,EAAC;AAEzG,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,EAAS,MAAA,IAAU,EAAC,EAAG;AACzC,IAAA,MAAM,IAAA,GAAO,aAAa,KAAK,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,EAAE,IAAA,IAAQ,MAAA,CAAA,SAAgB,IAAI,CAAA,GAAI,iBAAiB,KAAK,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,wBAAwB,OAAA,EAA4E;AAClH,EAAA,MAAM,MAAA,GAAS,kBAAkB,OAAO,CAAA;AAExC,EAAA,MAAM,KAAA,GAAQ,CAAuB,GAAA,EAAa,QAAA,KAAuC;AACvF,IAAA,OAAO,GAAA,IAAO,MAAA,GAAS,MAAA,CAAO,GAAG,CAAA,GAAK,QAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,EAAa,QAAA,GAAW,OAAO,kBAAA,CAAmB,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AAE1F,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,CAAC,GAAA,EAAK,QAAA,GAAW,OAAO,kBAAA,CAAmB,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,IACrE,IAAA,EAAM,UAAA;AAAA,IACN,UAAA;AAAA,IACA,IAAA,EAAM,CAAC,GAAA,EAAK,QAAA,GAAW,OAAO,eAAA,CAAgB,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,IAClE,KAAA,EAAO,CAAC,GAAA,EAAK,QAAA,KAAa,iBAAiB,KAAA,CAAM,GAAA,EAAK,QAAQ,CAAC;AAAA,GACjE;AACF;AAEA,SAAS,aAAa,KAAA,EAAyC;AAC7D,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,IAAc,EAAC;AAExC,EAAA,KAAA,MAAW,OAAO,mBAAA,EAAqB;AACrC,IAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,IAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,EAAG,OAAO,MAAM,IAAA,EAAK;AAAA,EACnE;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAiB,KAAA,EAAuC;AAC/D,EAAA,IAAI,KAAA,CAAM,UAAA,IAAc,OAAA,IAAW,KAAA,CAAM,UAAA,EAAY;AACnD,IAAA,OAAO,MAAM,UAAA,CAAW,KAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,OAAO,MAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GAAI,KAAA,CAAM,QAAQ,EAAC;AAAA,EACrD;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,GAAA,EAAK;AACvC,IAAA,OAAO;AAAA,MACL,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,SAAS,KAAA,CAAM;AAAA,KACjB;AAAA,EACF;AAEA,EAAA,OAAO,MAAM,OAAA,IAAW,EAAA;AAC1B;AAEA,SAAS,mBAAmB,KAAA,EAAwB;AAClD,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,EAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW,OAAO,OAAO,KAAK,CAAA;AAChF,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AACxG,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,gBAAgB,KAAA,EAA0B;AACjD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,mBAAmB,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,EACrE;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA,CACJ,KAAA,CAAM,OAAO,CAAA,CACb,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,OAAO,CAAA;AAAA,EACnB;AAEA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,iBAAiB,KAAA,EAA8C;AACtE,EAAA,IAAI,SAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,QAAQ,QAAA,EAAU;AACpD,IAAA,OAAO;AAAA,MACL,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,KAAK,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,GAAW,MAAM,GAAA,GAAM,MAAA;AAAA,MACjD,SAAS,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,MAAM,OAAA,GAAU;AAAA,KAC/D;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,EAAO;AACtC,IAAA,OAAO,EAAE,KAAK,KAAA,EAAM;AAAA,EACtB;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,CAAC,CAAC,KAAA,IAAS,OAAO,UAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrE;;;ACzBO,SAAS,iBAAA,CAAkB,MAAY,UAAA,EAA6B;AAEzE,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AACnD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,IAAA,CAAK,YAAY,oBAAA,EAAsB;AACzC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,oBAAA,CAAqB,QAAA,CAAS,UAAU,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,oBAAA,CAAqB,MAAY,WAAA,EAAgC;AAC/E,EAAA,OAAO,YAAY,IAAA,CAAK,CAAC,MAAM,iBAAA,CAAkB,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3D;AAKO,SAAS,qBAAA,CAAsB,MAAY,WAAA,EAAgC;AAChF,EAAA,OAAO,YAAY,KAAA,CAAM,CAAC,MAAM,iBAAA,CAAkB,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5D;;;ACpBA,eAAsB,UAAA,CACpB,QACA,UAAA,EACiC;AACjC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAExC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,cAAA,CAAA,EAAkB;AAAA,MACvD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,SAAS,UAAA,CAAW,MAAA;AAAA,QACpB,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,WAAW,UAAA,CAAW,QAAA;AAAA,QACtB,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,IAAA,EAAM,UAAA,CAAW,IAAA,IAAQ;AAAC,OAC3B;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO,EAAE,OAAA,EAAS,wBAAA,EAAyB,CAAE,CAAA;AACvF,MAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,OAAA,IAAW,wBAAwB,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAEnC,IAAA,OAAO;AAAA,MACL,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,cAAc,MAAA,CAAO;AAAA,KACvB;AAAA,EACF,SAAS,YAAA,EAAc;AAErB,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAAiB,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,cAAA,CAAA,EAAkB;AAAA,QAC7D,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACnB,SAAS,UAAA,CAAW,MAAA;AAAA,UACpB,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,WAAW,UAAA,CAAW,QAAA;AAAA,UACtB,OAAO,UAAA,CAAW;AAAA,SACnB;AAAA,OACF,CAAA;AAED,MAAA,IAAI,eAAe,EAAA,EAAI;AACrB,QAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,IAAA,EAAK;AACzC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,OAAO,OAAA,IAAW,0CAAA;AAAA,UAC3B,YAAA,EAAc;AAAA,SAChB;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,YAAA;AAAA,EACR;AACF;AAsBO,SAAS,iBAAiB,MAAA,EAA0D;AACzF,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA,IAIL,gBAAgB,CAAC,KAAA,EAAe,IAAA,KAC9B,UAAA,CAAW,OAAO,MAAA,EAAQ;AAAA,MACxB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAA,EAAU,UAAA;AAAA,MACV,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,eAAe,CACb,KAAA,EACA,IAAA,KAEA,UAAA,CAAW,OAAO,MAAA,EAAQ;AAAA,MACxB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAA,EAAU,SAAA;AAAA,MACV,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,kBAAkB,CAChB,KAAA,EACA,IAAA,KAOA,UAAA,CAAW,OAAO,MAAA,EAAQ;AAAA,MACxB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAA,EAAU,YAAA;AAAA,MACV,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AAAA;AAAA;AAAA,IAKH,QAAQ,CACN,QAAA,EACA,OACA,IAAA,KAEA,UAAA,CAAW,OAAO,MAAA,EAAQ;AAAA,MACxB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD;AAAA,GACL;AACF;;;ACpMA,SAAS,OAAO,YAAA,EAA8B;AAC5C,EAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACvC;AAGA,eAAe,SAAY,QAAA,EAAgC;AACzD,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACnD,EAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,SAAA,IAAa,IAAA,IAAQ,UAAU,IAAA,EAAM;AAC3E,IAAA,OAAQ,IAAA,CAAqB,IAAA;AAAA,EAC/B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,SAAS,QAAA,EAAmC;AACzD,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACnD,IAAA,MAAM,OAAA,GAAW,SAAS,IAAA,CAAK,KAAA,IAAS,KAAK,OAAA,CAAA,IAAa,CAAA,2BAAA,EAA8B,SAAS,MAAM,CAAA,CAAA;AACvG,IAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,EACzB;AACF;AASA,eAAsB,eAAA,CACpB,cACA,MAAA,EAC0B;AAC1B,EAAA,MAAM,WAAW,MAAM,KAAA;AAAA,IACrB,CAAA,EAAG,OAAO,YAAY,CAAC,yBAAyB,MAAA,CAAO,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,YAAA,CAAA;AAAA,IACnF;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM;AAAA;AAC5C,GACF;AACA,EAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,EAAA,OAAO,SAA0B,QAAQ,CAAA;AAC3C;AAKA,eAAsB,gBAAA,CACpB,cACA,MAAA,EACyB;AACzB,EAAA,MAAM,WAAW,MAAM,KAAA;AAAA,IACrB,CAAA,EAAG,OAAO,YAAY,CAAC,yBAAyB,MAAA,CAAO,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,KAAA,CAAA;AAAA,IACnF;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,gBAAA,EAAkB,MAAA,CAAO,eAAA,EAAiB,QAAA,EAAU,MAAA,CAAO,UAAU;AAAA;AACjH,GACF;AACA,EAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,EAAA,OAAO,SAAyB,QAAQ,CAAA;AAC1C;AAKA,eAAsB,gBAAA,CACpB,cACA,MAAA,EACsB;AACtB,EAAA,MAAM,WAAW,MAAM,KAAA;AAAA,IACrB,CAAA,EAAG,OAAO,YAAY,CAAC,yBAAyB,MAAA,CAAO,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,QAAA,CAAA;AAAA,IACnF;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,CAAO,MAAM;AAAA;AAC5C,GACF;AACA,EAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,EAAA,OAAO,SAAsB,QAAQ,CAAA;AACvC;AAMA,SAAS,YAAY,WAAA,EAA6C;AAChE,EAAA,OAAO,EAAE,cAAA,EAAgB,kBAAA,EAAoB,aAAA,EAAe,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA,EAAG;AACtF;AAKA,eAAsB,SAAA,CACpB,cACA,MAAA,EACiB;AACjB,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAA,CAAO,YAAY,CAAC,kBAAkB,MAAA,CAAO,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,CAAA;AACzF,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,EAAM,EAAE,SAAS,WAAA,CAAY,MAAA,CAAO,WAAW,CAAA,EAAG,CAAA;AAC/E,EAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAgD,QAAQ,CAAA;AAE3E,EAAA,IAAI,aAAgC,EAAC;AACrC,EAAA,IAAI,IAAA,CAAK,cAAc,UAAA,EAAY;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,WAAA,CAAA,EAAe,EAAE,OAAA,EAAS,WAAA,CAAY,MAAA,CAAO,WAAW,CAAA,EAAG,CAAA;AAC/F,IAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAA4C,QAAQ,CAAA;AACvE,IAAA,UAAA,GAAa,IAAA,CAAK,cAAc,EAAC;AAAA,EACnC;AACA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAW;AAC/B;AAKA,eAAsB,gBAAA,CACpB,cACA,MAAA,EACqE;AACrE,EAAA,MAAM,WAAW,MAAM,KAAA;AAAA,IACrB,CAAA,EAAG,OAAO,YAAY,CAAC,kBAAkB,MAAA,CAAO,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,YAAA,CAAA;AAAA,IAC5E,EAAE,OAAA,EAAS,WAAA,CAAY,MAAA,CAAO,WAAW,CAAA;AAAE,GAC7C;AACA,EAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,EAAA,OAAO,SAAS,QAAQ,CAAA;AAC1B;AAKA,eAAsB,QAAA,CACpB,cACA,MAAA,EAOyB;AACzB,EAAA,MAAM,WAAW,MAAM,KAAA;AAAA,IACrB,CAAA,EAAG,OAAO,YAAY,CAAC,kBAAkB,MAAA,CAAO,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,KAAA,CAAA;AAAA,IAC5E;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,WAAA,CAAY,MAAA,CAAO,WAAW,CAAA;AAAA,MACvC,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,gBAAA,EAAkB,OAAO,eAAA,EAAiB,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU;AAAA;AAC9F,GACF;AACA,EAAA,MAAM,SAAS,QAAQ,CAAA;AACvB,EAAA,OAAO,SAAyB,QAAQ,CAAA;AAC1C;ACvMO,IAAM,cAAA,GAAiBA,oBAA0C,IAAI,CAAA;AAErE,SAAS,iBAAA,GAAyC;AACvD,EAAA,MAAM,OAAA,GAAUC,iBAAW,cAAc,CAAA;AACzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,OAAA;AACT;AClBA,IAAM,gBAAA,GAAmB,wBAAA;AACzB,IAAI,sBAAA,GAAyB,CAAA;AAC7B,IAAI,iBAAA,GAAiD,IAAA;AACrD,IAAI,oBAAA,GAAuD,IAAA;AAO3D,SAAS,sBAAsB,QAAA,EAAkC;AAC/D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAM,MAAA;AAEhD,EAAA,IAAI,2BAA2B,CAAA,EAAG;AAChC,IAAA,iBAAA,GAAoB,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,OAAO,CAAA;AAChE,IAAA,oBAAA,GAAuB,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,OAAO,OAAO,CAAA;AACtE,IAAA,MAAA,CAAO,OAAA,CAAQ,SAAA,IAAa,CAAA,GAAI,IAAA,KAA2C;AACzE,MAAA,iBAAA,GAAoB,GAAG,IAAI,CAAA;AAC3B,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAAA,IAClD,CAAA,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,CAAQ,YAAA,IAAgB,CAAA,GAAI,IAAA,KAA8C;AAC/E,MAAA,oBAAA,GAAuB,GAAG,IAAI,CAAA;AAC9B,MAAA,MAAA,CAAO,aAAA,CAAc,IAAI,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAAA,IAClD,CAAA,CAAA;AAAA,EACF;AACA,EAAA,sBAAA,IAA0B,CAAA;AAC1B,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,QAAQ,CAAA;AAC5C,EAAA,MAAA,CAAO,gBAAA,CAAiB,kBAAkB,QAAQ,CAAA;AAElD,EAAA,OAAO,MAAM;AACX,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,QAAQ,CAAA;AAC/C,IAAA,MAAA,CAAO,mBAAA,CAAoB,kBAAkB,QAAQ,CAAA;AACrD,IAAA,sBAAA,GAAyB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,sBAAA,GAAyB,CAAC,CAAA;AAC/D,IAAA,IAAI,2BAA2B,CAAA,EAAG;AAChC,MAAA,IAAI,iBAAA,EAAmB,MAAA,CAAO,OAAA,CAAQ,SAAA,GAAY,iBAAA;AAClD,MAAA,IAAI,oBAAA,EAAsB,MAAA,CAAO,OAAA,CAAQ,YAAA,GAAe,oBAAA;AACxD,MAAA,iBAAA,GAAoB,IAAA;AACpB,MAAA,oBAAA,GAAuB,IAAA;AAAA,IACzB;AAAA,EACF,CAAA;AACF;AAEA,SAAS,kBAAkB,MAAA,EAAwC;AACjE,EAAA,IAAI,OAAO,iBAAA,KAAsB,KAAA,IAAS,OAAO,SAAA,KAAc,aAAa,OAAO,KAAA;AACnF,EAAA,OAAO,UAAU,UAAA,KAAe,GAAA;AAClC;AAEO,SAAS,oBAAoB,MAAA,EAAkD;AACpF,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,KAAK,CAAA;AACxC,EAAA,MAAM,eAAA,GAAkBC,aAAqC,IAAI,CAAA;AACjE,EAAA,MAAM,UAAA,GAAaA,YAAA,CAAO,MAAA,CAAO,SAAS,CAAA;AAC1C,EAAA,UAAA,CAAW,UAAU,MAAA,CAAO,SAAA;AAE5B,EAAA,MAAM,aAAA,GAAgBC,iBAAA;AAAA,IACpB,CAAC,QAAA,KAAsB;AACrB,MAAA,IAAI,CAAC,SAAS,CAAC,UAAA,CAAW,WAAW,OAAO,MAAA,KAAW,aAAa,OAAO,KAAA;AAC3E,MAAA,OAAO,sBAAsB,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,WAAW,OAAO,CAAA;AAAA,IACvF,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,KAAA,GAAQA,iBAAA;AAAA,IACZ,CAAC,WAAmB,IAAA,KAA8B;AAChD,MAAA,IAAI,CAAC,KAAA,IAAS,OAAO,MAAA,KAAW,aAAa,OAAO,KAAA;AACpD,MAAA,OAAO,kBAAA,CAAmB,SAAA,EAAW,IAAA,EAAM,eAAA,CAAgB,SAAS,aAAa,CAAA;AAAA,IACnF,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,MAAA,CAAO,SAAA;AACvB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,QAAA,CAAS,KAAK,CAAA;AACd,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAE1B,IAAA,IAAI,CAAC,SAAS,OAAA,IAAW,CAAC,QAAQ,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAA;AACnF,IAAA,IAAI,yBAAyB,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAC,OAAA,CAAQ,cAAA;AACjE,MAAA,OAAO,MAAA;AAET,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,cAA0B,MAAM,MAAA;AAEpC,IAAA,MAAM,aAAa,YAAY;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,0BAAA,CAA2B;AAAA,UACpD,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,QAAA,EAAU,OAAO,QAAA,CAAS,QAAA;AAAA,UAC1B,QAAQ,UAAA,CAAW;AAAA,SACpB,CAAA;AACD,QAAA,IAAI,aAAa,CAAC,YAAA,CAAa,OAAA,IAAW,iBAAA,CAAkB,YAAY,CAAA,EAAG;AAE3E,QAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAC1B,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,MAAM,oBAAoB,YAAY,CAAA;AACtC,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,QAAA,CAAS,IAAI,CAAA;AAEb,QAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,UAAA,MAAM,mBAAmB,MAAM;AAC7B,YAAA,qBAAA,CAAsB,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,UACzD,CAAA;AACA,UAAA,gBAAA,EAAiB;AACjB,UAAA,WAAA,GAAc,sBAAsB,gBAAgB,CAAA;AAAA,QACtD;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,CAAC,SAAA,IAAa,EAAE,iBAAiB,KAAA,IAAS,KAAA,CAAM,SAAS,YAAA,CAAA,EAAe;AAC1E,UAAA,UAAA,CAAW,KAAK,CAAA;AAChB,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,KAAK,UAAA,EAAW;AAChB,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG;AAAA,IACD,OAAO,SAAA,EAAW,OAAA;AAAA,IAClB,OAAO,SAAA,EAAW,OAAA;AAAA,IAClB,OAAO,SAAA,EAAW,cAAA;AAAA,IAClB,OAAO,SAAA,EAAW,aAAA;AAAA,IAClB,MAAA,CAAO,MAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO;AAAA,GACR,CAAA;AAED,EAAA,OAAOC,aAAA;AAAA,IACL,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAO,aAAA,EAAc,CAAA;AAAA,IAC9C,CAAC,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,aAAa;AAAA,GACvC;AACF;AAEO,SAAS,YAAA,GAAiC;AAC/C,EAAA,OAAO,mBAAkB,CAAE,SAAA;AAC7B;;;ACvJA,IAAM,wBAAA,GAA2B,yBAAA;AAO1B,SAAS,sCAAA,CACd,wBACA,MAAA,GAAS,OAAO,WAAW,WAAA,GAAc,EAAA,GAAK,MAAA,CAAO,QAAA,CAAS,MAAA,EAC1B;AACpC,EAAA,IAAI,CAAC,sBAAA,IAA0B,CAAC,MAAA,SAAe,EAAC;AAEhD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAM,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,YAAY,GAAG,IAAA,EAAK;AAClD,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,cAAc,GAAG,IAAA,EAAK;AAEtD,EAAA,IACE,YAAA,KAAiB,0BACjB,CAAC,UAAA,IACD,CAAC,wBAAA,CAAyB,IAAA,CAAK,UAAU,CAAA,EACzC;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,EAAE,UAAA,EAAW;AACtB;ACMA,SAAS,wBAAA,GAAwC;AAC/C,EAAA,OAAO,IAAIC,sBAAA,CAAY;AAAA,IACrB,cAAA,EAAgB;AAAA,MACd,OAAA,EAAS;AAAA,QACP,WAAW,GAAA,GAAO,EAAA;AAAA,QAClB,MAAA,EAAQ,MAAO,EAAA,GAAK,EAAA;AAAA,QACpB,KAAA,EAAO,CAAC,YAAA,EAAc,KAAA,KAAU;AAC9B,UAAA,IAAI,cAAA,CAAe,KAAK,CAAA,IAAK,KAAA,CAAM,UAAU,GAAA,IAAO,KAAA,CAAM,SAAS,GAAA,EAAK;AACtE,YAAA,OAAO,KAAA;AAAA,UACT;AACA,UAAA,OAAO,YAAA,GAAe,CAAA;AAAA,QACxB,CAAA;AAAA,QACA,oBAAA,EAAsB;AAAA;AACxB;AACF,GACD,CAAA;AACH;AAKA,IAAM,wBAAA,uBAA+B,OAAA,EAA6B;AAElE,SAAS,+BAAA,CACP,QACA,OAAA,EACQ;AACR,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,OAAA,KAAY,OAAO,QAAA,GAAW,eAAA;AAAA,IAC9B,OAAA;AAAA,IACA,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO,KAAA;AAAA,IACP,MAAA,CAAO,MAAA;AAAA,IACP,OAAO,MAAA,IAAU,IAAA;AAAA,IACjB,OAAO,KAAA,CAAM,MAAA;AAAA,IACb,OAAO,KAAA,CAAM,QAAA;AAAA,IACb,MAAA,CAAO,MAAM,QAAA,IAAY,IAAA;AAAA,IACzB,MAAA,CAAO,MAAM,YAAA,IAAgB,IAAA;AAAA,IAC7B,MAAA,CAAO,MAAM,UAAA,IAAc;AAAA,GAC5B,CAAA;AACH;AAKA,SAAS,oBAAA,CAAqB;AAAA,EAC5B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,EAAE,sBAAA,EAAwB,eAAA,EAAiB,SAAA,EAAW,IAAA,KAASC,mBAAA,EAAS;AAC9E,EAAA,MAAM,SAAA,GAAY,oBAAoB,MAAM,CAAA;AAC5C,EAAA,MAAM,GAAG,kBAAkB,CAAA,GAAIN,eAAS,CAAC,CAAA;AACzC,EAAA,MAAM,cAAA,GAAiB,SAAA,GACnB,MAAA,GACA,eAAA,GACE,MAAM,GAAA,GACN,IAAA;AACN,EAAA,MAAM,wBACJ,cAAA,KAAmB,MAAA,GACf,MAAA,GACA,+BAAA,CAAgC,QAAQ,cAAc,CAAA;AAC5D,EAAA,MAAM,aAAA,GAAgB,wBAAA,CAAyB,GAAA,CAAI,WAAW,CAAA;AAC9D,EAAA,MAAM,oBAAA,GACJ,0BAA0B,MAAA,KACzB,CAAC,iBAAiB,wBAAA,CAAyB,GAAA,CAAI,WAAW,CAAA,KAAM,qBAAA,CAAA;AAEnE,EAAA,MAAM,iBAAA,GAAoBE,kBAAY,MAAM;AAK1C,IAAA,WAAA,CAAY,cAAc,EAAE,QAAA,EAAU,CAAC,SAAS,GAAG,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAK,qBAAA,CAAgB,MAAM;AAGpB,IAAA,IAAI,qBAAA,KAA0B,MAAA,IAAa,CAAC,oBAAA,EAAsB;AAKlE,IAAA,iBAAA,EAAkB;AAClB,IAAA,wBAAA,CAAyB,GAAA,CAAI,aAAa,qBAAqB,CAAA;AAC/D,IAAA,kBAAA,CAAmB,CAAC,UAAA,KAAe,UAAA,GAAa,CAAC,CAAA;AAAA,EACnD,GAAG,CAAC,iBAAA,EAAmB,qBAAA,EAAuB,oBAAA,EAAsB,WAAW,CAAC,CAAA;AAGhF,EAAA,MAAM,cAAA,GAAiBN,YAAAA,CAA0C,YAAY,MAAS,CAAA;AAGtF,EAAA,cAAA,CAAe,OAAA,GAAU,kBACrB,YAAY;AACV,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,sBAAA,EAAuB;AAAA,IACtC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,IACA,YAAY,MAAA;AAIhB,EAAA,MAAM,MAAA,GAASG,cAAQ,MAAM;AAC3B,IAAA,OAAO,IAAI,aAAA,CAAc;AAAA,MACvB,SAAS,MAAA,CAAO,MAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA;AAAA;AAAA;AAAA,MAGA,gBAAgB,YAAY;AAC1B,QAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,UAAA,OAAO,eAAe,OAAA,EAAQ;AAAA,QAChC;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACD,CAAA;AAAA,EACH,GAAG,CAAC,MAAA,CAAO,QAAQ,MAAA,CAAO,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE1C,EAAA,MAAM,YAAA,GAAeA,aAAAA;AAAA,IACnB,OAAO;AAAA,MACL,MAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,cAAc,CAAC,eAAA;AAAA,MACf,aAAA,EAAe,SAAA;AAAA,MACf,eAAA;AAAA,MACA,WAAA,EAAa,eAAA,GAAkB,IAAA,EAAM,GAAA,GAAM,MAAA;AAAA,MAC3C,iBAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,QAAQ,MAAA,EAAQ,eAAA,EAAiB,WAAW,IAAA,EAAM,GAAA,EAAK,mBAAmB,SAAS;AAAA,GACtF;AAEA,EAAA,MAAM,aAAA,GAAgB,qBAAA,KAA0B,MAAA,IAAa,CAAC,oBAAA;AAE9D,EAAA,uBACEI,cAAA,CAAC,eAAe,QAAA,EAAf,EAAwB,OAAO,YAAA,EAC7B,QAAA,EAAA,aAAA,GAAgB,WAAW,IAAA,EAC9B,CAAA;AAEJ;AAwBO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR,MAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,EAAa,mBAAA;AAAA,EACb;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,gBAAgB,CAAA,GAAIR,cAAAA,CAAS,wBAAwB,CAAA;AAC5D,EAAA,MAAM,cAAc,mBAAA,IAAuB,gBAAA;AAC3C,EAAA,MAAM,6BAAA,GAAgC,sCAAA,CAAuC,KAAA,CAAM,YAAY,CAAA;AAC/F,EAAA,MAAM,MAAA,GAAwBI,aAAAA;AAAA,IAC5B,OAAO;AAAA,MACL,KAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,KAAK;AAAA,GACjD;AAEA,EAAA,uBACEI,cAAA,CAACC,8BAAA,EAAA,EAAoB,MAAA,EAAQ,WAAA,EAC3B,QAAA,kBAAAD,cAAA;AAAA,IAACE,wBAAA;AAAA,IAAA;AAAA,MACC,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,mBAAA,EAAqB;AAAA,QACnB,cAAc,KAAA,CAAM,WAAA;AAAA,QACpB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,GAAI,MAAM,YAAA,GAAe,EAAE,cAAc,KAAA,CAAM,YAAA,KAAiB,EAAC;AAAA,QACjE,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,kBAAAF,cAAA,CAAC,oBAAA,EAAA,EAAqB,MAAA,EAAgB,WAAA,EAA0B,SAC7D,QAAA,EACH;AAAA;AAAA,GACF,EACF,CAAA;AAEJ;ACzKO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,iBAAA,EAAkB;AAChE,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,KAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA,EAAQ,WAAA;AAAA,IACR,sBAAA;AAAA,IACA;AAAA,MACEF,mBAAAA,EAAS;AAKb,EAAA,MAAM,KAAA,GAAQJ,iBAAAA;AAAA,IACZ,CAAC,OAAA,KAAoC;AACnC,MAAA,MAAM,6BAAA,GAAgC,sCAAA;AAAA,QACpC,OAAO,KAAA,CAAM;AAAA,OACf;AACA,MAAA,OAAO,iBAAA,CAAkB;AAAA,QACvB,QAAA,EAAU;AAAA,UACR,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS;AAAA,SACjD;AAAA,QACA,GAAI,MAAA,CAAO,KAAA,CAAM,YAAA,GACb;AAAA,UACE,mBAAA,EAAqB;AAAA,YACnB,YAAA,EAAc,OAAO,KAAA,CAAM,YAAA;AAAA,YAC3B,GAAG;AAAA;AACL,YAEF;AAAC,OACN,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,MAAA,CAAO,KAAA,CAAM,YAAA,EAAc,iBAAiB;AAAA,GAC/C;AAKA,EAAA,MAAM,MAAA,GAASA,iBAAAA;AAAA,IACb,CAAC,OAAA,KAAoC;AAEnC,MAAA,iBAAA,IAAoB;AACpB,MAAA,OAAO,WAAA,CAAY;AAAA,QACjB,YAAA,EAAc;AAAA,UACZ,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS;AAAA;AACjD,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,aAAa,iBAAiB;AAAA,GACjC;AAKA,EAAA,MAAM,cAAA,GAAiBA,kBAAY,YAAY;AAC7C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,sBAAA,EAAuB;AAAA,IACtC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,sBAAsB,CAAC,CAAA;AAM3B,EAAA,MAAM,WAAA,GAAcA,kBAAY,YAA8B;AAC5D,IAAA,MAAM,sBAAA,CAAuB,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,EAAiB;AACtC,IAAA,OAAO,QAAQ,cAAA,KAAmB,IAAA;AAAA,EACpC,CAAA,EAAG,CAAC,sBAAA,EAAwB,gBAAgB,CAAC,CAAA;AAO7C,EAAA,MAAM,wBAAA,GAA2BA,iBAAAA;AAAA,IAC/B,OAAO,OAAA,KAAsE;AAC3E,MAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,SAAA,EAAW;AAClC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,CAAU,mBAAmB,IAAA,EAAM;AACrC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAA,EAAQ,kBAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAM3B,oCAAA,EAAsC;AAAA,UACvC,SAAA,EAAW,OAAA,EAAS,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS;AAAA,SACjD,CAAA;AACD,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,IAAQ,EAAC;AAE/B,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,MAAA,EAAQ,KAAK,MAAA,IAAU,MAAA;AAAA,UACvB,OAAA,EAAS,KAAK,OAAA,IAAW,qCAAA;AAAA,UACzB,GAAI,KAAK,mBAAA,KAAwB,KAAA,CAAA,GAC7B,EAAE,iBAAA,EAAmB,IAAA,CAAK,mBAAA,EAAoB,GAC9C;AAAC,SACP;AAAA,MACF,SAAS,YAAA,EAAc;AACrB,QAAA,IAAI,cAAA,CAAe,YAAY,CAAA,IAAK,YAAA,CAAa,WAAW,GAAA,EAAK;AAC/D,UAAA,MAAM,eAAA,GAAkB,aAAa,OAAA,EAAS,OAAA;AAC9C,UAAA,MAAM,iBAAA,GAAoB,MAAA;AAAA,YACxB,eAAA,IAAmB,OAAO,eAAA,KAAoB,QAAA,GACzC,gBAA4C,mBAAA,GAC7C;AAAA,WACN;AACA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,MAAA,EAAQ,cAAA;AAAA,YACR,OAAA,EAAS,2DAAA;AAAA,YACT,GAAI,OAAO,QAAA,CAAS,iBAAiB,IAAI,EAAE,iBAAA,KAAsB;AAAC,WACpE;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,MAAA,EAAQ,eAAe;AAAA,GACrC;AAKA,EAAA,MAAM,cAAA,GAAiBA,kBAAY,MAAM;AACvC,IAAA,OAAO;AAAA,MACL,iBAAA;AAAA,MACA,MAAA,EAAQ,WAAA;AAAA,MACR,sBAAA;AAAA,MACA,gBAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,eAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,sBAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAMD,EAAA,MAAM,oBAAA,GAAuBA,iBAAAA;AAAA,IAC3B,OAAO,KAAA,KAAmE;AACxE,MAAA,MAAM,WAAA,GAAc,SAAS,SAAA,EAAW,KAAA;AAExC,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAEA,MAAA,IAAI;AAEF,QAAA,MAAM,WAAA,GAAc,OAAO,KAAA,CAAM,MAAA;AACjC,QAAA,MAAM,QAAA,GAAW,OAAO,KAAA,CAAM,QAAA;AAC9B,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,UAAA,IAAc,kCAAA;AAE9C,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,QAAA,EAAW,WAAW,CAAA,8BAAA,CAAA,EAAkC;AAAA,UACnF,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,YACnB,SAAA,EAAW,QAAA;AAAA,YACX,KAAA,EAAO,YAAY,WAAA,EAAY;AAAA,YAC/B;AAAA,WACD;AAAA,SACF,CAAA;AAED,QAAA,IAAI,SAAS,EAAA,EAAI;AACf,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAGA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW,KAAA,EAAO,MAAA,CAAO,MAAM,MAAA,EAAQ,MAAA,CAAO,MAAM,QAAQ;AAAA,GAC/D;AAEA,EAAA,OAAO;AAAA;AAAA,IAEL,eAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAM,SAAA,GACF;AAAA,MACE,EAAA,EAAI,UAAU,GAAA,IAAO,EAAA;AAAA,MACrB,KAAA,EAAO,UAAU,KAAA,IAAS,EAAA;AAAA,MAC1B,IAAA,EAAM,UAAU,IAAA,IAAQ,EAAA;AAAA,MACxB,QAAQ,SAAA,CAAU,OAAA;AAAA,MAClB,GAAI,OAAO,SAAA,CAAU,cAAA,KAAmB,SAAA,GACpC,EAAE,aAAA,EAAe,SAAA,CAAU,cAAA,EAAe,GAC1C;AAAC,KACP,GACA,IAAA;AAAA,IACJ,sBAAA,EAAwB,eAAA,IAAmB,SAAA,EAAW,cAAA,KAAmB,KAAA;AAAA,IACzE,KAAA;AAAA,IACA,MAAA;AAAA;AAAA,IAGA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,wBAAA;AAAA;AAAA,IAGA;AAAA,GACF;AACF;AC5RA,IAAM,mBAAA,GAAsB,CAAC,KAAA,EAAe,KAAA,EAAe,OAAA,KACzD,CAAC,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AAEjD,SAAS,SAAS,KAAA,EAAyC;AACzD,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACrE,KAAA,GACD,EAAC;AACP;AAEA,SAAS,SAAS,KAAA,EAA+B;AAC/C,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,CAAE,MAAA,GAAS,IAAI,KAAA,GAAQ,IAAA;AACxE;AAEA,SAAS,cAAc,KAAA,EAA0B;AAC/C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,MAAM,GAAA,CAAI,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAyB,IAAA,KAAS,IAAI,CAAC,CAAC,CAAA;AAChG;AAEA,SAAS,4BAA4B,aAAA,EAAmE;AACtG,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAqC;AAE1D,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,EAAkB,SAAA,EAAqB,SAAA,KAAwB;AACjF,IAAA,MAAM,EAAA,GAAK,SAAS,OAAO,CAAA;AAC3B,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,QAAA,CAAS,IAAI,EAAA,EAAI;AAAA,MACf,EAAA;AAAA,MACA,IAAA,EAAM,QAAA,CAAS,SAAS,CAAA,IAAK,UAAU,IAAA,IAAQ,EAAA;AAAA,MAC/C,IAAA,EAAM,QAAA,CAAS,SAAS,CAAA,IAAK,UAAU,IAAA,IAAQ;AAAA,KAChD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,iBAAiB,aAAA,CAAc,QAAA;AACrC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjC,IAAA,KAAA,MAAW,cAAc,cAAA,EAAgB;AACvC,MAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,QAAA,UAAA,CAAW,UAAU,CAAA;AACrB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,OAAA,GAAU,SAAS,UAAU,CAAA;AACnC,MAAA,UAAA;AAAA,QACE,OAAA,CAAQ,EAAA,IAAM,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,UAAA;AAAA,QAC3C,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,WAAA,IAAe,OAAA,CAAQ,YAAA;AAAA,QAC/C,OAAA,CAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,QAAA;AAAA,IACzB,aAAA,CAAc,sBAAsB,aAAA,CAAc;AAAA,GACpD;AACA,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,oBAAoB,KAAK,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,EAAG;AAClF,IAAA,MAAM,iBAAA,GAAoB,SAAS,oBAAoB,CAAA;AACvD,IAAA,UAAA;AAAA,MACE,SAAA;AAAA,MACA,iBAAA,CAAkB,IAAA,IAAQ,iBAAA,CAAkB,WAAA,IAAe,iBAAA,CAAkB,YAAA;AAAA,MAC7E,iBAAA,CAAkB;AAAA,KACpB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,aAAa,aAAA,CAAc,aAAA,CAAc,UAAA,IAAc,aAAA,CAAc,WAAW,CAAA,EAAG;AAC5F,IAAA,UAAA,CAAW,SAAS,CAAA;AAAA,EACtB;AAEA,EAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,aAAA,CAAc,SAAA,IAAa,cAAc,UAAU,CAAA;AACrF,EAAA,IAAI,gBAAA,aAA6B,gBAAgB,CAAA;AAEjD,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAC/C,EAAA,IAAI,CAAC,kBAAkB,OAAO,UAAA;AAE9B,EAAA,OAAO,UAAA,CAAW,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,KAAU;AACtC,IAAA,IAAI,IAAA,CAAK,EAAA,KAAO,gBAAA,EAAkB,OAAO,EAAA;AACzC,IAAA,IAAI,KAAA,CAAM,EAAA,KAAO,gBAAA,EAAkB,OAAO,CAAA;AAC1C,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,SAAS,oBAAoB,QAAA,EAA+C;AAC1E,EAAA,MAAM,GAAA,GAAM,SAAS,QAAQ,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,IAAK,QAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,4BAA4B,GAAG,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,UAAU,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,EAAG,EAAA,IAAM,IAAA;AAClF,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,QAAA,IAAY,IAAI,SAAS,CAAA;AAEvD,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,CAAC,IAAI,CAAA;AAAA,IACvC,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AAAA,IACzB,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,IAC3B,QAAA;AAAA,IACA,aAAa,QAAA,CAAS,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,YAAY,CAAA,IAAK,QAAA;AAAA,IAC9D,SAAA;AAAA,IACA,YAAY,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,QAAQ,EAAE,CAAA;AAAA,IAChD;AAAA,GACF;AACF;AAGO,SAAS,4BAAA,CACd,KACA,eAAA,EACiB;AACjB,EAAA,MAAM,cAAA,GAAiB,QAAA;AAAA,IACrB,GAAA,CAAI,2BAA2B,GAAA,CAAI;AAAA,GACrC;AACA,EAAA,MAAM,0BAA0B,MAAA,CAAO,WAAA;AAAA,IACrC,MAAA,CAAO,QAAQ,cAAc,CAAA,CAAE,IAAI,CAAC,CAACS,eAAAA,EAAgB,UAAU,CAAA,KAAM;AAAA,MACnEA,eAAAA;AAAA,MACA,oBAAoB,UAAU;AAAA,KAC/B;AAAA,GACH;AACA,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA;AAAA,wBAClB,GAAA,CAAI;AAAA,MACN,GAAG,aAAA,CAAc,GAAA,CAAI,SAAA,IAAa,IAAI,WAAW,CAAA;AAAA,MACjD,GAAG,MAAA,CAAO,IAAA,CAAK,uBAAuB;AAAA,KACvC;AAAA,GACH;AACA,EAAA,MAAM,uBAAA,GAA0B,QAAA;AAAA,IAC9B,GAAA,CAAI,2BAA2B,GAAA,CAAI;AAAA,GACrC;AACA,EAAA,MAAM,qBAAA,GAAwB,QAAA;AAAA,IAC5B,GAAA,CAAI,cAAA,IAAkB,GAAA,CAAI,cAAA,IAAkB,GAAA,CAAI;AAAA,GAClD;AACA,EAAA,MAAM,cAAA,GACJ,uBAAA,IACA,qBAAA,KACC,uBAAA,CAAwB,eAAe,IAAI,eAAA,GAAkB,IAAA,CAAA,IAC9D,SAAA,CAAU,CAAC,CAAA,IACX,eAAA;AACF,EAAA,MAAM,oBAAA,GAAuB,wBAAwB,eAAe,CAAA;AACpE,EAAA,MAAM,SAAA,GAAY,SAAS,GAAA,CAAI,SAAA,IAAa,IAAI,UAAA,IAAc,GAAA,CAAI,UAAU,CAAA,IAAK,EAAA;AACjF,EAAA,MAAM,QAAA,GAAW,SAAS,GAAA,CAAI,QAAA,IAAY,IAAI,SAAA,IAAa,GAAA,CAAI,WAAW,CAAA,IAAK,EAAA;AAC/E,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA,IAAK,EAAA;AACrC,EAAA,MAAM,YAAY,QAAA,CAAS,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,UAAU,CAAA,IAAK,EAAA;AAC/D,EAAA,MAAM,YAAY,QAAA,CAAS,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,UAAU,CAAA,IAAK,SAAA;AAC/D,EAAA,MAAM,OAAQ,oBAAA,EAAsB,IAAA,IAAQ,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA,IAAK,QAAA;AAClE,EAAA,MAAM,YAAY,oBAAA,EAAsB,SAAA,IAAa,SAAS,GAAA,CAAI,SAAA,IAAa,IAAI,UAAU,CAAA;AAC7F,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,GAAA,CAAI,WAAA,IAAe,IAAI,qBAAqB,CAAA;AAC9E,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAEtC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,QAAA,CAAS,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,UAAU,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,GAAG,CAAA,IAAK,EAAA;AAAA,IAChE,KAAA;AAAA,IACA,IAAA,EACE,QAAA,CAAS,GAAA,CAAI,IAAI,KACjB,CAAC,SAAA,EAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAC9C,KAAA;AAAA,IACF,SAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,oBAAA,EAAsB,KAAA,IAAS,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,IACxD,OAAO,QAAA,CAAS,GAAA,CAAI,SAAS,GAAA,CAAI,WAAA,IAAe,IAAI,YAAY,CAAA;AAAA,IAChE,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,OAAA,IAAW,IAAI,QAAQ,CAAA;AAAA,IAC7C,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,aAAa,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,OAAO,CAAA,IAAK,MAAA;AAAA,IAClF,cAAA;AAAA,IACA,GAAI,SAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,IACjC,IAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,SAAS,CAAA,GAAI,EAAE,QAAA,EAAS,GAAI,EAAC;AAAA,IACvD,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,uBAAA;AAAA,IACA,uBAAA;AAAA,IACA,YAAA,EACE,GAAA,CAAI,YAAA,KAAiB,IAAA,IACrB,GAAA,CAAI,cAAA,KAAmB,IAAA,IACvB,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA,KAAM,aAAA,IAC9B,IAAA,KAAS;AAAA,GACb;AACF;AA6BO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,EAAE,eAAA,EAAiB,SAAA,EAAW,eAAe,IAAA,EAAM,SAAA,KAAcL,mBAAAA,EAAS;AAChF,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,KAAU,iBAAA,EAAkB;AACnD,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,WAAW,GAAG,CAAA;AAEjE,EAAA,MAAM,QAAQM,mBAAA,CAA0B;AAAA,IACtC,QAAA;AAAA,IACA,SAAS,YAAY;AAEnB,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAA4B,eAAe,CAAA;AACzE,MAAA,OAAO,4BAAA,CAA6B,UAAU,KAAK,CAAA;AAAA,IACrD,CAAA;AAAA,IACA,OAAA,EAAS,mBAAmB,CAAC,aAAA;AAAA,IAC7B,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AAGD,EAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AACvB,EAAA,MAAM,UAAA,GAAa,QAAA,EAAU,SAAA,IAAa,EAAC;AAC3C,EAAA,MAAM,YAAA,GAAe,UAAU,YAAA,KAAiB,IAAA;AAGhD,EAAA,MAAM,aAAA,GAAgB,QAAA,EAAU,uBAAA,GAA0B,KAAK,CAAA;AAC/D,EAAA,MAAM,YAAA,GACJ,UAAA,CAAW,QAAA,CAAS,KAAK,CAAA,IACzB,eAAe,MAAA,EAAQ,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,QAAA;AAClD,EAAA,MAAM,SAAA,GAAa,eAAe,IAAA,IAAqC,IAAA;AACvE,EAAA,MAAM,SAAA,GAAY,aAAA,EAAe,SAAA,IAAa,QAAA,EAAU,SAAA,IAAa,IAAA;AACrE,EAAA,MAAM,WAAW,aAAA,EAAe,QAAA,EAAU,SACtC,aAAA,CAAc,QAAA,GACd,YACE,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,MAAM,SAAA,EAAW,IAAA,EAAM,aAAa,QAAA,EAAU,IAChE,EAAC;AACP,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,SAAS,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA,IAAK,IAAA;AACjF,EAAA,MAAM,WAAA,GAAc,eAAe,WAAA,IAAe,IAAA;AAElD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAM,IAAA,IAAQ,IAAA;AAAA,IACpB,SAAA,EAAW,iBAAiB,KAAA,CAAM,SAAA;AAAA,IAClC,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA;AAAA,IAGf,YAAA;AAAA,IACA,SAAA;AAAA,IACA,wBAAwB,aAAA,IAAiB,IAAA;AAAA,IACzC,KAAA,EAAO,aAAA,EAAe,KAAA,IAAS,KAAA,CAAM,MAAM,KAAA,IAAS,IAAA;AAAA,IACpD,OAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA,EAAY,aAAA,EAAe,UAAA,EAAY,MAAA,GACnC,aAAA,CAAc,aACd,SAAA,GACE,CAAC,SAAS,CAAA,GACV,EAAC;AAAA,IACP,QAAA,EAAU,eAAe,QAAA,IAAY,IAAA;AAAA,IACrC,WAAA;AAAA;AAAA,IAGA,eAAA;AAAA,IACA,IAAA,EAAM,SAAA,IAAa,KAAA,CAAM,IAAA,EAAM,IAAA,IAAQ,IAAA;AAAA,IACvC,cAAA,EAAgB,KAAA,CAAM,IAAA,EAAM,cAAA,IAAkB,IAAA;AAAA,IAC9C,SAAA;AAAA,IACA,WAAA,EAAa,KAAA,CAAM,IAAA,EAAM,WAAA,IAAe,EAAC;AAAA,IACzC;AAAA,GACF;AACF;AAMO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAC5C,EAAA,MAAM,cAAcC,yBAAA,EAAe;AAEnC,EAAA,OAAOC,sBAAA,CAA4D;AAAA,IACjE,YAAY,CAAC,OAAA,KAAY,MAAA,CAAO,KAAA,CAAyB,yBAAyB,OAAO,CAAA;AAAA,IACzF,WAAW,YAAY;AACrB,MAAA,MAAM,YAAY,iBAAA,CAAkB;AAAA,QAClC,QAAA,EAAU,CAAC,SAAA,EAAW,MAAA,EAAQ,MAAM,KAAK,CAAA;AAAA,QACzC,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AACH;AC1RO,SAAS,MAAA,GAAS;AACvB,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,YAAA,KAAiB,iBAAA,EAAkB;AAGjE,EAAA,MAAM,iBAAA,GAAoB,YAAA;AAE1B,EAAA,MAAM,QAAQF,mBAAAA,CAA4C;AAAA,IACxD,UAAU,CAAC,SAAA,EAAW,cAAA,EAAgB,KAAA,EAAO,OAAO,iBAAiB,CAAA;AAAA,IACrE,SAAS,YAAY;AACnB,MAAA,IAAI,iBAAA,EAAmB;AAErB,QAAA,OAAO,MAAA,CAAO,GAAA,CAAwB,CAAA,gBAAA,EAAmB,KAAK,CAAA,IAAA,CAAM,CAAA;AAAA,MACtE,CAAA,MAAO;AAEL,QAAA,OAAO,MAAA,CAAO,GAAA,CAAkB,CAAA,wBAAA,EAA2B,KAAK,CAAA,CAAE,CAAA;AAAA,MACpE;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AAGD,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AACtB,EAAA,MAAM,gBAAgB,OAAA,GAAU;AAAA,IAC9B,EAAA,EAAK,OAAA,CAAyB,EAAA,IAAO,OAAA,CAA+B,MAAA;AAAA,IACpE,MAAA,EAAS,OAAA,CAA+B,MAAA,IAAW,OAAA,CAAyB,EAAA;AAAA,IAC5E,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,QAAA,EAAW,OAAA,CAA+B,QAAA,IAAa,OAAA,CAAyB,QAAA,EAAU,KAAA;AAAA,IAC1F,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,EAAC;AAAA,IAC7B,SAAU,OAAA,CAA+B,OAAA;AAAA,IACzC,QAAS,OAAA,CAA+B;AAAA,GAC1C,GAAI,IAAA;AAKJ,EAAA,MAAM,SAAA,GAAYV,iBAAAA;AAAA,IAChB,CAAC,MAAA,KAAmC;AAClC,MAAA,MAAM,IAAA,GAAO,aAAA,EAAe,OAAA,IAAW,EAAC;AACxC,MAAA,OAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,IAC7B,CAAA;AAAA,IACA,CAAC,eAAe,OAAO;AAAA,GACzB;AAKA,EAAA,MAAM,OAAA,GAAU,aAAA,EAAe,OAAA,IAAW,EAAC;AAE3C,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,aAAA;AAAA,IACL,KAAA;AAAA,IACA,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA;AAAA,IAGf,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACjHO,IAAM,qBAAA,GAAwB,GAAA;AAE9B,SAAS,yBAAA,CAA0B,cAAsB,KAAA,EAAyB;AACvF,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,IAAK,KAAA,CAAM,UAAU,GAAA,IAAO,KAAA,CAAM,SAAS,GAAA,EAAK;AACtE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,YAAA,GAAe,CAAA;AACxB;AAEO,SAAS,+BAA+B,WAAA,EAA4C;AACzF,EAAA,QAAQ,WAAA,CAAY,aAAY;AAAG,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,WAAW,CAAA,CAAE,CAAA;AAAA;AAEnF;AAEO,SAAS,2BAA2B,WAAA,EAAwC;AACjF,EAAA,QAAQ,WAAA,CAAY,aAAY;AAAG,IACjC,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,OAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yCAAA,EAA4C,WAAW,CAAA,CAAE,CAAA;AAAA;AAE/E;AAQO,SAAS,qBAAA,CACd,SACA,UAAA,EACoB;AACpB,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,SAAS,WAAA,EAAY;AAAA,EAC/D;AAEA,EAAA,MAAM,SAAA,GAAY,QAAQ,aAAA,IAAiB,KAAA;AAC3C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,SAAS,cAAA,EAAe;AAAA,EACpE;AAEA,EAAA,MAAM,oBAAA,GAAuB,OAAO,OAAA,CAAQ,eAAA,KAAoB,SAAA;AAChE,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,eAAA,IAAmB,CAAC,OAAA,CAAQ,YAAA;AAC5D,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,SAAS,WAAA,EAAY;AAAA,EAC/D;AAKA,EAAA,IAAI,oBAAA,IAAwB,CAAC,OAAA,CAAQ,WAAA,EAAa;AAChD,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,SAAS,sBAAA,EAAuB;AAAA,EAC5E;AACA,EAAA,MAAM,OAAA,GAAU,QAAQ,WAAA,IAAe,8BAAA;AACvC,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,OAAA,CAAQ,OAAO,GAAG,OAAA,EAAQ;AAC9D;;;ACpDO,SAAS,UAAA,CACd,WAAA,EACA,OAAA,GAA+B,EAAC,EAChC;AACA,EAAA,MAAM,UAAU,iBAAA,EAAkB;AAClC,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,GAAI,OAAA;AACzC,EAAA,MAAM,cAAA,GAAiB,+BAA+B,WAAW,CAAA;AAEjE,EAAA,MAAM;AAAA,IACJ,UAAA,GAAa,KAAA;AAAA,IACb,IAAA,GAAO,CAAA;AAAA,IACP,QAAA,GAAW,EAAA;AAAA,IACX,MAAA;AAAA,IACA,MAAA,GAAS,cAAA,KAAmB,MAAA,GAAS,aAAA,GAAgB,WAAA;AAAA,IACrD,SAAA,GAAY,MAAA;AAAA,IACZ,IAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,OAAA,EAAS,UAAU,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,SAAA,GAAY,QAAA;AAC7D,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,IAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAM,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAAA,IACtC;AAAA,GACF;AAEA,EAAA,MAAM,QAAQU,mBAAAA,CAAiC;AAAA,IAC7C,QAAA,EAAU;AAAA,MACR,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,KAAA;AAAA,MACA,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,cAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,OAAA,EAAS,MACP,MAAA,CAAO,GAAA;AAAA,MACL,CAAA,SAAA,EAAY,aAAa,CAAA,CAAA,EAAI,KAAK,IAAI,cAAc,CAAA,CAAA;AAAA,MACpD;AAAA,KACF;AAAA,IACF,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,SAAA,EAAW,qBAAA;AAAA,IACX,oBAAA,EAAsB,IAAA;AAAA,IACtB,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAEpC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,KAAA,CAAM,MAAA;AAAA,IAClC,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,KAAA,CAAM,MAAA;AAAA,IAClC,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,IAAQ,IAAA;AAAA,IAC1B,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,QAAA;AAAA,IAClC,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,OAAA,IAAW,KAAA;AAAA,IAChC,UAAA,EAAY,MAAM,IAAA,EAAM,UAAA;AAAA,IACxB,SAAA,EAAW,MAAA,CAAO,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,SAAA;AAAA,IAC9C,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAUO,SAAS,cAAA,CACd,WAAA,EACA,QAAA,EACA,OAAA,GAA8B,EAAC,EAC/B;AACA,EAAA,MAAM,UAAU,iBAAA,EAAkB;AAClC,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,GAAI,OAAA;AACzC,EAAA,MAAM,UAAA,GAAa,2BAA2B,WAAW,CAAA;AACzD,EAAA,MAAM,EAAE,UAAA,GAAa,KAAA,EAAO,IAAA,EAAK,GAAI,OAAA;AACrC,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,OAAA,EAAS,UAAU,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,SAAA,GAAY,QAAA;AAE7D,EAAA,MAAM,QAAQA,mBAAAA,CAAY;AAAA,IACxB,QAAA,EAAU;AAAA,MACR,SAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA,CAAO,MAAA;AAAA,MACP,KAAA;AAAA,MACA,MAAA,CAAO,IAAA;AAAA,MACP,MAAA,CAAO,OAAA;AAAA,MACP,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAS,MAAM;AACb,MAAA,MAAM,eAAA,GAAkB,mBAAmB,QAAQ,CAAA;AACnD,MAAA,MAAM,QAAA,GAAW,YAAY,aAAa,CAAA,CAAA,EAAI,KAAK,CAAA,OAAA,EAAU,UAAU,IAAI,eAAe,CAAA,CAAA;AAC1F,MAAA,OAAO,IAAA,GAAO,MAAA,CAAO,GAAA,CAAO,QAAA,EAAU,EAAE,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAO,QAAQ,CAAA;AAAA,IAC1E,CAAA;AAAA,IACA,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC3C,SAAA,EAAW,qBAAA;AAAA,IACX,oBAAA,EAAsB,IAAA;AAAA,IACtB,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAM,IAAA,IAAQ,IAAA;AAAA,IACpB,SAAA,EAAW,MAAA,CAAO,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,SAAA;AAAA,IAC9C,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAmBO,SAAS,cAAA,CACd,IAAA,EACA,OAAA,GAA8B,EAAC,EACV;AACrB,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAkB,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AACrD,EAAA,MAAM,MAAA,GAASR,aAAAA,CAAQ,MAAM,uBAAA,CAAwB,KAAA,CAAM,IAAI,CAAA,EAAG,CAAC,KAAA,CAAM,IAAI,CAAC,CAAA;AAE9E,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,GAAG;AAAA,GACL;AACF;;;AC5KO,SAAS,OAAA,CAAQ,OAAA,GAA+B,EAAC,EAAG;AACzD,EAAA,OAAO,UAAA,CAAqB,QAAQ,OAAO,CAAA;AAC7C;AC2BO,SAAS,YAAA,CAAa,OAAA,GAAwC,EAAC,EAAG;AACvE,EAAA,MAAM,EAAE,cAAA,GAAiB,IAAA,EAAK,GAAI,OAAA;AAClC,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAIE,mBAAAA,EAAS;AACrC,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,KAAU,iBAAA,EAAkB;AACnD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,SAAA,EAAW,aAAA,KAAkB,OAAA,EAAQ;AAE9D,EAAA,MAAM,QAAQM,mBAAAA,CAA6B;AAAA,IACzC,UAAU,CAAC,SAAA,EAAW,aAAa,KAAA,EAAO,SAAA,EAAW,gBAAgB,KAAK,CAAA;AAAA,IAC1E,SAAS,YAAY;AACnB,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AAIA,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA;AAAA,QAC5B,CAAA,wBAAA,EAA2B,KAAK,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA;AAAA,QACtD,EAAE,cAAA,EAAgB,cAAA,GAAiB,MAAA,GAAS,MAAA;AAAU,OACxD;AAEA,MAAA,OAAO,SAAA,IAAa,YAAY,QAAA,CAAS,OAAA,KAAY,QAAQ,QAAA,CAAS,IAAA,GAAO,SAAS,IAAA,GAAO,QAAA;AAAA,IAC/F,CAAA;AAAA,IACA,OAAA,EAAS,eAAA,IAAmB,CAAC,aAAA,IAAiB,CAAC,CAAC,SAAA;AAAA,IAChD,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAM,IAAA,IAAQ,IAAA;AAAA,IACvB,SAAA;AAAA,IACA,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,OAAA,IAAW,EAAC;AAAA,IACjC,WAAA,EAAa,KAAA,CAAM,IAAA,EAAM,WAAA,IAAe,CAAA;AAAA,IACxC,SAAA,EAAW,iBAAiB,KAAA,CAAM,SAAA;AAAA,IAClC,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA;AAAA,IAGf,UAAA,EAAY,CAAC,CAAC,SAAA;AAAA;AAAA,IAGd;AAAA,GACF;AACF;AAeO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,KAAA,KAAU,iBAAA,EAAkB;AAEnD,EAAA,MAAM,QAAQA,mBAAAA,CAA2B;AAAA,IACvC,QAAA,EAAU,CAAC,SAAA,EAAW,UAAA,EAAY,OAAO,KAAK,CAAA;AAAA,IAC9C,SAAS,YAAY;AAGnB,MAAA,MAAM,WAAW,MAAM,MAAA,CAAO,GAAA,CAAqE,CAAA,wBAAA,EAA2B,KAAK,CAAA,SAAA,CAAW,CAAA;AAC9I,MAAA,OAAO,SAAA,IAAa,YAAY,QAAA,CAAS,OAAA,KAAY,QAAQ,QAAA,CAAS,IAAA,GAAO,SAAS,IAAA,GAAO,QAAA;AAAA,IAC/F,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,EAAC;AAAA,IACnC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AC/DO,SAAS,QAAA,CAAS,OAAA,GAA2B,EAAC,EAAG;AACtD,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAA,GAAQ,EAAA,EAAI,QAAO,GAAI,OAAA;AAEjD,EAAA,MAAM,QAAQA,mBAAAA,CAAkC;AAAA,IAC9C,QAAA,EAAU,CAAC,SAAA,EAAW,OAAA,EAAS,eAAe,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAAA,IACpF,SAAS,YAAY;AACnB,MAAA,MAAM,MAAA,GAA0C,EAAE,KAAA,EAAM;AACxD,MAAA,IAAI,QAAA,SAAiB,SAAA,GAAY,QAAA;AACjC,MAAA,IAAI,MAAA,SAAe,MAAA,GAAS,MAAA;AAC5B,MAAA,IAAI,MAAA,SAAe,MAAA,GAAS,MAAA;AAE5B,MAAA,OAAO,MAAA,CAAO,GAAA,CAA6B,CAAA,CAAA,EAAI,KAAK,gCAAgC,MAAM,CAAA;AAAA,IAC5F,CAAA;AAAA,IACA,WAAW,GAAA,GAAO;AAAA;AAAA,GACnB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IAC5B,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,IAC5B,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,OAAA,IAAW,KAAA;AAAA,IAChC,MAAA,EAAQ,MAAM,IAAA,EAAM,MAAA;AAAA,IACpB,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAsBO,SAAS,YAAA,CAAa,OAAA,GAA+B,EAAC,EAAG;AAC9D,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,EAAE,IAAA,GAAO,EAAA,EAAG,GAAI,OAAA;AAEtB,EAAA,MAAM,QAAQA,mBAAAA,CAA4B;AAAA,IACxC,UAAU,CAAC,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,OAAO,IAAI,CAAA;AAAA,IACnD,SAAS,YAAY;AACnB,MAAA,OAAO,OAAO,GAAA,CAAuB,CAAA,CAAA,EAAI,KAAK,CAAA,sBAAA,CAAA,EAA0B,EAAE,MAAM,CAAA;AAAA,IAClF,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAM,IAAA,EAAM,KAAA;AAAA,IACnB,OAAA,EAAS,MAAM,IAAA,EAAM,OAAA;AAAA,IACrB,MAAA,EAAQ,MAAM,IAAA,EAAM,MAAA;AAAA,IACpB,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AA0BO,SAAS,uBAAA,GAA0B;AACxC,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAC5C,EAAA,MAAM,cAAcC,yBAAAA,EAAe;AAEnC,EAAA,OAAOC,sBAAAA,CAAY;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB,YAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF,KAIM;AACJ,MAAA,OAAO,MAAA,CAAO,KAAA,CAMX,CAAA,CAAA,EAAI,KAAK,CAAA,6BAAA,EAAgC,YAAY,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,IAC/E,CAAA;AAAA,IACA,WAAW,MAAM;AAEf,MAAA,WAAA,CAAY,kBAAkB,EAAE,QAAA,EAAU,CAAC,SAAA,EAAW,OAAO,GAAG,CAAA;AAAA,IAClE;AAAA,GACD,CAAA;AACH;AC1JO,SAAS,aAAA,CAAc,EAAE,MAAA,EAAQ,YAAA,EAAa,EAAyB;AAC5E,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,iBAAA,EAAkB;AAC5C,EAAA,MAAM,OAAA,GAAU,gBAAgB,CAAA,EAAG,MAAA,CAAO,OAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,OAAA,CAAA;AAEnE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAId,eAA0B,YAAY,CAAA;AAChE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAiB,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA6B,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAA6B,MAAS,CAAA;AAClE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAeE,iBAAAA;AAAA,IACnB,OAAO,SAAA,KAAsB;AAC3B,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,CAAA;AAChF,QAAA,OAAA,CAAQ,SAAS,CAAA;AACjB,QAAA,SAAA,CAAU,OAAO,MAAM,CAAA;AACvB,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,MAAM,CAAA,GAAI,MAAM,gBAAA,CAAiB,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC9F,UAAA,UAAA,CAAW,CAAC,CAAA;AACZ,UAAA,QAAA,CAAS,eAAe,CAAA;AAAA,QAC1B,CAAA,MAAA,IAAW,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,MAAA,EAAQ;AAC3C,UAAA,SAAA,CAAU,OAAO,MAAM,CAAA;AACvB,UAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,QACnB,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,MAAA,CAAO,UAAU,6CAA6C,CAAA;AAAA,QACzE;AACA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,yBAAyB,CAAA;AACnE,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,MAAM;AAAA,GACzB;AAEA,EAAA,MAAM,UAAA,GAAaA,iBAAAA;AAAA,IACjB,OAAO,iBAA2B,QAAA,KAAsC;AACtE,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,gBAAA,CAAiB,SAAS,EAAE,KAAA,EAAO,QAAQ,IAAA,EAAM,eAAA,EAAiB,UAAU,CAAA;AAClF,QAAA,MAAM,CAAA,GAAI,MAAM,gBAAA,CAAiB,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACnF,QAAA,UAAA,CAAW,CAAC,CAAA;AACZ,QAAA,QAAA,CAAS,WAAW,CAAA;AACpB,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,uBAAuB,CAAA;AACjE,QAAA,OAAO,KAAA;AAAA,MACT,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,IAAI;AAAA,GAC/B;AAEA,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,YAAY,CAAA;AACrB,IAAA,OAAA,CAAQ,EAAE,CAAA;AACV,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,SAAA,CAAU,MAAS,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAOE,aAAAA;AAAA,IACL,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,UAAA,EAAY,KAAA,EAAM,CAAA;AAAA,IAC/F,CAAC,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,UAAA,EAAY,KAAK;AAAA,GACxF;AACF;ACeO,IAAM,yBAAA,GAA4B,CAAC,SAAA,EAAW,iBAAiB,CAAA;AAU/D,SAAS,iBAAA,GAA6C;AAC3D,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAC5C,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,OAAA,EAAQ;AACpC,EAAA,MAAM,cAAcS,yBAAAA,EAAe;AAKnC,EAAA,MAAM,QAAQD,mBAAAA,CAAS;AAAA,IACrB,QAAA,EAAU,CAAC,GAAG,yBAAA,EAA2B,KAAK,CAAA;AAAA,IAC9C,SAAS,YAAY;AACnB,MAAA,OAAO,MAAA,CAAO,IAAwB,CAAA,mCAAA,CAAqC,CAAA;AAAA,IAC7E,CAAA;AAAA,IACA,OAAA,EAAS,eAAA;AAAA,IACT,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AAKD,EAAA,MAAM,eAAeE,sBAAAA,CAAY;AAAA,IAC/B,UAAA,EAAY,OAAO,QAAA,KAA+C;AAChE,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA;AAAA,QAC5B,uCAAuC,QAAQ,CAAA,KAAA,CAAA;AAAA,QAC/C;AAAC,OACH;AAGA,MAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,QAAA,MAAA,CAAO,QAAA,CAAS,OAAO,QAAA,CAAS,iBAAA;AAAA,MAClC;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,yBAAA,EAA2B,CAAA;AAAA,IACvE;AAAA,GACD,CAAA;AAKD,EAAA,MAAM,iBAAiBA,sBAAAA,CAAY;AAAA,IACjC,UAAA,EAAY,OAAO,QAAA,KAAqB;AACtC,MAAA,OAAO,MAAA,CAAO,MAAA;AAAA,QACZ,uCAAuC,QAAQ,CAAA;AAAA,OACjD;AAAA,IACF,CAAA;AAAA,IACA,WAAW,MAAM;AACf,MAAA,WAAA,CAAY,iBAAA,CAAkB,EAAE,QAAA,EAAU,yBAAA,EAA2B,CAAA;AAAA,IACvE;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,KAAA,CAAM,IAAA,EAAM,UAAA,IAAc,EAAC;AAAA,IACvC,kBAAA,EAAoB,KAAA,CAAM,IAAA,EAAM,mBAAA,IAAuB,EAAC;AAAA,IACxD,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,UAAA,IAAc,KAAA;AAAA,IACrC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,aAAa,YAAA,CAAa,MAAA;AAAA,IAC1B,eAAe,cAAA,CAAe,MAAA;AAAA,IAC9B,WAAW,YAAA,CAAa,SAAA;AAAA,IACxB,aAAa,cAAA,CAAe,SAAA;AAAA,IAC5B,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AClKO,SAAS,WAAA,GAAc;AAC5B,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQF,mBAAAA,CAA+B;AAAA,IAC3C,QAAA,EAAU,CAAC,SAAA,EAAW,OAAA,EAAS,YAAY,KAAK,CAAA;AAAA,IAChD,SAAS,YAAY;AAEnB,MAAA,OAAO,MAAA,CAAO,GAAA,CAA0B,CAAA,cAAA,EAAiB,KAAK,CAAA,SAAA,CAAW,CAAA;AAAA,IAC3E,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA;AAAA,IACvB,MAAA,EAAQ,MAAO,EAAA,GAAK;AAAA;AAAA,GACrB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,IAAA;AAAA,IAClC,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,QAAA,EAAU,OAAA,IAAW,IAAA;AAAA,IAC1C,gBAAA,EAAkB,KAAA,CAAM,IAAA,EAAM,IAAA,IAAQ,IAAA;AAAA,IACtC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAgBO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAyB;AAAA,IACrC,QAAA,EAAU,CAAC,SAAA,EAAW,OAAA,EAAS,QAAQ,KAAK,CAAA;AAAA,IAC5C,SAAS,YAAY;AAEnB,MAAA,OAAO,MAAA,CAAO,GAAA,CAAoB,CAAA,cAAA,EAAiB,KAAK,CAAA,KAAA,CAAO,CAAA;AAAA,IACjE,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA;AAAA,IACvB,MAAA,EAAQ,MAAO,EAAA,GAAK;AAAA;AAAA,GACrB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,GAAA,IAAO,IAAA;AAAA,IAC5B,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,SAAA,IAAa,IAAA;AAAA,IACpC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAaO,SAAS,UAAU,MAAA,EAAgB;AACxC,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAyB;AAAA,IACrC,UAAU,CAAC,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,OAAO,MAAM,CAAA;AAAA,IACtD,SAAS,YAAY;AAEnB,MAAA,OAAO,OAAO,GAAA,CAAoB,CAAA,cAAA,EAAiB,KAAK,CAAA,QAAA,EAAW,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7E,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA,IACvB,MAAA,EAAQ,MAAO,EAAA,GAAK,EAAA;AAAA,IACpB,KAAA,EAAO;AAAA;AAAA,GACR,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,GAAA,IAAO,IAAA;AAAA,IAC9B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAqBO,SAAS,YAAA,CAAa,IAAA,GAAsC,OAAA,EAAS,KAAA,GAAQ,EAAA,EAAI;AACtF,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAA4B;AAAA,IACxC,UAAU,CAAC,SAAA,EAAW,SAAS,MAAA,EAAQ,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,IACzD,SAAS,YAAY;AAEnB,MAAA,OAAO,MAAA,CAAO,GAAA,CAAuB,CAAA,cAAA,EAAiB,KAAK,CAAA,KAAA,CAAA,EAAS;AAAA,QAClE,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IAC7B,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,IAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAaO,SAAS,SAAS,OAAA,EAAiB;AACxC,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAyB;AAAA,IACrC,UAAU,CAAC,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,IACrD,SAAS,YAAY;AAEnB,MAAA,OAAO,OAAO,GAAA,CAAoB,CAAA,cAAA,EAAiB,KAAK,CAAA,OAAA,EAAU,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7E,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,OAAA;AAAA,IACX,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA,IACvB,MAAA,EAAQ,MAAO,EAAA,GAAK;AAAA,GACrB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,GAAA,IAAO,IAAA;AAAA,IAC7B,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,SAAA,IAAa,IAAA;AAAA,IACpC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AC5LA,SAAS,oBAAoB,OAAA,EAAuF;AAClH,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,EAAS,MAAA;AAAA,IACjB,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,GAAG,CAAA;AAAA,IAC7B,OAAO,OAAA,EAAS;AAAA,GAClB;AACF;AAOO,SAAS,aAAa,OAAA,EAAgC;AAC3D,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAC5C,EAAA,MAAM,MAAA,GAAS,oBAAoB,OAAO,CAAA;AAE1C,EAAA,MAAM,QAAQA,mBAAAA,CAA+B;AAAA,IAC3C,UAAU,CAAC,SAAA,EAAW,WAAA,EAAa,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,IACzD,SAAS,YAAY;AACnB,MAAA,OAAO,MAAA,CAAO,GAAA,CAA0B,CAAA,kBAAA,EAAqB,KAAK,cAAc,MAAM,CAAA;AAAA,IACxF,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IACjC,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IAC7B,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,IAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAKO,SAAS,oBAAoB,UAAA,EAAgC;AAClE,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAA4B;AAAA,IACxC,UAAU,CAAC,SAAA,EAAW,WAAA,EAAa,UAAA,EAAY,OAAO,UAAU,CAAA;AAAA,IAChE,SAAS,YAAY;AACnB,MAAA,OAAO,MAAA,CAAO,GAAA;AAAA,QACZ,qBAAqB,KAAK,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAA,IAAc,EAAE,CAAC,CAAA,SAAA;AAAA,OAC9E;AAAA,IACF,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,UAAA;AAAA,IACX,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA,IACvB,MAAA,EAAQ,MAAO,EAAA,GAAK;AAAA,GACrB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,GAAA,IAAO,IAAA;AAAA,IACxB,WAAA,EAAa,KAAA,CAAM,IAAA,EAAM,GAAA,IAAO,IAAA;AAAA,IAChC,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,IAAA;AAAA,IAClC,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,IAAA;AAAA,IAClC,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,SAAA,IAAa,IAAA;AAAA,IACpC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAaO,SAAS,mBAAmB,OAAA,EAAgC;AACjE,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAC5C,EAAA,MAAM,MAAA,GAAS,oBAAoB,OAAO,CAAA;AAC1C,EAAA,MAAM,WAAW,OAAA,EAAS,QAAA;AAE1B,EAAA,MAAM,QAAQA,mBAAAA,CAA+B;AAAA,IAC3C,UAAU,CAAC,SAAA,EAAW,aAAa,QAAA,EAAU,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,IACnE,SAAS,YAAY;AACnB,MAAA,OAAO,MAAA,CAAO,GAAA,CAA0B,CAAA,mBAAA,EAAsB,KAAK,cAAc,MAAM,CAAA;AAAA,IACzF,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAIvC,EAAA,MAAM,KAAA,GAAQ,QAAA,GACV,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,UAAA,EAAY,QAAA,CAAS,QAAQ,CAAC,CAAA,GAC3D,QAAA;AAEJ,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,KAAA;AAAA,IACA,OAAO,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAM,KAAA,IAAS,CAAA;AAAA,IACtD,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAaO,SAAS,wBAAA,GAA2B;AACzC,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAqC;AAAA,IACjD,UAAU,CAAC,SAAA,EAAW,WAAA,EAAa,QAAA,EAAU,WAAW,KAAK,CAAA;AAAA,IAC7D,SAAS,YAAY;AACnB,MAAA,OAAO,MAAA,CAAO,GAAA;AAAA,QACZ,sBAAsB,KAAK,CAAA,iBAAA;AAAA,OAC7B;AAAA,IACF,CAAA;AAAA,IACA,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,OAAA,IAAW,EAAC;AAAA,IACjC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAKO,SAAS,0BAA0B,UAAA,EAAgC;AACxE,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAA4B;AAAA,IACxC,UAAU,CAAC,SAAA,EAAW,aAAa,QAAA,EAAU,UAAA,EAAY,OAAO,UAAU,CAAA;AAAA,IAC1E,SAAS,YAAY;AACnB,MAAA,OAAO,MAAA,CAAO,GAAA;AAAA,QACZ,sBAAsB,KAAK,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAA,IAAc,EAAE,CAAC,CAAA,SAAA;AAAA,OAC/E;AAAA,IACF,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAC,UAAA;AAAA,IACX,SAAA,EAAW,MAAO,EAAA,GAAK,EAAA;AAAA,IACvB,MAAA,EAAQ,MAAO,EAAA,GAAK;AAAA,GACrB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,GAAA,IAAO,IAAA;AAAA,IACxB,WAAA,EAAa,KAAA,CAAM,IAAA,EAAM,GAAA,IAAO,IAAA;AAAA,IAChC,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,IAAA;AAAA,IAClC,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,IAAA;AAAA,IAClC,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,SAAA,IAAa,IAAA;AAAA,IACpC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;ACvKO,SAAS,0BAAA,GAA6B;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAuD;AAAA,IACnE,QAAA,EAAU,CAAC,SAAA,EAAW,WAAA,EAAa,kBAAkB,KAAK,CAAA;AAAA,IAC1D,OAAA,EAAS,MACP,MAAA,CAAO,GAAA;AAAA,MACL,qBAAqB,KAAK,CAAA,eAAA;AAAA,KAC5B;AAAA,IACF,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IACtC,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,IAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAEO,SAAS,kBAAA,GAAqB;AACnC,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAgD;AAAA,IAC5D,QAAA,EAAU,CAAC,SAAA,EAAW,WAAA,EAAa,UAAU,KAAK,CAAA;AAAA,IAClD,OAAA,EAAS,MACP,MAAA,CAAO,GAAA;AAAA,MACL,qBAAqB,KAAK,CAAA,OAAA;AAAA,KAC5B;AAAA,IACF,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IAC9B,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,IAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAEO,SAAS,kBAAkB,IAAA,EAA0B;AAC1D,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAoC;AAAA,IAChD,UAAU,CAAC,SAAA,EAAW,WAAA,EAAa,OAAA,EAAS,OAAO,IAAI,CAAA;AAAA,IACvD,OAAA,EAAS,MACP,MAAA,CAAO,GAAA;AAAA,MACL,CAAA,kBAAA,EAAqB,KAAK,CAAA,QAAA,EAAW,IAAA,IAAQ,EAAE,CAAA;AAAA,KACjD;AAAA,IACF,OAAA,EAAS,QAAQ,IAAI,CAAA;AAAA,IACrB,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,IAAA;AAAA,IAC5B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAEO,SAAS,sBAAA,CAAuB,OAAA,GAAqC,EAAC,EAAG;AAC9E,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAC5C,EAAA,MAAM,MAAA,GAAgE,EAAE,GAAG,OAAA,EAAQ;AAEnF,EAAA,MAAM,QAAQA,mBAAAA,CAA2D;AAAA,IACvE,UAAU,CAAC,SAAA,EAAW,WAAA,EAAa,YAAA,EAAc,OAAO,OAAO,CAAA;AAAA,IAC/D,OAAA,EAAS,MACP,MAAA,CAAO,GAAA;AAAA,MACL,qBAAqB,KAAK,CAAA,WAAA,CAAA;AAAA,MAC1B;AAAA,KACF;AAAA,IACF,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,IAClC,KAAA,EAAO,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,IAC5B,UAAA,EAAY,KAAA,CAAM,IAAA,EAAM,UAAA,IAAc,IAAA;AAAA,IACtC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAEO,SAAS,qBAAqB,IAAA,EAA0B;AAC7D,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAoC;AAAA,IAChD,UAAU,CAAC,SAAA,EAAW,WAAA,EAAa,UAAA,EAAY,OAAO,IAAI,CAAA;AAAA,IAC1D,OAAA,EAAS,MACP,MAAA,CAAO,GAAA;AAAA,MACL,CAAA,kBAAA,EAAqB,KAAK,CAAA,YAAA,EAAe,IAAA,IAAQ,EAAE,CAAA;AAAA,KACrD;AAAA,IACF,OAAA,EAAS,QAAQ,IAAI,CAAA;AAAA,IACrB,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA,CAAM,IAAA,EAAM,QAAA,IAAY,IAAA;AAAA,IAClC,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAEO,SAAS,oBAAoB,OAAA,EAAkB;AACpD,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,MAAM,QAAQA,mBAAAA,CAAmC;AAAA,IAC/C,UAAU,CAAC,SAAA,EAAW,WAAA,EAAa,SAAA,EAAW,OAAO,OAAO,CAAA;AAAA,IAC5D,SAAS,MACP,MAAA,CAAO,GAAA,CAA8B,CAAA,kBAAA,EAAqB,KAAK,CAAA,QAAA,CAAA,EAAY;AAAA,MACzE;AAAA,KACD,CAAA;AAAA,IACH,SAAA,EAAW,MAAO,EAAA,GAAK;AAAA,GACxB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAM,IAAA,IAAQ,IAAA;AAAA,IACvB,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,IAAQ,EAAC;AAAA,IAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAEO,SAAS,0BAAA,GAA6B;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAM,GAAI,iBAAA,EAAkB;AAE5C,EAAA,OAAOE,sBAAAA,CAA4F;AAAA,IACjG,UAAA,EAAY,CAAC,UAAA,KACX,MAAA,CAAO,IAAA;AAAA,MACL,qBAAqB,KAAK,CAAA,SAAA,CAAA;AAAA,MAC1B;AAAA;AACF,GACH,CAAA;AACH;AC1HO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA,GAAW,QAAA;AAAA,EACX,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,OAAA,EAAQ;AAErC,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,KAAA,CAAM,EAAE,UAAU,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,uBACEN,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,SAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MAEJ,sBAAY,YAAA,GAAe;AAAA;AAAA,GAC9B;AAEJ;AAgCO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA,GAAW,SAAA;AAAA,EACX,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,OAAA,EAAQ;AAE3B,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAA,CAAO,EAAE,UAAU,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,WAAA;AAAA,MACT,SAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MAEJ;AAAA;AAAA,GACH;AAEJ;ACtCO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,wBAAA;AAAA,EACA,qBAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,eAAA,EAAiB,SAAA,EAAW,aAAA,EAAe,KAAA,KAAU,OAAA,EAAQ;AACrE,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,aAAA,KAAkB,OAAA,EAAQ;AAEnD,EAAA,MAAM,SAAA,GAAY,iBAAkB,eAAA,IAAmB,aAAA;AAGvD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOA,cAAAA,CAAAO,mBAAA,EAAA,EAAG,8CAAoBP,cAAAA,CAAC,2BAAwB,CAAA,EAAG,CAAA;AAAA,EAC5D;AAGA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,KAAA,CAAM,EAAE,QAAA,EAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA;AACxD,MAAA,uBAAOA,cAAAA,CAAAO,mBAAA,EAAA,EAAG,8CAAoBP,cAAAA,CAAC,2BAAwB,CAAA,EAAG,CAAA;AAAA,IAC5D;AACA,IAAA,uBAAOA,cAAAA,CAAAO,mBAAA,EAAA,EAAG,sDAA4BP,cAAAA,CAAC,mCAAgC,CAAA,EAAG,CAAA;AAAA,EAC5E;AAGA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAC3D,IAAA,MAAM,kBAAkB,IAAA,KAAS,IAAA,IAAQ,SAAS,MAAA,IAAa,aAAA,CAAc,SAAS,IAAI,CAAA;AAE1F,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,uBAAOA,cAAAA,CAAAO,mBAAA,EAAA,EAAG,mDAAyBP,cAAAA,CAAC,gCAA6B,CAAA,EAAG,CAAA;AAAA,IACtE;AAAA,EACF;AAGA,EAAA,uBAAOA,cAAAA,CAAAO,mBAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;AAGA,SAAS,uBAAA,GAA0B;AACjC,EAAA,uBAAOP,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS,EAAG,QAAA,EAAA,YAAA,EAAU,CAAA;AACzE;AAEA,SAAS,+BAAA,GAAkC;AACzC,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS,EACjD,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,iDAAmC,CAAA,EACxC,CAAA;AAEJ;AAEA,SAAS,4BAAA,GAA+B;AACtC,EAAA,uBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS,EACjD,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,6DAAoD,CAAA,EACzD,CAAA;AAEJ;ACpFO,SAAS,UAAA,CAAW;AAAA,EACzB,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,UAAA,GAAa;AACf,CAAA,EAAoB;AAClB,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAU,GAAI,MAAA,EAAO;AAGxC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,kBAAkB,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AAEhE,EAAA,MAAM,SAAA,GAAY,UAAA,GACd,eAAA,CAAgB,KAAA,CAAM,OAAK,SAAA,CAAU,CAAC,CAAC,CAAA,GACvC,eAAA,CAAgB,IAAA,CAAK,CAAA,CAAA,KAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAE1C,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBAAOA,cAAAA,CAAAO,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrB;AAEA,EAAA,uBAAOP,cAAAA,CAAAO,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;AAoBO,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,SAAA,KAAc,MAAA,EAAO;AAEjD,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AC1DA,IAAM,yBAAA,GAA4B,CAAC,QAAA,EAAU,WAAA,EAAa,OAAO,CAAA;AAMjE,SAAS,yBAAyB,QAAA,EAAsD;AACtF,EAAA,OAAO,yBAAA,CAA0B,SAAS,QAAkC,CAAA;AAC9E;AAEA,IAAM,aAAA,GAAkE;AAAA,EACtE,MAAA,EAAQ,CAAC,EAAE,SAAA,EAAU,qBACnBC,eAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,cAAA,EAClD,QAAA,EAAA;AAAA,oBAAAR,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yHAAA,EAA0H,MAAK,SAAA,EAAS,CAAA;AAAA,oBAChJA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uIAAA,EAAwI,MAAK,SAAA,EAAS,CAAA;AAAA,oBAC9JA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+HAAA,EAAgI,MAAK,SAAA,EAAS,CAAA;AAAA,oBACtJA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qIAAA,EAAsI,MAAK,SAAA,EAAS;AAAA,GAAA,EAC9J,CAAA;AAAA,EAEF,SAAA,EAAW,CAAC,EAAE,SAAA,uBACZQ,eAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EACvB,QAAA,EAAA;AAAA,oBAAAR,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,SAAA,EAAU,GAAE,eAAA,EAAe,CAAA;AAAA,oBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,SAAA,EAAU,GAAE,gBAAA,EAAgB,CAAA;AAAA,oBACvCA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,SAAA,EAAU,GAAE,iBAAA,EAAiB,CAAA;AAAA,oBACxCA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,SAAA,EAAU,GAAE,kBAAA,EAAkB;AAAA,GAAA,EAC3C,CAAA;AAAA,EAEF,OAAO,CAAC,EAAE,WAAU,qBAClBA,eAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAsB,MAAK,cAAA,EAClD,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6bAA2b,CAAA,EACrc,CAAA;AAAA,EAEF,KAAA,EAAO,CAAC,EAAE,SAAA,uBACRQ,eAAA,CAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,WAAA,EAAY,WAAsB,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC3F,QAAA,EAAA;AAAA,oBAAAR,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6EAAA,EAA6E,CAAA;AAAA,oBACrFA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAgB;AAAA,GAAA,EACnC;AAEJ,CAAA;AAQO,SAAS,kBAAA,CAAmB;AAAA,EACjC,SAAA;AAAA,EACA,kBAAA,GAAqB,IAAA;AAAA,EACrB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,MACE,iBAAA,EAAkB;AAGtB,EAAA,MAAM,kBAAA,GAAqB,YACvB,UAAA,CAAW,MAAA;AAAA,IAAO,OAChB,SAAA,CAAU,IAAA;AAAA,MAAK,CAAA,CAAA,KACb,EAAE,QAAA,CAAS,WAAA,GAAc,QAAA,CAAS,CAAC,CAAA,IACnC,CAAA,CAAE,aAAA,KAAkB;AAAA;AACtB,GACF,GACA,UAAA;AAEJ,EAAA,MAAM,0BAAA,GAA6B,YAC/B,kBAAA,CAAmB,MAAA;AAAA,IAAO,OACxB,SAAA,CAAU,IAAA;AAAA,MAAK,CAAA,QAAA,KACb,EAAE,QAAA,CAAS,WAAA,GAAc,QAAA,CAAS,QAAQ,CAAA,IAC1C,CAAA,CAAE,IAAA,KAAS;AAAA;AACb,GACF,GACA,kBAAA;AAEJ,EAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KAAqB;AACzC,IAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,IAAA,QAAA,GAAW,QAAQ,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,QAAA,KAA+C;AACjE,IAAA,eAAA,GAAkB,QAAQ,CAAA;AAC1B,IAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,oCAAoC,SAAA,IAAa,EAAE,IAAI,QAAA,EAAA,4BAAA,EAEvE,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW,kCAAkC,SAAA,IAAa,EAAE,IAAI,QAAA,EAAA,mDAAA,EAErE,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,QAAA,EAAkB,KAAA,GAAQ,KAAA,KAAU;AACnD,IAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,QAAQ,CAAA,IAAK,aAAA,CAAc,KAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,QACd,oEAAA,GACA,+BAAA;AACJ,IAAA,uBAAOA,cAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAW,SAAA,EAAW,CAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,wBAAA,EAA2B,SAAA,IAAa,EAAE,CAAA,CAAA,EAEvD,QAAA,EAAA;AAAA,IAAA,kBAAA,CAAmB,GAAA,CAAI,CAAC,QAAA,KAAa;AACpC,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,OAAO,eAAe,QAAA,EAAU,MAAM,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAC,CAAA;AAAA,MACvE;AAEA,MAAA,uBACEQ,eAAA,CAAC,KAAA,EAAA,EAAqD,SAAA,EAAU,+BAAA,EAC9D,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,SAAS,aAAa,CAAA;AAAA,0CAC9B,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,8BAAAR,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,mBAAS,qBAAA,EACZ,CAAA;AAAA,cACC,SAAS,UAAA,oBACRA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kCAAiC,QAAA,EAAA,SAAA,EAAO;AAAA,aAAA,EAE5D,CAAA;AAAA,YACC,QAAA,CAAS,YAAA,EAAc,KAAA,oBACtBA,cAAAA,CAAC,SAAI,SAAA,EAAU,gCAAA,EACZ,QAAA,EAAA,QAAA,CAAS,YAAA,CAAa,KAAA,EACzB;AAAA,WAAA,EAEJ;AAAA,SAAA,EACF,CAAA;AAAA,wBACAQ,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAA,CAAC,MAAA,EAAA,EAAK,WAAU,oCAAA,EACd,QAAA,EAAA;AAAA,4BAAAR,eAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAC5F,QAAA,kBAAAA,eAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAiB,CAAA,EACpC,CAAA;AAAA,YAAM;AAAA,WAAA,EAER,CAAA;AAAA,UACC,SAAA,IAAa,CAAC,QAAA,CAAS,UAAA,oBACtBA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,MAAM,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAA;AAAA,cAC7C,SAAA,EAAU,6EAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EAEJ;AAAA,OAAA,EAAA,EAlCQ,GAAG,QAAA,CAAS,QAAQ,CAAA,CAAA,EAAI,QAAA,CAAS,OAAO,CAAA,CAmClD,CAAA;AAAA,IAEJ,CAAC,CAAA;AAAA,IAGA,kBAAA,IACC,0BAAA,CAA2B,GAAA,CAAI,CAAC,QAAA,KAAa;AAC3C,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,OAAO,uBAAA,CAAwB,UAAU,MAAM;AAC7C,UAAA,IAAI,wBAAA,CAAyB,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC/C,YAAA,UAAA,CAAW,SAAS,QAAQ,CAAA;AAAA,UAC9B;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,uBACEQ,eAAA,CAAC,KAAA,EAAA,EAA4B,SAAA,EAAU,oCAAA,EACrC,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,QAAA,CAAS,MAAM,IAAI,CAAA;AAAA,0CAC3B,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAR,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EACb,mBAAS,YAAA,EACZ,CAAA;AAAA,4BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAiC,QAAA,EAAA,eAAA,EAAa;AAAA,WAAA,EAC/D;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAS,MAAM;AACb,cAAA,IAAI,wBAAA,CAAyB,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC/C,gBAAA,UAAA,CAAW,SAAS,QAAQ,CAAA;AAAA,cAC9B;AAAA,YACF,CAAA;AAAA,YACA,SAAA,EAAU,0EAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EAAA,EAnBQ,SAAS,QAoBnB,CAAA;AAAA,IAEJ,CAAC;AAAA,GAAA,EACL,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * AxCloud SDK Error Types\n */\n\nexport type AxCloudErrorCode =\n | 'UNAUTHORIZED'\n | 'FORBIDDEN'\n | 'NOT_FOUND'\n | 'VALIDATION_ERROR'\n | 'NETWORK_ERROR'\n | 'TIMEOUT_ERROR'\n | 'SERVER_ERROR'\n | 'UNKNOWN_ERROR';\n\nexport class AxCloudError extends Error {\n readonly code: AxCloudErrorCode;\n readonly status: number;\n readonly details?: Record<string, unknown>;\n\n constructor(\n message: string,\n code: AxCloudErrorCode,\n status: number,\n details?: Record<string, unknown>\n ) {\n super(message);\n this.name = 'AxCloudError';\n this.code = code;\n this.status = status;\n this.details = details;\n\n // Maintains proper stack trace for where error was thrown (V8 only)\n const ErrorWithCapture = Error as typeof Error & {\n captureStackTrace?: (target: object, constructor?: typeof AxCloudError) => void;\n };\n if (ErrorWithCapture.captureStackTrace) {\n ErrorWithCapture.captureStackTrace(this, AxCloudError);\n }\n }\n\n static fromResponse(status: number, body?: unknown): AxCloudError {\n const details = typeof body === 'object' ? (body as Record<string, unknown>) : undefined;\n const message =\n (typeof details?.message === 'string' ? details.message : undefined) ||\n (typeof details?.error === 'string' ? details.error : undefined);\n\n switch (status) {\n case 401:\n return new AxCloudError(\n message || 'Authentication required',\n 'UNAUTHORIZED',\n status,\n details\n );\n case 403:\n return new AxCloudError(message || 'Access denied', 'FORBIDDEN', status, details);\n case 404:\n return new AxCloudError(message || 'Resource not found', 'NOT_FOUND', status, details);\n case 422:\n return new AxCloudError(\n message || 'Validation failed',\n 'VALIDATION_ERROR',\n status,\n details\n );\n default:\n if (status >= 500) {\n return new AxCloudError(message || 'Server error', 'SERVER_ERROR', status, details);\n }\n return new AxCloudError(message || 'An error occurred', 'UNKNOWN_ERROR', status, details);\n }\n }\n\n static networkError(originalError?: Error): AxCloudError {\n // Don't include original error details in production to avoid leaking sensitive info\n // Use typeof check to avoid issues in environments where process is not defined\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';\n const message =\n isDev && originalError?.message ? originalError.message : 'Network request failed';\n\n return new AxCloudError(\n message,\n 'NETWORK_ERROR',\n 0,\n isDev ? { originalError: originalError?.message } : undefined\n );\n }\n\n static timeoutError(timeoutMs: number): AxCloudError {\n return new AxCloudError(`Request timed out after ${timeoutMs}ms`, 'TIMEOUT_ERROR', 0, {\n timeout: timeoutMs,\n });\n }\n}\n\nexport function isAxCloudError(error: unknown): error is AxCloudError {\n return error instanceof AxCloudError;\n}\n","/**\n * AxCloud API Client\n *\n * Fetch wrapper with authentication header injection and error handling.\n */\n\nimport { AxCloudError } from './errors'\n\nexport interface ClientConfig {\n baseUrl: string\n getAccessToken?: () => Promise<string | undefined>\n /** API key for public content endpoints */\n apiKey?: string\n /** Default request timeout in milliseconds (default: 30000) */\n timeout?: number\n}\n\nexport interface RequestOptions extends Omit<RequestInit, 'body'> {\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n /** Request timeout in milliseconds (overrides client default) */\n timeout?: number\n}\n\nexport class AxCloudClient {\n private baseUrl: string\n private getAccessToken?: () => Promise<string | undefined>\n private apiKey?: string\n private defaultTimeout: number\n\n constructor(config: ClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '')\n this.getAccessToken = config.getAccessToken\n this.apiKey = config.apiKey\n this.defaultTimeout = config.timeout ?? 30000\n }\n\n /**\n * Update the access token getter (used when auth state changes)\n */\n setAccessTokenGetter(getter: () => Promise<string | undefined>) {\n this.getAccessToken = getter\n }\n\n /**\n * Build URL with query parameters\n */\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.append(key, String(value))\n }\n })\n }\n\n return url.toString()\n }\n\n /**\n * API key should only be sent to public endpoints.\n * This avoids leaking public keys to authenticated/internal routes.\n */\n private shouldAttachApiKey(path: string): boolean {\n const normalized = path.startsWith('/') ? path : `/${path}`\n return (\n normalized.startsWith('/public/') ||\n normalized.startsWith('/api/public/') ||\n normalized.startsWith('/content/public/') ||\n normalized.startsWith('/media/public/') ||\n normalized.startsWith('/documents/public/') ||\n normalized.startsWith('/barnsport/public/') ||\n normalized.startsWith('/api/barnsport/public/')\n )\n }\n\n /**\n * Make an authenticated request\n */\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const { body, params, headers: customHeaders, timeout, ...restOptions } = options\n\n // Initialize headers as Record<string, string> to avoid type casting\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n // Merge custom headers\n if (customHeaders) {\n const customHeadersRecord = customHeaders as Record<string, string>\n Object.assign(headers, customHeadersRecord)\n }\n\n // Add API key header only for public endpoints\n if (this.apiKey && this.shouldAttachApiKey(path)) {\n headers['x-api-key'] = this.apiKey\n }\n\n // Add auth header if we have a token getter\n if (this.getAccessToken) {\n try {\n const token = await this.getAccessToken()\n if (token) {\n headers['Authorization'] = `Bearer ${token}`\n }\n } catch (error) {\n // Log in development to help with debugging auth issues\n // Use typeof check to avoid issues in environments where process is not defined\n if (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development') {\n console.warn(\n '[AxCloud SDK] Failed to fetch access token:',\n error instanceof Error ? error.message : error\n )\n }\n // Don't throw - allow request to continue (backend will return 401 if needed)\n }\n }\n\n const url = this.buildUrl(path, params)\n\n // Setup AbortController for timeout\n const controller = new AbortController()\n const requestTimeout = timeout ?? this.defaultTimeout\n const timeoutId = setTimeout(() => controller.abort(), requestTimeout)\n\n try {\n const response = await fetch(url, {\n ...restOptions,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n\n // Handle non-JSON responses\n const contentType = response.headers.get('content-type')\n const isJson = contentType?.includes('application/json')\n\n if (!response.ok) {\n const errorBody = isJson ? await response.json().catch(() => null) : null\n throw AxCloudError.fromResponse(response.status, errorBody)\n }\n\n // Return empty object for 204 No Content\n if (response.status === 204) {\n return {} as T\n }\n\n return isJson ? await response.json() : ({} as T)\n } catch (error) {\n if (error instanceof AxCloudError) {\n throw error\n }\n // Handle abort/timeout errors\n if (error instanceof Error && error.name === 'AbortError') {\n throw AxCloudError.timeoutError(requestTimeout)\n }\n throw AxCloudError.networkError(error instanceof Error ? error : undefined)\n } finally {\n clearTimeout(timeoutId)\n }\n }\n\n /**\n * GET request\n */\n get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\n return this.request<T>(path, { method: 'GET', params })\n }\n\n /**\n * POST request\n */\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body })\n }\n\n /**\n * PUT request\n */\n put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PUT', body })\n }\n\n /**\n * PATCH request\n */\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body })\n }\n\n /**\n * DELETE request\n */\n delete<T>(path: string): Promise<T> {\n return this.request<T>(path, { method: 'DELETE' })\n }\n}\n\n// Client instance registry - allows multiple providers without SSR issues\n// Uses WeakMap to prevent memory leaks when providers unmount\nconst clientRegistry = new WeakMap<object, AxCloudClient>()\n\n/**\n * Create a client instance associated with a key (typically the provider instance)\n * This allows multiple AxCloudProviders to coexist without conflicts\n */\nexport function createClient(config: ClientConfig, key?: object): AxCloudClient {\n const client = new AxCloudClient(config)\n if (key) {\n clientRegistry.set(key, client)\n }\n return client\n}\n\n/**\n * Get a client instance by key\n * @deprecated Use the client from useAxCloudContext() instead\n */\nexport function getClient(key?: object): AxCloudClient {\n if (key) {\n const client = clientRegistry.get(key)\n if (client) {\n return client\n }\n }\n throw new Error('AxCloud client not found. Make sure AxCloudProvider is mounted and use useAxCloudContext() to get the client.')\n}\n","export type AnalyticsEventValue = string | number | boolean;\nexport type AnalyticsEventData = Record<string, AnalyticsEventValue>;\n\nexport interface AxCloudAnalyticsOptions {\n /** Site key configured in AxCloud, for example \"public-web\". */\n siteKey: string;\n /** Analytics is opt-in and disabled unless this is true. */\n enabled?: boolean;\n /** Allow local collection for explicit development tests. */\n trackLocalhost?: boolean;\n /** Override path normalization. Return null to skip a pageview. */\n normalizePath?: (pathname: string) => string | null;\n}\n\nexport interface AnalyticsPublicConfig {\n enabled: boolean;\n provider?: 'umami';\n websiteId?: string;\n scriptUrl?: string;\n hostUrl?: string;\n domains?: string[];\n autoTrack?: boolean;\n respectDoNotTrack?: boolean;\n excludeSearch?: boolean;\n excludeHash?: boolean;\n allowedEvents?: string[];\n}\n\nexport interface AnalyticsRuntime {\n enabled: boolean;\n ready: boolean;\n track: (eventName: string, data?: AnalyticsEventData) => boolean;\n trackPageView: (pathname?: string) => boolean;\n}\n\ninterface UmamiWindow extends Window {\n umami?: {\n track: (\n event?: string | { url?: string; title?: string },\n data?: AnalyticsEventData\n ) => unknown;\n };\n}\n\nconst EVENT_NAME_PATTERN = /^[a-z][a-z0-9_]{1,63}$/;\nconst PROPERTY_KEY_PATTERN = /^[a-z][a-z0-9_]{0,47}$/;\nconst SENSITIVE_PROPERTY_PATTERN =\n /(^|_)(auth0|email|name|password|query|search|secret|token|trace|user|userid)($|_)/;\nconst EMAIL_VALUE_PATTERN = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst OPAQUE_SEGMENT_PATTERNS = [\n /^[0-9a-f]{8}-[0-9a-f-]{27,}$/i,\n /^(org|user|section|document|content|poll|invitation|invite|trace|chan)[_-][a-z0-9_-]+$/i,\n /^[a-f0-9]{20,}$/i,\n /^[a-z0-9_-]{32,}$/i,\n];\n\nconst scriptLoads = new Map<string, Promise<void>>();\n\nexport function isLocalAnalyticsHostname(hostname: string): boolean {\n return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1';\n}\n\nexport function sanitizeAnalyticsPath(\n pathname: string,\n customNormalizer?: (pathname: string) => string | null\n): string | null {\n const rawPath = pathname.split(/[?#]/, 1)[0] || '/';\n const normalizedInput = rawPath.startsWith('/') ? rawPath : `/${rawPath}`;\n const custom = customNormalizer?.(normalizedInput);\n if (custom === null) return null;\n const path = custom ?? normalizedInput;\n const cleanPath = path.split(/[?#]/, 1)[0] || '/';\n\n const segments = cleanPath.split('/').map((segment) => {\n if (!segment) return segment;\n let decoded = segment;\n try {\n decoded = decodeURIComponent(segment);\n } catch {\n // Keep malformed path segments encoded and classify them below.\n }\n return OPAQUE_SEGMENT_PATTERNS.some((pattern) => pattern.test(decoded)) ? ':id' : segment;\n });\n\n return segments.join('/') || '/';\n}\n\nexport function sanitizeAnalyticsEventData(\n data: AnalyticsEventData | undefined\n): AnalyticsEventData | undefined {\n if (!data) return undefined;\n const sanitized: AnalyticsEventData = {};\n\n for (const [rawKey, rawValue] of Object.entries(data).slice(0, 20)) {\n const key = rawKey.trim().toLowerCase();\n if (!PROPERTY_KEY_PATTERN.test(key) || SENSITIVE_PROPERTY_PATTERN.test(key)) continue;\n\n if (typeof rawValue === 'string') {\n const value = rawValue.trim();\n if (!value || value.length > 100 || EMAIL_VALUE_PATTERN.test(value)) continue;\n sanitized[key] = value;\n continue;\n }\n if (typeof rawValue === 'number' && Number.isFinite(rawValue)) {\n sanitized[key] = rawValue;\n continue;\n }\n if (typeof rawValue === 'boolean') sanitized[key] = rawValue;\n }\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n\nexport function isAllowedAnalyticsEvent(\n eventName: string,\n allowedEvents: string[] | undefined\n): boolean {\n return EVENT_NAME_PATTERN.test(eventName) && Boolean(allowedEvents?.includes(eventName));\n}\n\nexport async function fetchAnalyticsPublicConfig(input: {\n apiUrl: string;\n orgId: string;\n siteKey: string;\n stage: string;\n hostname: string;\n signal?: AbortSignal;\n}): Promise<AnalyticsPublicConfig> {\n const baseUrl = input.apiUrl.replace(/\\/$/, '');\n const url = new URL(`${baseUrl}/analytics/public/config`);\n url.searchParams.set('orgId', input.orgId);\n url.searchParams.set('siteKey', input.siteKey);\n url.searchParams.set('stage', input.stage);\n url.searchParams.set('hostname', input.hostname);\n\n const response = await fetch(url, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n signal: input.signal,\n });\n if (!response.ok) throw new Error(`Analytics configuration returned ${response.status}`);\n return response.json() as Promise<AnalyticsPublicConfig>;\n}\n\nexport function loadAnalyticsScript(\n config: AnalyticsPublicConfig,\n doc: Document = document\n): Promise<void> {\n if (!config.enabled || !config.websiteId || !config.scriptUrl) {\n return Promise.reject(new Error('Analytics tracker configuration is incomplete'));\n }\n\n const key = `${config.scriptUrl}|${config.websiteId}`;\n const existingPromise = scriptLoads.get(key);\n if (existingPromise) return existingPromise;\n\n const existing = doc.querySelector<HTMLScriptElement>(\n `script[data-axcloud-analytics-site=\"${config.websiteId}\"]`\n );\n if (existing && (doc.defaultView as UmamiWindow | null)?.umami) {\n return Promise.resolve();\n }\n\n const promise = new Promise<void>((resolve, reject) => {\n const script = existing || doc.createElement('script');\n const onLoad = () => resolve();\n const onError = () => reject(new Error('Analytics tracker failed to load'));\n script.addEventListener('load', onLoad, { once: true });\n script.addEventListener('error', onError, { once: true });\n\n if (!existing) {\n script.src = config.scriptUrl as string;\n script.defer = true;\n script.dataset.websiteId = config.websiteId as string;\n script.dataset.axcloudAnalyticsSite = config.websiteId as string;\n script.dataset.autoTrack = String(config.autoTrack === true);\n if (config.hostUrl) script.dataset.hostUrl = config.hostUrl;\n if (config.domains?.length) script.dataset.domains = config.domains.join(',');\n if (config.respectDoNotTrack !== false) script.dataset.doNotTrack = 'true';\n if (config.excludeSearch !== false) script.dataset.excludeSearch = 'true';\n if (config.excludeHash !== false) script.dataset.excludeHash = 'true';\n doc.head.appendChild(script);\n }\n }).catch((error) => {\n scriptLoads.delete(key);\n throw error;\n });\n\n scriptLoads.set(key, promise);\n return promise;\n}\n\nexport function sendAnalyticsPageView(\n pathname: string,\n options: AxCloudAnalyticsOptions,\n targetWindow: Window = window\n): boolean {\n const path = sanitizeAnalyticsPath(pathname, options.normalizePath);\n const umami = (targetWindow as UmamiWindow).umami;\n if (!path || !umami) return false;\n umami.track({ url: path, title: targetWindow.document.title });\n return true;\n}\n\nexport function sendAnalyticsEvent(\n eventName: string,\n data: AnalyticsEventData | undefined,\n allowedEvents: string[] | undefined,\n targetWindow: Window = window\n): boolean {\n const umami = (targetWindow as UmamiWindow).umami;\n if (!umami || !isAllowedAnalyticsEvent(eventName, allowedEvents)) return false;\n umami.track(eventName, sanitizeAnalyticsEventData(data));\n return true;\n}\n","import type { ContentBlock, ContentItem } from './types'\n\nexport type ContentSlotValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | string[]\n | Record<string, unknown>\n | unknown[]\n\nexport type ContentSlotMap = Record<string, ContentSlotValue>\n\nexport interface ContentSlotImage {\n url: string\n alt?: string\n caption?: string\n}\n\nexport interface ContentSlotReader {\n fields: ContentSlotMap\n value<T = ContentSlotValue>(key: string, fallback?: T): ContentSlotValue | T\n text(key: string, fallback?: string): string\n /** @deprecated HTML is untrusted. Prefer text(), or unsafeHtml() with sanitization. */\n html(key: string, fallback?: string): string\n /** Returns untrusted CMS HTML. Sanitize it before inserting it into the DOM. */\n unsafeHtml(key: string, fallback?: string): string\n list(key: string, fallback?: string[]): string[]\n image(key: string, fallback?: ContentSlotImage): ContentSlotImage | undefined\n}\n\nconst SLOT_ATTRIBUTE_KEYS = ['slot', 'field', 'key', 'name']\n\nexport function getContentSlotMap(content?: Pick<ContentItem, 'fields' | 'blocks'> | null): ContentSlotMap {\n const fields: ContentSlotMap = isRecord(content?.fields) ? { ...(content?.fields as ContentSlotMap) } : {}\n\n for (const block of content?.blocks || []) {\n const slot = getBlockSlot(block)\n if (!slot) continue\n // Explicit structured fields are authoritative. Slotted blocks provide a\n // backwards-compatible fallback only.\n if (!(slot in fields)) fields[slot] = blockToSlotValue(block)\n }\n\n return fields\n}\n\nexport function createContentSlotReader(content?: Pick<ContentItem, 'fields' | 'blocks'> | null): ContentSlotReader {\n const fields = getContentSlotMap(content)\n\n const value = <T = ContentSlotValue>(key: string, fallback?: T): ContentSlotValue | T => {\n return key in fields ? fields[key] : (fallback as T)\n }\n\n const unsafeHtml = (key: string, fallback = '') => stringifySlotValue(value(key, fallback))\n\n return {\n fields,\n value,\n text: (key, fallback = '') => stringifySlotValue(value(key, fallback)),\n html: unsafeHtml,\n unsafeHtml,\n list: (key, fallback = []) => slotValueToList(value(key, fallback)),\n image: (key, fallback) => slotValueToImage(value(key, fallback)),\n }\n}\n\nfunction getBlockSlot(block: ContentBlock): string | undefined {\n const attributes = block.attributes || {}\n\n for (const key of SLOT_ATTRIBUTE_KEYS) {\n const value = attributes[key]\n if (typeof value === 'string' && value.trim()) return value.trim()\n }\n\n return undefined\n}\n\nfunction blockToSlotValue(block: ContentBlock): ContentSlotValue {\n if (block.attributes && 'value' in block.attributes) {\n return block.attributes.value as ContentSlotValue\n }\n\n if (block.type === 'list') {\n return Array.isArray(block.items) ? block.items : []\n }\n\n if (block.type === 'image' && block.url) {\n return {\n url: block.url,\n alt: block.alt,\n caption: block.caption,\n }\n }\n\n return block.content ?? ''\n}\n\nfunction stringifySlotValue(value: unknown): string {\n if (value === undefined || value === null) return ''\n if (typeof value === 'string') return value\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (Array.isArray(value)) return value.map((item) => stringifySlotValue(item)).filter(Boolean).join('\\n')\n return ''\n}\n\nfunction slotValueToList(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((item) => stringifySlotValue(item)).filter(Boolean)\n }\n\n if (typeof value === 'string') {\n return value\n .split(/\\r?\\n/)\n .map((item) => item.trim())\n .filter(Boolean)\n }\n\n return []\n}\n\nfunction slotValueToImage(value: unknown): ContentSlotImage | undefined {\n if (isRecord(value) && typeof value.url === 'string') {\n return {\n url: value.url,\n alt: typeof value.alt === 'string' ? value.alt : undefined,\n caption: typeof value.caption === 'string' ? value.caption : undefined,\n }\n }\n\n if (typeof value === 'string' && value) {\n return { url: value }\n }\n\n return undefined\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n","/**\n * AxCloud SDK Types\n *\n * Note: In the future, these types should be auto-generated from the OpenAPI spec.\n * For now, they are manually defined based on the AxCloud API.\n */\n\nimport type { AxCloudAnalyticsOptions } from './analytics';\n\n// Module types available in AxCloud\nexport type AxCloudModule =\n | 'content'\n | 'members'\n | 'sections'\n | 'training'\n | 'ai'\n | 'documents'\n | 'voting';\n\n// System roles (fixed, cannot be modified)\nexport type SystemRole = 'super_admin' | 'org_admin' | 'section_admin' | 'member' | 'viewer';\n\n// Legacy role names for backwards compatibility\nexport type UserRole = SystemRole | 'superadmin' | 'admin' | 'editor';\n\n// Base roles that custom roles can extend (excludes super_admin)\nexport type BaseRole = 'org_admin' | 'section_admin' | 'member' | 'viewer';\n\n/**\n * Custom role definition\n */\nexport interface CustomRole {\n role_id: string;\n org_id: string;\n name: string;\n description?: string;\n baseRole: BaseRole;\n permissions?: string[]; // Explicit permissions (optional)\n deniedPermissions?: string[]; // Permissions removed from base role\n effectivePermissions?: string[]; // Calculated: base - denied (from API)\n color?: string;\n icon?: string;\n hierarchy: number;\n isSystem: false;\n isActive: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n// Organization\nexport interface Organization {\n id: string;\n name: string;\n slug: string;\n description?: string;\n modules: AxCloudModule[];\n settings?: OrganizationSettings;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface OrganizationSettings {\n allowPublicSignup?: boolean;\n requireEmailVerification?: boolean;\n defaultUserRole?: UserRole;\n theme?: {\n primaryColor?: string;\n logo?: string;\n };\n}\n\n// Section (groups within organization)\nexport interface Section {\n id: string;\n organizationId: string;\n name: string;\n description?: string;\n slug: string;\n parentId?: string;\n permissions?: SectionPermissions;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SectionPermissions {\n canViewMembers?: boolean;\n canEditContent?: boolean;\n canManageMembers?: boolean;\n}\n\n// User\nexport interface User {\n id: string;\n email: string;\n name: string;\n firstName?: string;\n lastName?: string;\n /** Organization-specific title/position. Managed by organization administrators. */\n title?: string | null;\n phone?: string | null;\n address?: string | null;\n avatar?: string;\n organizationId: string;\n sectionId?: string;\n role: UserRole; // System role or custom role ID\n customRole?: CustomRole; // Full custom role object if using custom role\n permissions?: string[]; // Effective permissions (calculated)\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function userHasPermission(user: User, permission: string): boolean {\n // If user has explicit permissions array, use it\n if (user.permissions && user.permissions.length > 0) {\n return user.permissions.includes(permission);\n }\n\n // Fallback: check if user has a custom role with effective permissions\n if (user.customRole?.effectivePermissions) {\n return user.customRole.effectivePermissions.includes(permission);\n }\n\n return false;\n}\n\n/**\n * Check if user has any of the specified permissions\n */\nexport function userHasAnyPermission(user: User, permissions: string[]): boolean {\n return permissions.some((p) => userHasPermission(user, p));\n}\n\n/**\n * Check if user has all of the specified permissions\n */\nexport function userHasAllPermissions(user: User, permissions: string[]): boolean {\n return permissions.every((p) => userHasPermission(user, p));\n}\n\n// Membership info (extended user data)\nexport interface Membership {\n userId: string;\n organizationId: string;\n sectionId?: string;\n section?: Section;\n role: UserRole;\n /** Organization-specific title/position, separate from the access role. */\n title?: string | null;\n status: 'active' | 'pending' | 'suspended' | 'expired';\n joinedAt: string;\n expiresAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n// Content types\nexport interface ContentBlock {\n id: string;\n type: string;\n content?: string;\n url?: string;\n alt?: string;\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n items?: unknown[];\n language?: string;\n caption?: string;\n attributes?: Record<string, unknown>;\n ordered?: boolean;\n author?: string;\n}\n\nexport interface ContentTranslation {\n title: string;\n slug: string;\n description?: string;\n blocks: ContentBlock[];\n /** Structured website/template fields for this language. */\n fields?: Record<string, unknown>;\n metaTitle?: string;\n metaDescription?: string;\n keywords?: string[];\n}\n\nexport type ContentPublicationState = 'draft' | 'published' | 'archived';\nexport type ContentAudience = 'public' | 'internal' | 'members' | 'section';\n\nexport interface ContentItem {\n id: string;\n /** Present when a consumer needs to distinguish organizations outside its configured provider. */\n organizationId?: string;\n type: string;\n title: string;\n slug: string;\n /** Legacy string content. New AxCloud content uses `blocks`. */\n content?: string;\n description?: string;\n blocks?: ContentBlock[];\n /** Template identifier used by websites, e.g. \"home\" or \"landing\". */\n template?: string;\n /** Structured website/template fields. Frontends own layout and read these values by key. */\n fields?: Record<string, unknown>;\n excerpt?: string;\n author?: {\n id: string;\n name: string;\n };\n status?: ContentPublicationState;\n visibility?: ContentPublicationState;\n /** @deprecated Delivery access is derived from publication metadata and the verified visitor. */\n audience?: ContentAudience;\n sectionId?: string;\n tags?: string[];\n lang?: string;\n featuredImage?: string;\n metaTitle?: string;\n metaDescription?: string;\n keywords?: string[];\n translations?: Record<string, ContentTranslation>;\n currentLanguage?: string;\n availableLanguages?: string[];\n seo?: {\n canonical: string;\n hreflang: Array<{ lang: string; href: string }>;\n };\n publishedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface NewsItem extends ContentItem {\n type: 'news';\n featuredImage?: string;\n category?: string;\n tags?: string[];\n}\n\nexport interface Page extends ContentItem {\n type: 'page';\n template?: string;\n order?: number;\n}\n\n// API Response types\nexport interface ContentListResponse<T> {\n items: T[];\n count: number;\n total: number;\n page: number;\n pageSize: number;\n hasMore: boolean;\n nextCursor?: string;\n}\n\n/** @deprecated Use ContentListResponse. */\nexport type PaginatedResponse<T> = ContentListResponse<T>;\n\nexport type ContentCollectionType = 'news' | 'pages' | 'events';\nexport type ContentDetailType = 'news' | 'page' | 'event';\n\n// SDK Configuration\nexport interface AxCloudConfig {\n orgId: string;\n apiUrl: string;\n /** API stage - defaults to 'dev'. Use 'prod' for production. */\n stage: string;\n /** API key for public content endpoints (optional - required for public API access) */\n apiKey?: string;\n /** Optional privacy-safe web analytics collection. */\n analytics?: AxCloudAnalyticsOptions;\n auth0: {\n domain: string;\n clientId: string;\n redirectUri: string;\n audience?: string;\n /** Auth0 Organization ID. Use this for invite-only member sites. */\n organization?: string;\n /** Database connection name for password operations. Defaults to 'Username-Password-Authentication' */\n connection?: string;\n };\n}\n\n// Query options\nexport interface ContentQueryOptions {\n page?: number;\n pageSize?: number;\n /** @deprecated Delivery endpoints always return the published snapshot. */\n status?: ContentPublicationState;\n /** @deprecated Delivery endpoints always return the published snapshot. */\n visibility?: ContentPublicationState;\n audience?: ContentAudience;\n /** @deprecated Member section access is derived from the verified token. */\n sectionId?: string;\n search?: string;\n sortBy?: 'publishedAt' | 'createdAt' | 'updatedAt' | 'title';\n sortOrder?: 'asc' | 'desc';\n tags?: string[];\n /** Return the requested translation when content has language variants. */\n lang?: string;\n /** Force public endpoint even when authenticated (for public pages) */\n publicOnly?: boolean;\n}\n\n// ============================================\n// MEDIA & BRANDING TYPES\n// ============================================\n\n/**\n * Organization branding information\n */\nexport interface OrganizationBranding {\n organizationId: string;\n name: string;\n branding: {\n /** Signed URL for logo (expires in 1 hour) */\n logoUrl: string | null;\n /** Seconds until logoUrl expires */\n logoExpiresIn: number | null;\n /** Primary brand color (hex) */\n primaryColor: string | null;\n /** Secondary brand color (hex) */\n secondaryColor: string | null;\n };\n}\n\n/**\n * Signed URL response for media assets\n */\nexport interface SignedMediaUrl {\n /** Signed S3 URL (expires in 1 hour) */\n url: string;\n /** Seconds until URL expires */\n expiresIn: number;\n /** S3 bucket name */\n bucket: string;\n /** S3 object key */\n key: string;\n}\n\n/**\n * Media list item\n */\nexport interface MediaItem {\n /** File key (filename) */\n key: string;\n /** File size in bytes */\n size: number;\n /** Last modified timestamp */\n lastModified: string;\n}\n\n/**\n * Media list response\n */\nexport interface MediaListResponse {\n items: MediaItem[];\n count: number;\n bucket: string;\n prefix: string;\n}\n\n// ============================================\n// DOCUMENT TYPES\n// ============================================\n\nexport type DocumentStatus = 'draft' | 'published' | 'archived';\nexport type DocumentAudience = 'public' | 'members' | 'section' | 'internal';\nexport type DocumentSourceProvider = 'upload' | 'sharepoint';\n\n/**\n * Public document metadata exposed through the AxCloud SDK.\n */\nexport interface DocumentItem {\n document_id: string;\n org_id: string;\n title: string;\n description?: string;\n filename: string;\n mime_type: string;\n size: number;\n status: DocumentStatus;\n audience: DocumentAudience;\n tags: string[];\n source_provider: DocumentSourceProvider;\n created_at: string;\n updated_at: string;\n published_at?: string;\n /** Section IDs this document is scoped to (member endpoint only). */\n section_ids?: string[];\n /** Display name of the member who uploaded the document (member endpoint only). */\n uploaded_by_name?: string;\n /** Folder IDs this document belongs to (member endpoint only). */\n folder_ids?: string[];\n}\n\nexport interface DocumentListResponse {\n items: DocumentItem[];\n count: number;\n}\n\n/**\n * A document folder the current member is allowed to see.\n *\n * Members receive folders for their own sections plus org-level folders\n * (`section_id === null`). Returned by the member document-folders endpoint.\n */\nexport interface DocumentFolder {\n id: string;\n /** Section this folder belongs to, or `null` for org-level folders. */\n section_id: string | null;\n /** Parent folder for nesting, or `null` for a top-level folder. */\n parent_folder_id: string | null;\n name: string;\n sort_order: number;\n}\n\nexport interface DocumentFolderListResponse {\n folders: DocumentFolder[];\n}\n\nexport interface SignedDocumentUrl {\n documentId: string;\n url: string;\n expiresIn: number;\n filename: string;\n mimeType: string;\n}\n\nexport interface DocumentQueryOptions {\n search?: string;\n tags?: string[];\n limit?: number;\n /** Restrict results to documents belonging to this folder (member endpoint only). */\n folderId?: string;\n}\n","/**\n * AxCloud Forms Module\n *\n * Public functions for form submissions.\n * Requires organization API key for authentication.\n * Used by public websites like airene.io, theremoters.io, etc.\n */\n\n/**\n * Form submission request\n */\nexport interface FormSubmission {\n /** Organization API key (required for authentication) */\n apiKey: string\n /** Site domain (e.g., 'airene.io') */\n site: string\n /** Form type: 'waitlist', 'contact', or 'membership' */\n formType: 'waitlist' | 'contact' | 'membership'\n /** Email address */\n email: string\n /** Additional form data */\n data?: Record<string, unknown>\n}\n\n/**\n * Form submission response\n */\nexport interface FormSubmissionResponse {\n /** Whether the submission was successful */\n success: boolean\n /** User-friendly message */\n message: string\n /** Unique submission ID */\n submissionId: string\n}\n\n/**\n * Form submission stored in database\n */\nexport interface FormSubmissionRecord {\n submission_id: string\n org_id: string\n site: string\n form_type: 'waitlist' | 'contact' | 'membership'\n status: 'pending' | 'approved' | 'rejected' | 'converted'\n email: string\n data: Record<string, unknown>\n created_at: string\n updated_at: string\n reviewed_by?: string\n reviewed_at?: string\n notes?: string\n user_id?: string\n}\n\n/**\n * Form stats response from API\n */\nexport interface FormStatsResponse {\n stats: {\n total: number\n byStatus: Record<string, number>\n byType: Record<string, number>\n bySite: Record<string, number>\n recent: {\n today: number\n last7Days: number\n last30Days: number\n }\n }\n summary: {\n pending: number\n approved: number\n rejected: number\n conversionRate: string\n }\n period: {\n days: number\n from: string\n to: string\n }\n}\n\n/**\n * Paginated response for form submissions\n */\nexport interface FormSubmissionsResponse {\n items: FormSubmissionRecord[]\n total: number\n cursor?: string\n hasMore: boolean\n}\n\n/**\n * Submit a form to AxCloud\n *\n * Requires organization API key for authentication.\n *\n * @param apiUrl - AxCloud Forms API base URL (e.g., 'https://api.axcloud.app/forms/dev')\n * @param submission - Form submission data including API key\n * @returns Submission response with ID\n *\n * @example\n * ```tsx\n * import { submitForm } from '@axcloud/sdk'\n *\n * const handleSubmit = async (email: string) => {\n * const result = await submitForm(\n * 'https://api.axcloud.app/forms/dev',\n * {\n * apiKey: 'your-org-api-key',\n * site: 'airene.io',\n * formType: 'waitlist',\n * email,\n * data: { name: 'John Doe' }\n * }\n * )\n * console.log(result.message) // \"Thanks! We'll notify you when we launch.\"\n * }\n * ```\n */\nexport async function submitForm(\n apiUrl: string,\n submission: FormSubmission\n): Promise<FormSubmissionResponse> {\n const baseUrl = apiUrl.replace(/\\/$/, '')\n\n try {\n const response = await fetch(`${baseUrl}/public/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n api_key: submission.apiKey,\n site: submission.site,\n form_type: submission.formType,\n email: submission.email,\n data: submission.data || {}\n })\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Form submission failed' }))\n throw new Error(error.message || 'Form submission failed')\n }\n\n const result = await response.json()\n\n return {\n success: result.success,\n message: result.message,\n submissionId: result.submission_id\n }\n } catch (primaryError) {\n // Fallback: notify via email so signups aren't lost\n try {\n const notifyResponse = await fetch(`${baseUrl}/public/notify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n api_key: submission.apiKey,\n site: submission.site,\n form_type: submission.formType,\n email: submission.email\n })\n })\n\n if (notifyResponse.ok) {\n const result = await notifyResponse.json()\n return {\n success: true,\n message: result.message || \"Thanks! We'll notify you when we launch.\",\n submissionId: 'fallback'\n }\n }\n } catch {\n // Notify also failed — throw original error\n }\n\n throw primaryError\n }\n}\n\n/**\n * Create a form submission helper with pre-configured API URL, API key, and site\n *\n * @param config - Configuration with apiUrl, apiKey, and site\n * @returns Object with submit functions\n *\n * @example\n * ```tsx\n * import { createFormHelper } from '@axcloud/sdk'\n *\n * const forms = createFormHelper({\n * apiUrl: 'https://api.axcloud.app/forms/dev',\n * apiKey: 'your-org-api-key',\n * site: 'airene.io'\n * })\n *\n * // Now you can submit forms without repeating apiUrl, apiKey and site\n * const result = await forms.submit('waitlist', 'user@example.com')\n * ```\n */\nexport function createFormHelper(config: { apiUrl: string; apiKey: string; site: string }) {\n return {\n /**\n * Submit a waitlist form\n */\n submitWaitlist: (email: string, data?: Record<string, unknown>) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'waitlist',\n email,\n data\n }),\n\n /**\n * Submit a contact form\n */\n submitContact: (\n email: string,\n data: { name?: string; message: string; [key: string]: unknown }\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'contact',\n email,\n data\n }),\n\n /**\n * Submit a membership application\n */\n submitMembership: (\n email: string,\n data: {\n firstName?: string\n lastName?: string\n phone?: string\n [key: string]: unknown\n }\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'membership',\n email,\n data\n }),\n\n /**\n * Generic submit function\n */\n submit: (\n formType: 'waitlist' | 'contact' | 'membership',\n email: string,\n data?: Record<string, unknown>\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType,\n email,\n data\n })\n }\n}\n","/**\n * AxCloud Voting Module\n *\n * Functions for embedding voting/elections on a customer site (e.g. spf.se).\n *\n * Two channels:\n * - PUBLIC (code): no login — the personal one-time code is the credential.\n * Use {@link checkVotingCode}, {@link castVoteWithCode}, {@link getVotingReceipt}.\n * - AUTHED (Auth0): a logged-in member votes with their access token.\n * Use {@link getBallot}, {@link checkEligibility}, {@link castVote}.\n *\n * `votingApiUrl` is the Voting API base, e.g. 'https://api.axcloud.app/voting'.\n */\n\nexport interface BallotSeat {\n seat_id: string\n label_sv: string\n label_en?: string\n term?: string\n count: number\n order?: number\n}\n\nexport interface BallotCandidate {\n candidate_id: string\n name: string\n bio_sv?: string\n bio_en?: string\n presentation_media_id?: string\n photo_media_id?: string\n}\n\nexport interface BallotOption {\n option_id: string\n text: string\n description?: string\n}\n\nexport interface Ballot {\n poll_id: string\n poll_type: 'single_choice' | 'multiple_choice' | 'ranking' | 'election'\n title: string\n title_en?: string\n description?: string\n description_en?: string\n seats?: BallotSeat[]\n max_selections?: number\n min_selections?: number\n ends_at?: string\n options?: BallotOption[]\n candidates?: BallotCandidate[]\n}\n\nexport interface CodeEligibility {\n eligible: boolean\n has_voted: boolean\n reason?: string\n ballot?: Ballot\n}\n\nexport interface VoteReceipt {\n has_voted: boolean\n voted_at?: string\n selected_option_ids?: string[]\n selection?: string[]\n}\n\nexport interface CastVoteResult {\n success: boolean\n voted_at?: string\n message?: string\n}\n\nfunction baseOf(votingApiUrl: string): string {\n return votingApiUrl.replace(/\\/$/, '')\n}\n\n/** Unwrap the standard AxCloud { success, message, data } envelope. */\nasync function readJson<T>(response: Response): Promise<T> {\n const json = await response.json().catch(() => ({}))\n if (json && typeof json === 'object' && 'success' in json && 'data' in json) {\n return (json as { data: T }).data\n }\n return json as T\n}\n\nasync function ensureOk(response: Response): Promise<void> {\n if (!response.ok) {\n const body = await response.json().catch(() => ({}))\n const message = (body && (body.error || body.message)) || `Request failed with status ${response.status}`\n throw new Error(message)\n }\n}\n\n// ============================================\n// PUBLIC (code) channel — no authentication\n// ============================================\n\n/**\n * Validate a personal code and, if valid, return the ballot to render.\n */\nexport async function checkVotingCode(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; code: string }\n): Promise<CodeEligibility> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/eligibility`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: params.code })\n }\n )\n await ensureOk(response)\n return readJson<CodeEligibility>(response)\n}\n\n/**\n * Cast a vote using a personal code.\n */\nexport async function castVoteWithCode(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; code: string; selectedOptions: string[]; rankings?: Record<string, number> }\n): Promise<CastVoteResult> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/vote`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: params.code, selected_options: params.selectedOptions, rankings: params.rankings })\n }\n )\n await ensureOk(response)\n return readJson<CastVoteResult>(response)\n}\n\n/**\n * After voting, re-check a code to retrieve the voter's own selection.\n */\nexport async function getVotingReceipt(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; code: string }\n): Promise<VoteReceipt> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/receipt`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: params.code })\n }\n )\n await ensureOk(response)\n return readJson<VoteReceipt>(response)\n}\n\n// ============================================\n// AUTHED (Auth0) channel — logged-in member\n// ============================================\n\nfunction authHeaders(accessToken: string): Record<string, string> {\n return { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` }\n}\n\n/**\n * Load a ballot (poll + candidates) for a logged-in member.\n */\nexport async function getBallot(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; accessToken: string }\n): Promise<Ballot> {\n const base = `${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}`\n const pollResp = await fetch(base, { headers: authHeaders(params.accessToken) })\n await ensureOk(pollResp)\n const poll = await readJson<Ballot & { options?: BallotOption[] }>(pollResp)\n\n let candidates: BallotCandidate[] = []\n if (poll.poll_type === 'election') {\n const candResp = await fetch(`${base}/candidates`, { headers: authHeaders(params.accessToken) })\n await ensureOk(candResp)\n const data = await readJson<{ candidates: BallotCandidate[] }>(candResp)\n candidates = data.candidates || []\n }\n return { ...poll, candidates }\n}\n\n/**\n * Check whether the logged-in member is eligible to vote / has already voted.\n */\nexport async function checkEligibility(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; accessToken: string }\n): Promise<{ eligible: boolean; has_voted: boolean; reason?: string }> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}/eligibility`,\n { headers: authHeaders(params.accessToken) }\n )\n await ensureOk(response)\n return readJson(response)\n}\n\n/**\n * Cast a vote as a logged-in member.\n */\nexport async function castVote(\n votingApiUrl: string,\n params: {\n orgId: string\n pollId: string\n accessToken: string\n selectedOptions: string[]\n rankings?: Record<string, number>\n }\n): Promise<CastVoteResult> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}/vote`,\n {\n method: 'POST',\n headers: authHeaders(params.accessToken),\n body: JSON.stringify({ selected_options: params.selectedOptions, rankings: params.rankings })\n }\n )\n await ensureOk(response)\n return readJson<CastVoteResult>(response)\n}\n","import { createContext, useContext } from 'react';\nimport type { AxCloudClient } from '../core/client';\nimport type { AxCloudConfig } from '../core/types';\nimport type { AnalyticsRuntime } from '../core/analytics';\n\nexport interface AxCloudContextValue {\n config: AxCloudConfig;\n client: AxCloudClient;\n orgId: string;\n /** API stage (e.g., 'dev', 'prod') */\n stage: string;\n /** Whether using public API mode (API key, no auth) */\n isPublicMode: boolean;\n /** Auth0 has completed its initial session check. */\n isAuthLoading?: boolean;\n /** Whether the current browser session is authenticated. */\n isAuthenticated?: boolean;\n /** Auth0 subject used to isolate member-only query caches. */\n authSubject?: string;\n /** Remove identity-bound AxCloud query data before logout or account changes. */\n clearContentCache?: () => void;\n analytics: AnalyticsRuntime;\n}\n\nexport const AxCloudContext = createContext<AxCloudContextValue | null>(null);\n\nexport function useAxCloudContext(): AxCloudContextValue {\n const context = useContext(AxCloudContext);\n if (!context) {\n throw new Error('useAxCloudContext must be used within a AxCloudProvider');\n }\n return context;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { AxCloudConfig } from '../core/types';\nimport { useAxCloudContext } from './context';\nimport {\n fetchAnalyticsPublicConfig,\n isLocalAnalyticsHostname,\n loadAnalyticsScript,\n sendAnalyticsEvent,\n sendAnalyticsPageView,\n type AnalyticsEventData,\n type AnalyticsPublicConfig,\n type AnalyticsRuntime,\n} from '../core/analytics';\n\nconst NAVIGATION_EVENT = 'axcloud-sdk:navigation';\nlet historySubscriberCount = 0;\nlet originalPushState: History['pushState'] | null = null;\nlet originalReplaceState: History['replaceState'] | null = null;\n\nexport type AnalyticsRuntimeConfig = Pick<\n AxCloudConfig,\n 'analytics' | 'apiUrl' | 'orgId' | 'stage'\n>;\n\nfunction subscribeToNavigation(callback: () => void): () => void {\n if (typeof window === 'undefined') return () => undefined;\n\n if (historySubscriberCount === 0) {\n originalPushState = window.history.pushState.bind(window.history);\n originalReplaceState = window.history.replaceState.bind(window.history);\n window.history.pushState = ((...args: Parameters<History['pushState']>) => {\n originalPushState?.(...args);\n window.dispatchEvent(new Event(NAVIGATION_EVENT));\n }) as History['pushState'];\n window.history.replaceState = ((...args: Parameters<History['replaceState']>) => {\n originalReplaceState?.(...args);\n window.dispatchEvent(new Event(NAVIGATION_EVENT));\n }) as History['replaceState'];\n }\n historySubscriberCount += 1;\n window.addEventListener('popstate', callback);\n window.addEventListener(NAVIGATION_EVENT, callback);\n\n return () => {\n window.removeEventListener('popstate', callback);\n window.removeEventListener(NAVIGATION_EVENT, callback);\n historySubscriberCount = Math.max(0, historySubscriberCount - 1);\n if (historySubscriberCount === 0) {\n if (originalPushState) window.history.pushState = originalPushState;\n if (originalReplaceState) window.history.replaceState = originalReplaceState;\n originalPushState = null;\n originalReplaceState = null;\n }\n };\n}\n\nfunction doNotTrackEnabled(config: AnalyticsPublicConfig): boolean {\n if (config.respectDoNotTrack === false || typeof navigator === 'undefined') return false;\n return navigator.doNotTrack === '1';\n}\n\nexport function useAnalyticsRuntime(config: AnalyticsRuntimeConfig): AnalyticsRuntime {\n const [enabled, setEnabled] = useState(false);\n const [ready, setReady] = useState(false);\n const publicConfigRef = useRef<AnalyticsPublicConfig | null>(null);\n const optionsRef = useRef(config.analytics);\n optionsRef.current = config.analytics;\n\n const trackPageView = useCallback(\n (pathname?: string) => {\n if (!ready || !optionsRef.current || typeof window === 'undefined') return false;\n return sendAnalyticsPageView(pathname || window.location.pathname, optionsRef.current);\n },\n [ready]\n );\n\n const track = useCallback(\n (eventName: string, data?: AnalyticsEventData) => {\n if (!ready || typeof window === 'undefined') return false;\n return sendAnalyticsEvent(eventName, data, publicConfigRef.current?.allowedEvents);\n },\n [ready]\n );\n\n useEffect(() => {\n const options = config.analytics;\n setEnabled(false);\n setReady(false);\n publicConfigRef.current = null;\n\n if (!options?.enabled || !options.siteKey || typeof window === 'undefined') return undefined;\n if (isLocalAnalyticsHostname(window.location.hostname) && !options.trackLocalhost)\n return undefined;\n\n const controller = new AbortController();\n let cancelled = false;\n let unsubscribe: () => void = () => undefined;\n\n const initialize = async () => {\n try {\n const publicConfig = await fetchAnalyticsPublicConfig({\n apiUrl: config.apiUrl,\n orgId: config.orgId,\n siteKey: options.siteKey,\n stage: config.stage,\n hostname: window.location.hostname,\n signal: controller.signal,\n });\n if (cancelled || !publicConfig.enabled || doNotTrackEnabled(publicConfig)) return;\n\n publicConfigRef.current = publicConfig;\n setEnabled(true);\n await loadAnalyticsScript(publicConfig);\n if (cancelled) return;\n setReady(true);\n\n if (!publicConfig.autoTrack) {\n const trackCurrentPage = () => {\n sendAnalyticsPageView(window.location.pathname, options);\n };\n trackCurrentPage();\n unsubscribe = subscribeToNavigation(trackCurrentPage);\n }\n } catch (error) {\n if (!cancelled && !(error instanceof Error && error.name === 'AbortError')) {\n setEnabled(false);\n setReady(false);\n }\n }\n };\n\n void initialize();\n return () => {\n cancelled = true;\n controller.abort();\n unsubscribe();\n };\n }, [\n config.analytics?.enabled,\n config.analytics?.siteKey,\n config.analytics?.trackLocalhost,\n config.analytics?.normalizePath,\n config.apiUrl,\n config.orgId,\n config.stage,\n ]);\n\n return useMemo(\n () => ({ enabled, ready, track, trackPageView }),\n [enabled, ready, track, trackPageView]\n );\n}\n\nexport function useAnalytics(): AnalyticsRuntime {\n return useAxCloudContext().analytics;\n}\n","export interface Auth0InvitationAuthorizationParams {\n invitation?: string;\n}\n\nconst AUTH0_INVITATION_PATTERN = /^[A-Za-z0-9_-]{1,2048}$/;\n\n/**\n * Reads an Auth0 organization invitation from the current product URL.\n * The URL may add an invitation ticket, but it may never override the\n * organization that the host application configured.\n */\nexport function readAuth0InvitationAuthorizationParams(\n configuredOrganization?: string,\n search = typeof window === 'undefined' ? '' : window.location.search\n): Auth0InvitationAuthorizationParams {\n if (!configuredOrganization || !search) return {};\n\n const params = new URLSearchParams(search);\n const invitation = params.get('invitation')?.trim();\n const organization = params.get('organization')?.trim();\n\n if (\n organization !== configuredOrganization ||\n !invitation ||\n !AUTH0_INVITATION_PATTERN.test(invitation)\n ) {\n return {};\n }\n\n return { invitation };\n}\n","import React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Auth0Provider, useAuth0 } from '@auth0/auth0-react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { AxCloudContext } from './context';\nimport { AxCloudClient } from '../core/client';\nimport type { AxCloudConfig } from '../core/types';\nimport type { AxCloudAnalyticsOptions } from '../core/analytics';\nimport { useAnalyticsRuntime } from './analytics';\nimport { isAxCloudError } from '../core/errors';\nimport { readAuth0InvitationAuthorizationParams } from './auth/auth0Invitation';\n\nexport interface AxCloudProviderProps {\n children: React.ReactNode;\n orgId: string;\n apiUrl: string;\n /** API stage - defaults to 'dev'. Use 'prod' for production. */\n stage?: string;\n /** API key for public content endpoints */\n apiKey?: string;\n /** Optional privacy-safe analytics collection through AxCloud. */\n analytics?: AxCloudAnalyticsOptions;\n auth0: {\n domain: string;\n clientId: string;\n redirectUri: string;\n audience?: string;\n /** Auth0 Organization ID. Use this for invite-only member sites. */\n organization?: string;\n /** Database connection name for password operations. Defaults to 'Username-Password-Authentication' */\n connection?: string;\n };\n queryClient?: QueryClient;\n /** Default request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\nfunction createDefaultQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60,\n gcTime: 1000 * 60 * 30,\n retry: (failureCount, error) => {\n if (isAxCloudError(error) && error.status >= 400 && error.status < 500) {\n return false;\n }\n return failureCount < 2;\n },\n refetchOnWindowFocus: true,\n },\n },\n });\n}\n\n// A caller may intentionally reuse a QueryClient across provider remounts.\n// Remember the complete identity/configuration that owns its AxCloud namespace\n// so a new provider can gate and purge stale data before mounting its children.\nconst queryClientAxCloudOwners = new WeakMap<QueryClient, string>();\n\nfunction createQueryClientOwnerSignature(\n config: AxCloudConfig,\n subject: string | null\n): string {\n return JSON.stringify([\n subject === null ? 'public' : 'authenticated',\n subject,\n config.orgId,\n config.stage,\n config.apiUrl,\n config.apiKey ?? null,\n config.auth0.domain,\n config.auth0.clientId,\n config.auth0.audience ?? null,\n config.auth0.organization ?? null,\n config.auth0.connection ?? null,\n ]);\n}\n\n/**\n * Inner provider that has access to Auth0 context\n */\nfunction AxCloudInnerProvider({\n children,\n config,\n queryClient,\n timeout,\n}: {\n children: React.ReactNode;\n config: AxCloudConfig;\n queryClient: QueryClient;\n timeout?: number;\n}) {\n const { getAccessTokenSilently, isAuthenticated, isLoading, user } = useAuth0();\n const analytics = useAnalyticsRuntime(config);\n const [, setOwnerGeneration] = useState(0);\n const currentSubject = isLoading\n ? undefined\n : isAuthenticated\n ? user?.sub\n : null;\n const currentOwnerSignature =\n currentSubject === undefined\n ? undefined\n : createQueryClientOwnerSignature(config, currentSubject);\n const hasKnownOwner = queryClientAxCloudOwners.has(queryClient);\n const ownerNeedsActivation =\n currentOwnerSignature !== undefined &&\n (!hasKnownOwner || queryClientAxCloudOwners.get(queryClient) !== currentOwnerSignature);\n\n const clearContentCache = useCallback(() => {\n // Several SDK surfaces contain identity-bound data (content, documents,\n // section members, linked accounts and the current profile). Clearing the\n // AxCloud namespace is safer than relying on every future hook to appear in\n // a hand-maintained logout list. Public data is refetched after the switch.\n queryClient.removeQueries({ queryKey: ['axcloud'] });\n }, [queryClient]);\n\n useLayoutEffect(() => {\n // An authenticated session without a subject is not safe to render as a\n // member identity. Keep the tree gated until Auth0 supplies the subject.\n if (currentOwnerSignature === undefined || !ownerNeedsActivation) return;\n\n // Unknown clients may already contain AxCloud data populated outside this\n // provider. Treat them exactly like a mismatched known owner: purge first,\n // then record ownership and only afterwards allow children to mount.\n clearContentCache();\n queryClientAxCloudOwners.set(queryClient, currentOwnerSignature);\n setOwnerGeneration((generation) => generation + 1);\n }, [clearContentCache, currentOwnerSignature, ownerNeedsActivation, queryClient]);\n\n // Use ref to store the token getter so it can be updated without recreating the client\n const tokenGetterRef = useRef<() => Promise<string | undefined>>(async () => undefined);\n\n // Update the ref when auth state changes\n tokenGetterRef.current = isAuthenticated\n ? async () => {\n try {\n return await getAccessTokenSilently();\n } catch {\n return undefined;\n }\n }\n : async () => undefined;\n\n // Create the API client with a stable token getter that uses the ref\n // This avoids recreating the client on auth changes while still getting fresh tokens\n const client = useMemo(() => {\n return new AxCloudClient({\n baseUrl: config.apiUrl,\n apiKey: config.apiKey,\n timeout,\n // Use a wrapper function that delegates to the ref\n // This ensures the client always uses the current auth state\n getAccessToken: async () => {\n if (tokenGetterRef.current) {\n return tokenGetterRef.current();\n }\n return undefined;\n },\n });\n }, [config.apiUrl, config.apiKey, timeout]);\n\n const contextValue = useMemo(\n () => ({\n config,\n client,\n orgId: config.orgId,\n stage: config.stage,\n isPublicMode: !isAuthenticated,\n isAuthLoading: isLoading,\n isAuthenticated,\n authSubject: isAuthenticated ? user?.sub : undefined,\n clearContentCache,\n analytics,\n }),\n [config, client, isAuthenticated, isLoading, user?.sub, clearContentCache, analytics]\n );\n\n const identityReady = currentOwnerSignature !== undefined && !ownerNeedsActivation;\n\n return (\n <AxCloudContext.Provider value={contextValue}>\n {identityReady ? children : null}\n </AxCloudContext.Provider>\n );\n}\n\n/**\n * AxCloudProvider - Main provider for the SDK\n *\n * Combines Auth0Provider, QueryClientProvider, and AxCloud context.\n *\n * @example\n * ```tsx\n * <AxCloudProvider\n * orgId=\"spf\"\n * apiUrl=\"https://api.axcloud.app\"\n * apiKey=\"your-api-key\" // Required for public content access\n * auth0={{\n * domain: \"auth.axcloud.app\",\n * clientId: \"xxx\",\n * redirectUri: window.location.origin,\n * organization: \"org_abc123\" // Optional Auth0 Organization ID for invite-only member sites\n * }}\n * >\n * <App />\n * </AxCloudProvider>\n * ```\n */\nexport function AxCloudProvider({\n children,\n orgId,\n apiUrl,\n stage = 'dev',\n apiKey,\n analytics,\n auth0,\n queryClient: providedQueryClient,\n timeout,\n}: AxCloudProviderProps) {\n const [ownedQueryClient] = useState(createDefaultQueryClient);\n const queryClient = providedQueryClient || ownedQueryClient;\n const invitationAuthorizationParams = readAuth0InvitationAuthorizationParams(auth0.organization);\n const config: AxCloudConfig = useMemo(\n () => ({\n orgId,\n apiUrl,\n stage,\n apiKey,\n analytics,\n auth0,\n }),\n [orgId, apiUrl, stage, apiKey, analytics, auth0]\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <Auth0Provider\n domain={auth0.domain}\n clientId={auth0.clientId}\n authorizationParams={{\n redirect_uri: auth0.redirectUri,\n audience: auth0.audience,\n ...(auth0.organization ? { organization: auth0.organization } : {}),\n ...invitationAuthorizationParams,\n }}\n >\n <AxCloudInnerProvider config={config} queryClient={queryClient} timeout={timeout}>\n {children}\n </AxCloudInnerProvider>\n </Auth0Provider>\n </QueryClientProvider>\n );\n}\n","import { useCallback } from 'react';\nimport { useAuth0, User as Auth0User } from '@auth0/auth0-react';\nimport { useAxCloudContext } from '../context';\nimport { isAxCloudError } from '../../core/errors';\nimport { readAuth0InvitationAuthorizationParams } from './auth0Invitation';\n\nexport interface AuthUser {\n id: string;\n email: string;\n name: string;\n avatar?: string;\n /** Auth0's authoritative email verification claim. */\n emailVerified?: boolean;\n}\n\nexport interface EmailVerificationResult {\n success: boolean;\n status: 'sent' | 'already_verified' | 'rate_limited' | 'failed';\n message: string;\n retryAfterSeconds?: number;\n}\n\nexport interface UseAuthReturn {\n isAuthenticated: boolean;\n isLoading: boolean;\n error: Error | undefined;\n user: AuthUser | null;\n /** True only when Auth0 explicitly reports email_verified=false. */\n needsEmailVerification: boolean;\n login: (options?: { returnTo?: string }) => Promise<void>;\n logout: (options?: { returnTo?: string }) => Promise<void>;\n getAccessToken: () => Promise<string | undefined>;\n getAuth0Client: () => Auth0ClientState;\n /** Refresh Auth0 tokens/profile and return the latest email verification state. */\n refreshUser: () => Promise<boolean>;\n /** Send a branded verification email that returns to the current product site. */\n requestEmailVerification: (options?: { returnTo?: string }) => Promise<EmailVerificationResult>;\n /** Request a password reset email for the current user or specified email */\n requestPasswordReset: (email?: string) => Promise<{ success: boolean; message: string }>;\n}\n\nexport interface Auth0ClientState {\n loginWithRedirect: ReturnType<typeof useAuth0>['loginWithRedirect'];\n logout: ReturnType<typeof useAuth0>['logout'];\n getAccessTokenSilently: ReturnType<typeof useAuth0>['getAccessTokenSilently'];\n getIdTokenClaims: ReturnType<typeof useAuth0>['getIdTokenClaims'];\n user: Auth0User | undefined;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: Error | undefined;\n}\n\n/**\n * useAuth - Authentication hook with simplified API and escape hatch\n *\n * Provides easy login/logout methods while allowing access to the\n * underlying Auth0 client for advanced use cases.\n *\n * @example\n * ```tsx\n * function Header() {\n * const { isAuthenticated, login, logout, user } = useAuth()\n *\n * return isAuthenticated ? (\n * <button onClick={logout}>Log out</button>\n * ) : (\n * <button onClick={login}>Log in</button>\n * )\n * }\n * ```\n *\n * @example\n * // Advanced: Get access token for manual API calls\n * ```tsx\n * function MyComponent() {\n * const { getAccessToken } = useAuth()\n *\n * const fetchData = async () => {\n * const token = await getAccessToken()\n * // Use token for custom API calls\n * }\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { config, client, clearContentCache } = useAxCloudContext();\n const {\n isAuthenticated,\n isLoading,\n user: auth0User,\n error,\n loginWithRedirect,\n logout: auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n } = useAuth0();\n\n /**\n * Trigger login via Auth0 Universal Login\n */\n const login = useCallback(\n (options?: { returnTo?: string }) => {\n const invitationAuthorizationParams = readAuth0InvitationAuthorizationParams(\n config.auth0.organization\n );\n return loginWithRedirect({\n appState: {\n returnTo: options?.returnTo || window.location.pathname,\n },\n ...(config.auth0.organization\n ? {\n authorizationParams: {\n organization: config.auth0.organization,\n ...invitationAuthorizationParams,\n },\n }\n : {}),\n });\n },\n [config.auth0.organization, loginWithRedirect]\n );\n\n /**\n * Log out and optionally redirect\n */\n const logout = useCallback(\n (options?: { returnTo?: string }) => {\n // Identity-bound member content must disappear before Auth0 redirects.\n clearContentCache?.();\n return auth0Logout({\n logoutParams: {\n returnTo: options?.returnTo || window.location.origin,\n },\n });\n },\n [auth0Logout, clearContentCache]\n );\n\n /**\n * Get the current access token (for manual API calls)\n */\n const getAccessToken = useCallback(async () => {\n try {\n return await getAccessTokenSilently();\n } catch {\n return undefined;\n }\n }, [getAccessTokenSilently]);\n\n /**\n * Force Auth0 to refresh its cached ID token and user profile. This is used\n * after the user returns from the email verification link.\n */\n const refreshUser = useCallback(async (): Promise<boolean> => {\n await getAccessTokenSilently({ cacheMode: 'off' });\n const claims = await getIdTokenClaims();\n return claims?.email_verified === true;\n }, [getAccessTokenSilently, getIdTokenClaims]);\n\n /**\n * Request a verification email through AxCloud's authenticated email API.\n * The backend resolves the recipient and organization from the access token;\n * callers can only influence a return URL on the configured organization site.\n */\n const requestEmailVerification = useCallback(\n async (options?: { returnTo?: string }): Promise<EmailVerificationResult> => {\n if (!isAuthenticated || !auth0User) {\n return {\n success: false,\n status: 'failed',\n message: 'You must be signed in to verify your email.',\n };\n }\n\n if (auth0User.email_verified === true) {\n return {\n success: true,\n status: 'already_verified',\n message: 'Your email address is already verified.',\n };\n }\n\n try {\n const response = await client.post<{\n data?: {\n status?: 'sent' | 'already_verified';\n message?: string;\n retry_after_seconds?: number;\n };\n }>('/email/identity/verification-email', {\n return_to: options?.returnTo || window.location.href,\n });\n const data = response.data || {};\n\n return {\n success: true,\n status: data.status || 'sent',\n message: data.message || 'A verification email has been sent.',\n ...(data.retry_after_seconds !== undefined\n ? { retryAfterSeconds: data.retry_after_seconds }\n : {}),\n };\n } catch (requestError) {\n if (isAxCloudError(requestError) && requestError.status === 429) {\n const responseDetails = requestError.details?.details;\n const retryAfterSeconds = Number(\n responseDetails && typeof responseDetails === 'object'\n ? (responseDetails as Record<string, unknown>).retry_after_seconds\n : undefined\n );\n return {\n success: false,\n status: 'rate_limited',\n message: 'Please wait before requesting another verification email.',\n ...(Number.isFinite(retryAfterSeconds) ? { retryAfterSeconds } : {}),\n };\n }\n\n return {\n success: false,\n status: 'failed',\n message: 'Failed to send the verification email. Please try again.',\n };\n }\n },\n [auth0User, client, isAuthenticated]\n );\n\n /**\n * Get the full Auth0 client for advanced use cases (escape hatch)\n */\n const getAuth0Client = useCallback(() => {\n return {\n loginWithRedirect,\n logout: auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n user: auth0User,\n isAuthenticated,\n isLoading,\n error,\n };\n }, [\n loginWithRedirect,\n auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n auth0User,\n isAuthenticated,\n isLoading,\n error,\n ]);\n\n /**\n * Request a password reset email\n * Can be used by logged-in users or on a \"forgot password\" page\n */\n const requestPasswordReset = useCallback(\n async (email?: string): Promise<{ success: boolean; message: string }> => {\n const targetEmail = email || auth0User?.email;\n\n if (!targetEmail) {\n return {\n success: false,\n message: 'Email address is required',\n };\n }\n\n try {\n // Call Auth0's change_password endpoint directly\n const auth0Domain = config.auth0.domain;\n const clientId = config.auth0.clientId;\n const connection = config.auth0.connection || 'Username-Password-Authentication';\n\n const response = await fetch(`https://${auth0Domain}/dbconnections/change_password`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n client_id: clientId,\n email: targetEmail.toLowerCase(),\n connection,\n }),\n });\n\n if (response.ok) {\n return {\n success: true,\n message: 'If an account exists with this email, a password reset link has been sent.',\n };\n }\n\n // Auth0 returns 200 even for non-existent emails for security\n return {\n success: true,\n message: 'If an account exists with this email, a password reset link has been sent.',\n };\n } catch {\n return {\n success: false,\n message: 'Failed to send password reset email. Please try again.',\n };\n }\n },\n [auth0User?.email, config.auth0.domain, config.auth0.clientId]\n );\n\n return {\n // Simple, abstracted API\n isAuthenticated,\n isLoading,\n error,\n user: auth0User\n ? {\n id: auth0User.sub || '',\n email: auth0User.email || '',\n name: auth0User.name || '',\n avatar: auth0User.picture,\n ...(typeof auth0User.email_verified === 'boolean'\n ? { emailVerified: auth0User.email_verified }\n : {}),\n }\n : null,\n needsEmailVerification: isAuthenticated && auth0User?.email_verified === false,\n login,\n logout,\n\n // Escape hatch for advanced use cases\n getAccessToken,\n getAuth0Client,\n refreshUser,\n requestEmailVerification,\n\n // Password management\n requestPasswordReset,\n };\n}\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useAuth0 } from '@auth0/auth0-react';\nimport { useAxCloudContext } from '../context';\nimport type { User } from '../../core/types';\n\nexport interface UserOrganizationSection {\n id: string;\n name: string;\n role: string;\n}\n\n// Normalized organization membership exposed by the SDK.\nexport interface UserOrganizationMembership {\n role: string;\n roles: string[];\n title: string | null;\n status: string | null;\n joinedAt: string | null;\n memberSince: string | null;\n sectionId: string | null;\n sectionIds: string[];\n sections: UserOrganizationSection[];\n}\n\nexport interface UserApiResponse extends User {\n allOrgIds: string[];\n organizationMemberships: Record<string, UserOrganizationMembership>;\n effectiveOrganizationId: string | null;\n isSuperAdmin: boolean;\n}\n\ntype RawCurrentUserResponse = Record<string, unknown>;\n\nexport interface UpdateMyProfileInput {\n firstName?: string;\n lastName?: string;\n phone?: string | null;\n address?: string | null;\n}\n\nexport interface MyProfileResponse {\n user_id: string;\n email: string;\n given_name: string;\n family_name: string;\n name: string;\n phone_number: string | null;\n phone: string | null;\n address: string | null;\n location: string | null;\n updated_at: string;\n}\n\nconst currentUserQueryKey = (stage: string, orgId: string, subject?: string) =>\n ['axcloud', 'user', 'me', stage, orgId, subject] as const;\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value : null;\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return Array.from(new Set(value.map(asString).filter((item): item is string => item !== null)));\n}\n\nfunction normalizeMembershipSections(rawMembership: Record<string, unknown>): UserOrganizationSection[] {\n const sections = new Map<string, UserOrganizationSection>();\n\n const addSection = (idValue: unknown, nameValue?: unknown, roleValue?: unknown) => {\n const id = asString(idValue);\n if (!id) return;\n\n const existing = sections.get(id);\n sections.set(id, {\n id,\n name: asString(nameValue) || existing?.name || id,\n role: asString(roleValue) || existing?.role || 'member',\n });\n };\n\n const directSections = rawMembership.sections;\n if (Array.isArray(directSections)) {\n for (const rawSection of directSections) {\n if (typeof rawSection === 'string') {\n addSection(rawSection);\n continue;\n }\n const section = asRecord(rawSection);\n addSection(\n section.id ?? section.sectionId ?? section.section_id,\n section.name ?? section.sectionName ?? section.section_name,\n section.role\n );\n }\n }\n\n const sectionMemberships = asRecord(\n rawMembership.sectionMemberships ?? rawMembership.section_memberships\n );\n for (const [sectionId, rawSectionMembership] of Object.entries(sectionMemberships)) {\n const sectionMembership = asRecord(rawSectionMembership);\n addSection(\n sectionId,\n sectionMembership.name ?? sectionMembership.sectionName ?? sectionMembership.section_name,\n sectionMembership.role\n );\n }\n\n for (const sectionId of asStringArray(rawMembership.sectionIds ?? rawMembership.section_ids)) {\n addSection(sectionId);\n }\n\n const primarySectionId = asString(rawMembership.sectionId ?? rawMembership.section_id);\n if (primarySectionId) addSection(primarySectionId);\n\n const normalized = Array.from(sections.values());\n if (!primarySectionId) return normalized;\n\n return normalized.sort((left, right) => {\n if (left.id === primarySectionId) return -1;\n if (right.id === primarySectionId) return 1;\n return 0;\n });\n}\n\nfunction normalizeMembership(rawValue: unknown): UserOrganizationMembership {\n const raw = asRecord(rawValue);\n const role = asString(raw.role) || 'member';\n const roles = asStringArray(raw.roles);\n const sections = normalizeMembershipSections(raw);\n const sectionId = asString(raw.sectionId ?? raw.section_id) || sections[0]?.id || null;\n const joinedAt = asString(raw.joinedAt ?? raw.joined_at);\n\n return {\n role,\n roles: roles.length > 0 ? roles : [role],\n title: asString(raw.title),\n status: asString(raw.status),\n joinedAt,\n memberSince: asString(raw.memberSince ?? raw.member_since) || joinedAt,\n sectionId,\n sectionIds: sections.map((section) => section.id),\n sections,\n };\n}\n\n/** Normalize the snake_case API payload into the SDK's camelCase user contract. */\nexport function normalizeCurrentUserResponse(\n raw: RawCurrentUserResponse,\n configuredOrgId: string\n): UserApiResponse {\n const rawMemberships = asRecord(\n raw.organizationMemberships ?? raw.organization_memberships\n );\n const organizationMemberships = Object.fromEntries(\n Object.entries(rawMemberships).map(([organizationId, membership]) => [\n organizationId,\n normalizeMembership(membership),\n ])\n );\n const allOrgIds = Array.from(\n new Set([\n ...asStringArray(raw.allOrgIds ?? raw.all_org_ids),\n ...Object.keys(organizationMemberships),\n ])\n );\n const effectiveOrganizationId = asString(\n raw.effectiveOrganizationId ?? raw.effective_org_id\n );\n const primaryOrganizationId = asString(\n raw.organizationId ?? raw.primary_org_id ?? raw.org_id\n );\n const organizationId =\n effectiveOrganizationId ||\n primaryOrganizationId ||\n (organizationMemberships[configuredOrgId] ? configuredOrgId : null) ||\n allOrgIds[0] ||\n configuredOrgId;\n const configuredMembership = organizationMemberships[configuredOrgId];\n const firstName = asString(raw.firstName ?? raw.first_name ?? raw.given_name) || '';\n const lastName = asString(raw.lastName ?? raw.last_name ?? raw.family_name) || '';\n const email = asString(raw.email) || '';\n const createdAt = asString(raw.createdAt ?? raw.created_at) || '';\n const updatedAt = asString(raw.updatedAt ?? raw.updated_at) || createdAt;\n const role = (configuredMembership?.role || asString(raw.role) || 'member') as User['role'];\n const sectionId = configuredMembership?.sectionId || asString(raw.sectionId ?? raw.section_id);\n const permissions = asStringArray(raw.permissions ?? raw.effective_permissions);\n const metadata = asRecord(raw.metadata);\n\n return {\n id: asString(raw.id ?? raw.userId ?? raw.user_id ?? raw.sub) || '',\n email,\n name:\n asString(raw.name) ||\n [firstName, lastName].filter(Boolean).join(' ') ||\n email,\n firstName,\n lastName,\n title: configuredMembership?.title ?? asString(raw.title),\n phone: asString(raw.phone ?? raw.phoneNumber ?? raw.phone_number),\n address: asString(raw.address ?? raw.location),\n avatar: asString(raw.avatar ?? raw.avatarUrl ?? raw.avatar_url ?? raw.picture) || undefined,\n organizationId,\n ...(sectionId ? { sectionId } : {}),\n role,\n permissions,\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n createdAt,\n updatedAt,\n allOrgIds,\n organizationMemberships,\n effectiveOrganizationId,\n isSuperAdmin:\n raw.isSuperAdmin === true ||\n raw.is_super_admin === true ||\n asString(raw.global_role) === 'super_admin' ||\n role === 'super_admin',\n };\n}\n\n/**\n * useUser - Fetch the current authenticated user from AxCloud\n *\n * Returns the full user profile including organization membership,\n * role, section, and permissions.\n *\n * Also validates that the user has access to the configured organization.\n *\n * @example\n * ```tsx\n * function Profile() {\n * const { user, isLoading, isError, hasOrgAccess } = useUser()\n *\n * if (isLoading) return <Spinner />\n * if (!hasOrgAccess) return <AccessDenied />\n * if (!user) return <LoginPrompt />\n *\n * return (\n * <div>\n * <h1>Welcome, {user.name}!</h1>\n * <p>Role: {user.role}</p>\n * <p>Organization: {user.organizationId}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useUser() {\n const { isAuthenticated, isLoading: isAuthLoading, user: auth0User } = useAuth0();\n const { client, stage, orgId } = useAxCloudContext();\n const queryKey = currentUserQueryKey(stage, orgId, auth0User?.sub);\n\n const query = useQuery<UserApiResponse>({\n queryKey,\n queryFn: async () => {\n // Stage is encoded by the configured API domain, not in the route path.\n const response = await client.get<RawCurrentUserResponse>('/api/users/me');\n return normalizeCurrentUserResponse(response, orgId);\n },\n enabled: isAuthenticated && !isAuthLoading,\n staleTime: 1000 * 60 * 5, // 5 minutes\n });\n\n // Check if user has access to the configured organization\n const userData = query.data;\n const userOrgIds = userData?.allOrgIds ?? [];\n const isSuperAdmin = userData?.isSuperAdmin === true;\n\n // Get user's role in this specific organization\n const orgMembership = userData?.organizationMemberships?.[orgId];\n const hasOrgAccess =\n userOrgIds.includes(orgId) &&\n orgMembership?.status?.trim().toLowerCase() === 'active';\n const roleInOrg = (orgMembership?.role as User['role'] | undefined) ?? null;\n const sectionId = orgMembership?.sectionId ?? userData?.sectionId ?? null;\n const sections = orgMembership?.sections?.length\n ? orgMembership.sections\n : sectionId\n ? [{ id: sectionId, name: sectionId, role: roleInOrg ?? 'member' }]\n : [];\n const section = sections.find((item) => item.id === sectionId) ?? sections[0] ?? null;\n const memberSince = orgMembership?.memberSince ?? null;\n\n return {\n user: query.data ?? null,\n isLoading: isAuthLoading || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Organization access\n hasOrgAccess,\n roleInOrg,\n organizationMembership: orgMembership ?? null,\n title: orgMembership?.title ?? query.data?.title ?? null,\n section,\n sections,\n sectionIds: orgMembership?.sectionIds?.length\n ? orgMembership.sectionIds\n : sectionId\n ? [sectionId]\n : [],\n joinedAt: orgMembership?.joinedAt ?? null,\n memberSince,\n\n // Convenience properties\n isAuthenticated,\n role: roleInOrg ?? query.data?.role ?? null,\n organizationId: query.data?.organizationId ?? null,\n sectionId,\n permissions: query.data?.permissions ?? [],\n isSuperAdmin,\n };\n}\n\n/**\n * Updates the authenticated user's self-service profile fields.\n * Organization title, email, roles and membership data are intentionally not writable here.\n */\nexport function useUpdateMyProfile() {\n const { client, stage } = useAxCloudContext();\n const queryClient = useQueryClient();\n\n return useMutation<MyProfileResponse, Error, UpdateMyProfileInput>({\n mutationFn: (updates) => client.patch<MyProfileResponse>('/api/users/me/profile', updates),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: ['axcloud', 'user', 'me', stage],\n exact: false,\n });\n },\n });\n}\n","import { useCallback } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type { Organization, AxCloudModule } from '../../core/types'\n\n/**\n * Public organization response from /content/public/{orgId}/org\n */\ninterface PublicOrganization {\n org_id: string\n name: string\n description?: string\n branding?: {\n logo?: string\n primaryColor?: string\n secondaryColor?: string\n }\n modules?: string[]\n contact?: {\n email?: string\n phone?: string\n website?: string\n }\n social?: {\n facebook?: string\n twitter?: string\n linkedin?: string\n instagram?: string\n }\n}\n\n/**\n * useOrg - Fetch organization info and check module availability\n *\n * Automatically uses the appropriate endpoint:\n * - With API key (public): `/content/public/{orgId}/org`\n * - With JWT auth: `/orgs/api/organizations/{orgId}`\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { org, hasModule, isLoading } = useOrg()\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <div>\n * <h1>{org.name}</h1>\n * {org.branding?.logo && <img src={org.branding.logo} alt={org.name} />}\n * {hasModule('training') && <TrainingSection />}\n * {hasModule('ai') && <AIChatWidget />}\n * </div>\n * )\n * }\n * ```\n */\nexport function useOrg() {\n const { client, orgId, stage, isPublicMode } = useAxCloudContext()\n\n // Determine if we should use public endpoint (API key mode or not authenticated)\n const usePublicEndpoint = isPublicMode\n\n const query = useQuery<Organization | PublicOrganization>({\n queryKey: ['axcloud', 'organization', orgId, stage, usePublicEndpoint],\n queryFn: async () => {\n if (usePublicEndpoint) {\n // Public API: /content/public/{orgId}/org (requires x-api-key)\n return client.get<PublicOrganization>(`/content/public/${orgId}/org`)\n } else {\n // Organizations service: /orgs/api/organizations/{orgId}\n return client.get<Organization>(`/orgs/api/organizations/${orgId}`)\n }\n },\n staleTime: 1000 * 60 * 10, // 10 minutes (org data rarely changes)\n })\n\n // Normalize the response to handle both formats\n const orgData = query.data\n const normalizedOrg = orgData ? {\n id: (orgData as Organization).id || (orgData as PublicOrganization).org_id,\n org_id: (orgData as PublicOrganization).org_id || (orgData as Organization).id,\n name: orgData.name,\n description: orgData.description,\n branding: (orgData as PublicOrganization).branding || (orgData as Organization).settings?.theme,\n modules: orgData.modules || [],\n contact: (orgData as PublicOrganization).contact,\n social: (orgData as PublicOrganization).social,\n } : null\n\n /**\n * Check if a specific module is enabled for this organization\n */\n const hasModule = useCallback(\n (module: AxCloudModule): boolean => {\n const mods = normalizedOrg?.modules || []\n return mods.includes(module)\n },\n [normalizedOrg?.modules]\n )\n\n /**\n * Get all enabled modules\n */\n const modules = normalizedOrg?.modules ?? []\n\n return {\n org: normalizedOrg,\n orgId,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Module helpers\n hasModule,\n modules,\n }\n}\n","import { isAxCloudError } from '../core/errors';\nimport type { ContentCollectionType, ContentDetailType } from '../core/types';\nimport type { AxCloudContextValue } from './context';\n\nexport const CONTENT_STALE_TIME_MS = 60_000;\n\nexport function shouldRetryContentRequest(failureCount: number, error: unknown): boolean {\n if (isAxCloudError(error) && error.status >= 400 && error.status < 500) {\n return false;\n }\n return failureCount < 2;\n}\n\nexport function normalizeContentCollectionType(contentType: string): ContentCollectionType {\n switch (contentType.toLowerCase()) {\n case 'news':\n return 'news';\n case 'page':\n case 'pages':\n return 'pages';\n case 'event':\n case 'events':\n return 'events';\n default:\n throw new Error(`Unsupported AxCloud content collection type: ${contentType}`);\n }\n}\n\nexport function normalizeContentDetailType(contentType: string): ContentDetailType {\n switch (contentType.toLowerCase()) {\n case 'news':\n return 'news';\n case 'page':\n case 'pages':\n return 'page';\n case 'event':\n case 'events':\n return 'event';\n default:\n throw new Error(`Unsupported AxCloud content detail type: ${contentType}`);\n }\n}\n\nexport interface ContentAccessState {\n mode: 'public' | 'member' | 'pending';\n enabled: boolean;\n subject: string;\n}\n\nexport function getContentAccessState(\n context: AxCloudContextValue,\n publicOnly: boolean\n): ContentAccessState {\n if (publicOnly) {\n return { mode: 'public', enabled: true, subject: 'anonymous' };\n }\n\n const isLoading = context.isAuthLoading ?? false;\n if (isLoading) {\n return { mode: 'pending', enabled: false, subject: 'auth-loading' };\n }\n\n const hasExplicitAuthState = typeof context.isAuthenticated === 'boolean';\n const isAuthenticated = context.isAuthenticated ?? !context.isPublicMode;\n if (!isAuthenticated) {\n return { mode: 'public', enabled: true, subject: 'anonymous' };\n }\n\n // The built-in provider must never put member content in an identity-agnostic\n // cache while Auth0 has not supplied a subject. The fallback only preserves\n // compatibility with legacy custom contexts that predate explicit auth state.\n if (hasExplicitAuthState && !context.authSubject) {\n return { mode: 'pending', enabled: false, subject: 'auth-subject-pending' };\n }\n const subject = context.authSubject || 'legacy-authenticated-session';\n return { mode: 'member', enabled: Boolean(subject), subject };\n}\n","import { useMemo } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n ContentItem,\n ContentListResponse,\n ContentQueryOptions,\n} from '../../core/types'\nimport { createContentSlotReader, type ContentSlotReader } from '../../core/contentSlots'\nimport {\n CONTENT_STALE_TIME_MS,\n getContentAccessState,\n normalizeContentCollectionType,\n normalizeContentDetailType,\n shouldRetryContentRequest,\n} from '../contentQueryPolicy'\n\n/**\n * Fetch a published content collection.\n *\n * AxCloud owns editorial data and publication. The consuming application owns\n * layout and rendering. Drafts are intentionally never selectable through\n * this delivery hook.\n */\nexport function useContent<T extends ContentItem = ContentItem>(\n contentType: string,\n options: ContentQueryOptions = {}\n) {\n const context = useAxCloudContext()\n const { client, config, orgId, stage } = context\n const collectionType = normalizeContentCollectionType(contentType)\n\n const {\n publicOnly = false,\n page = 1,\n pageSize = 20,\n search,\n sortBy = collectionType === 'news' ? 'publishedAt' : 'createdAt',\n sortOrder = 'desc',\n tags,\n lang,\n } = options\n\n const access = getContentAccessState(context, publicOnly)\n const deliveryScope = access.mode === 'member' ? 'members' : 'public'\n const params = {\n page,\n pageSize,\n search,\n sort: sortBy,\n order: sortOrder,\n tags: tags?.length ? tags.join(',') : undefined,\n lang,\n }\n\n const query = useQuery<ContentListResponse<T>>({\n queryKey: [\n 'axcloud',\n 'content',\n 'collection',\n stage,\n config.apiUrl,\n orgId,\n access.mode,\n access.subject,\n collectionType,\n params,\n ],\n queryFn: () =>\n client.get<ContentListResponse<T>>(\n `/content/${deliveryScope}/${orgId}/${collectionType}`,\n params\n ),\n enabled: access.enabled,\n staleTime: CONTENT_STALE_TIME_MS,\n refetchOnWindowFocus: true,\n retry: shouldRetryContentRequest,\n })\n\n const items = query.data?.items ?? []\n\n return {\n data: items,\n count: query.data?.count ?? items.length,\n total: query.data?.total ?? items.length,\n page: query.data?.page ?? page,\n pageSize: query.data?.pageSize ?? pageSize,\n hasMore: query.data?.hasMore ?? false,\n nextCursor: query.data?.nextCursor,\n isLoading: access.mode === 'pending' || query.isLoading,\n isFetching: query.isFetching,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport interface ContentItemOptions {\n /** Force public delivery even when the visitor is authenticated. */\n publicOnly?: boolean\n /** Return the requested translation when content has language variants. */\n lang?: string\n}\n\n/** Fetch one published content item by ID or slug. */\nexport function useContentItem<T extends ContentItem = ContentItem>(\n contentType: string,\n idOrSlug: string,\n options: ContentItemOptions = {}\n) {\n const context = useAxCloudContext()\n const { client, config, orgId, stage } = context\n const detailType = normalizeContentDetailType(contentType)\n const { publicOnly = false, lang } = options\n const access = getContentAccessState(context, publicOnly)\n const deliveryScope = access.mode === 'member' ? 'members' : 'public'\n\n const query = useQuery<T>({\n queryKey: [\n 'axcloud',\n 'content',\n 'item',\n stage,\n config.apiUrl,\n orgId,\n access.mode,\n access.subject,\n detailType,\n idOrSlug,\n lang,\n ],\n queryFn: () => {\n const encodedIdOrSlug = encodeURIComponent(idOrSlug)\n const endpoint = `/content/${deliveryScope}/${orgId}/items/${detailType}/${encodedIdOrSlug}`\n return lang ? client.get<T>(endpoint, { lang }) : client.get<T>(endpoint)\n },\n enabled: access.enabled && Boolean(idOrSlug),\n staleTime: CONTENT_STALE_TIME_MS,\n refetchOnWindowFocus: true,\n retry: shouldRetryContentRequest,\n })\n\n return {\n data: query.data ?? null,\n isLoading: access.mode === 'pending' || query.isLoading,\n isFetching: query.isFetching,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport interface PageContentState<T extends ContentItem = ContentItem> extends ContentSlotReader {\n page: T | null\n data: T | null\n isLoading: boolean\n isFetching: boolean\n isError: boolean\n error: Error | null\n refetch: () => unknown\n}\n\n/**\n * Fetch a website page and expose structured template fields.\n *\n * Use `page.content`/`page.blocks` for article-like rich text pages. Use\n * `text('hero.title')`, `list('benefits.items')`, etc. for designed website\n * templates where the frontend owns layout and AxCloud owns content.\n */\nexport function usePageContent<T extends ContentItem = ContentItem>(\n slug: string,\n options: ContentItemOptions = {}\n): PageContentState<T> {\n const state = useContentItem<T>('page', slug, options)\n const reader = useMemo(() => createContentSlotReader(state.data), [state.data])\n\n return {\n ...state,\n page: state.data,\n ...reader,\n }\n}\n","import type { ContentQueryOptions, NewsItem } from '../../core/types'\nimport { useContent } from './useContent'\n\n/**\n * Fetch published news visible to the current visitor.\n *\n * This typed convenience wrapper shares access, cache and pagination behavior\n * with the generic content hook.\n */\nexport function useNews(options: ContentQueryOptions = {}) {\n return useContent<NewsItem>('news', options)\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAuth0 } from '@auth0/auth0-react'\nimport { useAxCloudContext } from '../context'\nimport { useUser } from '../auth/useUser'\nimport type { Section, User } from '../../core/types'\n\ninterface SectionWithMembers extends Section {\n members?: User[]\n memberCount?: number\n}\n\n/**\n * useMySection - Fetch the current user's section\n *\n * Returns the section the authenticated user belongs to,\n * along with optional member list if the user has permission to view.\n *\n * @example\n * ```tsx\n * function MySectionPage() {\n * const { section, members, isLoading } = useMySection()\n *\n * if (isLoading) return <Spinner />\n * if (!section) return <p>You are not assigned to a section</p>\n *\n * return (\n * <div>\n * <h1>{section.name}</h1>\n * <p>{section.description}</p>\n * <h2>Members ({members.length})</h2>\n * <ul>\n * {members.map(m => <li key={m.id}>{m.name}</li>)}\n * </ul>\n * </div>\n * )\n * }\n * ```\n */\nexport function useMySection(options: { includeMembers?: boolean } = {}) {\n const { includeMembers = true } = options\n const { isAuthenticated } = useAuth0()\n const { client, orgId, stage } = useAxCloudContext()\n const { user, sectionId, isLoading: isUserLoading } = useUser()\n\n const query = useQuery<SectionWithMembers>({\n queryKey: ['axcloud', 'mySection', orgId, sectionId, includeMembers, stage],\n queryFn: async () => {\n if (!sectionId) {\n throw new Error('User is not assigned to a section')\n }\n\n // Organizations service uses /orgs base path\n // Response may be wrapped in { success, data } by responseWrapper\n const response = await client.get<SectionWithMembers | { success: boolean; data: SectionWithMembers }>(\n `/orgs/api/organizations/${orgId}/sections/${sectionId}`,\n { includeMembers: includeMembers ? 'true' : undefined }\n )\n\n return 'success' in response && response.success === true && response.data ? response.data : response as SectionWithMembers\n },\n enabled: isAuthenticated && !isUserLoading && !!sectionId,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n section: query.data ?? null,\n sectionId,\n members: query.data?.members ?? [],\n memberCount: query.data?.memberCount ?? 0,\n isLoading: isUserLoading || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Helper: Does the user have a section?\n hasSection: !!sectionId,\n\n // The current user in context\n user,\n }\n}\n\n/**\n * useSections - Fetch all sections for the organization\n *\n * @example\n * ```tsx\n * const { sections } = useSections()\n * ```\n */\ninterface SectionsResponse {\n sections: Section[]\n total: number\n}\n\nexport function useSections() {\n const { client, orgId, stage } = useAxCloudContext()\n\n const query = useQuery<SectionsResponse>({\n queryKey: ['axcloud', 'sections', orgId, stage],\n queryFn: async () => {\n // Organizations service uses /orgs base path\n // Response may be wrapped in { success, data } by responseWrapper\n const response = await client.get<SectionsResponse | { success: boolean; data: SectionsResponse }>(`/orgs/api/organizations/${orgId}/sections`)\n return 'success' in response && response.success === true && response.data ? response.data : response as SectionsResponse\n },\n staleTime: 1000 * 60 * 10, // 10 minutes\n })\n\n return {\n sections: query.data?.sections ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","/**\n * useForms - Admin hooks for managing form submissions\n *\n * These hooks require authentication and are intended for use in\n * the AxCloud admin dashboard.\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n FormSubmissionRecord,\n FormSubmissionsResponse,\n FormStatsResponse\n} from '../../core/forms'\n\nexport interface UseFormsOptions {\n /** Filter by form type */\n formType?: 'waitlist' | 'contact' | 'membership'\n /** Filter by status */\n status?: 'pending' | 'approved' | 'rejected' | 'converted'\n /** Number of items per page (default 50, max 100) */\n limit?: number\n /** Pagination cursor */\n cursor?: string\n}\n\nexport interface UseFormStatsOptions {\n /** Number of days to include (default 30, max 365) */\n days?: number\n}\n\n/**\n * useForms - Fetch form submissions for the organization (admin only)\n *\n * @example\n * ```tsx\n * function FormSubmissions() {\n * const { data, isLoading, hasMore, refetch } = useForms({\n * status: 'pending'\n * })\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <ul>\n * {data.map(submission => (\n * <li key={submission.submission_id}>{submission.email}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useForms(options: UseFormsOptions = {}) {\n const { client, stage } = useAxCloudContext()\n\n const { formType, status, limit = 50, cursor } = options\n\n const query = useQuery<FormSubmissionsResponse>({\n queryKey: ['axcloud', 'forms', 'submissions', stage, formType, status, limit, cursor],\n queryFn: async () => {\n const params: Record<string, string | number> = { limit }\n if (formType) params.form_type = formType\n if (status) params.status = status\n if (cursor) params.cursor = cursor\n\n return client.get<FormSubmissionsResponse>(`/${stage}/api/admin/forms/submissions`, params)\n },\n staleTime: 1000 * 30 // 30 seconds\n })\n\n return {\n data: query.data?.items ?? [],\n total: query.data?.total ?? 0,\n hasMore: query.data?.hasMore ?? false,\n cursor: query.data?.cursor,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch\n }\n}\n\n/**\n * useFormStats - Fetch form submission statistics (admin only)\n *\n * @example\n * ```tsx\n * function FormDashboard() {\n * const { stats, summary, isLoading } = useFormStats({ days: 30 })\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <div>\n * <p>Pending: {summary.pending}</p>\n * <p>Approved: {summary.approved}</p>\n * <p>Conversion Rate: {summary.conversionRate}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useFormStats(options: UseFormStatsOptions = {}) {\n const { client, stage } = useAxCloudContext()\n\n const { days = 30 } = options\n\n const query = useQuery<FormStatsResponse>({\n queryKey: ['axcloud', 'forms', 'stats', stage, days],\n queryFn: async () => {\n return client.get<FormStatsResponse>(`/${stage}/api/admin/forms/stats`, { days })\n },\n staleTime: 1000 * 60 * 5 // 5 minutes\n })\n\n return {\n stats: query.data?.stats,\n summary: query.data?.summary,\n period: query.data?.period,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch\n }\n}\n\n/**\n * useUpdateFormSubmission - Mutation hook for updating submission status\n *\n * @example\n * ```tsx\n * function SubmissionRow({ submission }) {\n * const { mutate: updateSubmission, isLoading } = useUpdateFormSubmission()\n *\n * const handleApprove = () => {\n * updateSubmission({\n * submissionId: submission.submission_id,\n * status: 'approved',\n * notes: 'Approved by admin'\n * })\n * }\n *\n * return (\n * <button onClick={handleApprove} disabled={isLoading}>\n * Approve\n * </button>\n * )\n * }\n * ```\n */\nexport function useUpdateFormSubmission() {\n const { client, stage } = useAxCloudContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n submissionId,\n status,\n notes\n }: {\n submissionId: string\n status: 'approved' | 'rejected'\n notes?: string\n }) => {\n return client.patch<{\n success: boolean\n message: string\n submission: FormSubmissionRecord\n user_created?: boolean\n user_id?: string\n }>(`/${stage}/api/admin/forms/submissions/${submissionId}`, { status, notes })\n },\n onSuccess: () => {\n // Invalidate forms queries to refresh the list\n queryClient.invalidateQueries({ queryKey: ['axcloud', 'forms'] })\n }\n })\n}\n","/**\n * useCodeBallot — drive the public (no-login) personal-code voting flow.\n *\n * Lets a customer site (e.g. spf.se) render a native /rosta page: the voter enters\n * their code, the ballot appears, they vote, and they can re-check their selection.\n */\nimport { useCallback, useMemo, useState } from 'react'\nimport { useAxCloudContext } from '../context'\nimport {\n checkVotingCode,\n castVoteWithCode,\n getVotingReceipt,\n type Ballot,\n type VoteReceipt,\n} from '../../core/voting'\n\nexport type CodeBallotStage = 'enter_code' | 'ballot' | 'submitted' | 'already_voted'\n\nexport interface UseCodeBallotOptions {\n pollId: string\n /** Override the Voting API base URL. Defaults to `${config.apiUrl}/voting`. */\n votingApiUrl?: string\n}\n\nexport function useCodeBallot({ pollId, votingApiUrl }: UseCodeBallotOptions) {\n const { orgId, config } = useAxCloudContext()\n const baseUrl = votingApiUrl || `${config.apiUrl.replace(/\\/$/, '')}/voting`\n\n const [stage, setStage] = useState<CodeBallotStage>('enter_code')\n const [code, setCode] = useState<string>('')\n const [ballot, setBallot] = useState<Ballot | null>(null)\n const [receipt, setReceipt] = useState<VoteReceipt | null>(null)\n const [reason, setReason] = useState<string | undefined>(undefined)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const validateCode = useCallback(\n async (inputCode: string) => {\n setLoading(true)\n setError(null)\n try {\n const result = await checkVotingCode(baseUrl, { orgId, pollId, code: inputCode })\n setCode(inputCode)\n setReason(result.reason)\n if (result.has_voted) {\n const r = await getVotingReceipt(baseUrl, { orgId, pollId, code: inputCode }).catch(() => null)\n setReceipt(r)\n setStage('already_voted')\n } else if (result.eligible && result.ballot) {\n setBallot(result.ballot)\n setStage('ballot')\n } else {\n setError(result.reason || 'This code cannot be used to vote right now.')\n }\n return result\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to validate code')\n return null\n } finally {\n setLoading(false)\n }\n },\n [baseUrl, orgId, pollId],\n )\n\n const submitVote = useCallback(\n async (selectedOptions: string[], rankings?: Record<string, number>) => {\n setLoading(true)\n setError(null)\n try {\n await castVoteWithCode(baseUrl, { orgId, pollId, code, selectedOptions, rankings })\n const r = await getVotingReceipt(baseUrl, { orgId, pollId, code }).catch(() => null)\n setReceipt(r)\n setStage('submitted')\n return true\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to submit vote')\n return false\n } finally {\n setLoading(false)\n }\n },\n [baseUrl, orgId, pollId, code],\n )\n\n const reset = useCallback(() => {\n setStage('enter_code')\n setCode('')\n setBallot(null)\n setReceipt(null)\n setReason(undefined)\n setError(null)\n }, [])\n\n return useMemo(\n () => ({ stage, code, ballot, receipt, reason, loading, error, validateCode, submitVote, reset }),\n [stage, code, ballot, receipt, reason, loading, error, validateCode, submitVote, reset],\n )\n}\n","/**\n * useLinkedAccounts Hook\n *\n * Manages linked social accounts (identities) for the current user.\n * Supports Google, Microsoft, and Apple OAuth providers.\n *\n * Uses React-Query for caching, background refresh, and automatic refetch.\n *\n * @example\n * ```tsx\n * function AccountSettings() {\n * const {\n * identities,\n * availableProviders,\n * isLoading,\n * linkAccount,\n * unlinkAccount,\n * canUnlink\n * } = useLinkedAccounts()\n *\n * return (\n * <div>\n * {identities.map(identity => (\n * <div key={identity.provider}>\n * {identity.provider_display_name}\n * {canUnlink && !identity.is_primary && (\n * <button onClick={() => unlinkAccount(identity.provider)}>\n * Disconnect\n * </button>\n * )}\n * </div>\n * ))}\n * {availableProviders.map(provider => (\n * <button key={provider.provider} onClick={() => linkAccount(provider.provider)}>\n * Connect {provider.display_name}\n * </button>\n * ))}\n * </div>\n * )\n * }\n * ```\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport { useAuth } from '../auth/useAuth'\n\nexport interface LinkedIdentity {\n provider: string\n provider_display_name: string\n provider_icon: string\n user_id: string\n connection: string\n is_social: boolean\n is_primary: boolean\n profile_data?: {\n email?: string\n name?: string\n picture?: string\n }\n}\n\nexport interface AvailableProvider {\n provider: string\n display_name: string\n icon: string\n}\n\nexport interface IdentitiesResponse {\n identities: LinkedIdentity[]\n available_providers: AvailableProvider[]\n can_unlink: boolean\n}\n\nexport interface LinkIdentityResponse {\n authorization_url: string\n provider: string\n provider_display_name: string\n message: string\n}\n\nexport interface UnlinkIdentityResponse {\n success: boolean\n message: string\n provider: string\n provider_display_name: string\n remaining_identities: number\n}\n\nexport interface UseLinkedAccountsReturn {\n /** List of linked identities/accounts */\n identities: LinkedIdentity[]\n /** List of providers available for linking */\n availableProviders: AvailableProvider[]\n /** Whether the user can unlink accounts (must have >1) */\n canUnlink: boolean\n /** Loading state */\n isLoading: boolean\n /** Error state */\n error: Error | null\n /** Initiate linking a new account - redirects to OAuth flow */\n linkAccount: (provider: 'google' | 'microsoft' | 'apple') => void\n /** Unlink an account */\n unlinkAccount: (provider: string) => void\n /** Whether a link operation is in progress */\n isLinking: boolean\n /** Whether an unlink operation is in progress */\n isUnlinking: boolean\n /** Refresh the identities list */\n refetch: () => Promise<unknown>\n}\n\n/** Query key for linked accounts */\nexport const LINKED_ACCOUNTS_QUERY_KEY = ['axcloud', 'linked-accounts'] as const\n\n/**\n * useLinkedAccounts - Manage social login accounts\n *\n * Provides functionality to view, link, and unlink social accounts\n * (Google, Microsoft, Apple) from the user's profile.\n *\n * Uses React-Query for caching and automatic state management.\n */\nexport function useLinkedAccounts(): UseLinkedAccountsReturn {\n const { client, stage } = useAxCloudContext()\n const { isAuthenticated } = useAuth()\n const queryClient = useQueryClient()\n\n /**\n * Query for fetching identities\n */\n const query = useQuery({\n queryKey: [...LINKED_ACCOUNTS_QUERY_KEY, stage],\n queryFn: async () => {\n return client.get<IdentitiesResponse>(`/identities/api/users/me/identities`)\n },\n enabled: isAuthenticated,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n /**\n * Mutation for linking a new account\n */\n const linkMutation = useMutation({\n mutationFn: async (provider: 'google' | 'microsoft' | 'apple') => {\n const response = await client.post<LinkIdentityResponse>(\n `/identities/api/users/me/identities/${provider}/link`,\n {}\n )\n\n // Redirect to authorization URL\n if (response.authorization_url) {\n window.location.href = response.authorization_url\n }\n\n return response\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: LINKED_ACCOUNTS_QUERY_KEY })\n },\n })\n\n /**\n * Mutation for unlinking an account\n */\n const unlinkMutation = useMutation({\n mutationFn: async (provider: string) => {\n return client.delete<UnlinkIdentityResponse>(\n `/identities/api/users/me/identities/${provider}`\n )\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: LINKED_ACCOUNTS_QUERY_KEY })\n },\n })\n\n return {\n identities: query.data?.identities ?? [],\n availableProviders: query.data?.available_providers ?? [],\n canUnlink: query.data?.can_unlink ?? false,\n isLoading: query.isLoading,\n error: query.error,\n linkAccount: linkMutation.mutate,\n unlinkAccount: unlinkMutation.mutate,\n isLinking: linkMutation.isPending,\n isUnlinking: unlinkMutation.isPending,\n refetch: query.refetch,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n OrganizationBranding,\n SignedMediaUrl,\n MediaListResponse,\n} from '../../core/types'\n\n/**\n * useBranding - Fetch organization branding (logo, colors)\n *\n * Returns branding information including a signed URL for the logo.\n * The logo URL expires after 1 hour and will be refreshed automatically.\n *\n * @example\n * ```tsx\n * const { branding, logoUrl, isLoading } = useBranding()\n *\n * return (\n * <header>\n * {logoUrl && <img src={logoUrl} alt=\"Logo\" />}\n * <h1 style={{ color: branding?.primaryColor }}>Welcome</h1>\n * </header>\n * )\n * ```\n */\nexport function useBranding() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<OrganizationBranding>({\n queryKey: ['axcloud', 'media', 'branding', orgId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/branding\n return client.get<OrganizationBranding>(`/media/public/${orgId}/branding`)\n },\n staleTime: 1000 * 60 * 30, // 30 minutes (logo URL valid for 1 hour)\n gcTime: 1000 * 60 * 55, // Garbage collect before URL expires\n })\n\n return {\n branding: query.data?.branding ?? null,\n logoUrl: query.data?.branding?.logoUrl ?? null,\n organizationName: query.data?.name ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useLogo - Fetch organization logo URL\n *\n * Returns a signed URL for the organization logo.\n * Use this when you only need the logo, not full branding info.\n *\n * @example\n * ```tsx\n * const { logoUrl, isLoading } = useLogo()\n *\n * if (isLoading) return <Skeleton />\n * return logoUrl ? <img src={logoUrl} alt=\"Logo\" /> : <DefaultLogo />\n * ```\n */\nexport function useLogo() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'logo', orgId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/logo\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/logo`)\n },\n staleTime: 1000 * 60 * 30, // 30 minutes\n gcTime: 1000 * 60 * 55, // Garbage collect before URL expires\n })\n\n return {\n logoUrl: query.data?.url ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useAvatar - Fetch user avatar URL\n *\n * @param userId - The user ID to fetch avatar for\n *\n * @example\n * ```tsx\n * const { avatarUrl } = useAvatar(user.id)\n * return <img src={avatarUrl || defaultAvatar} alt={user.name} />\n * ```\n */\nexport function useAvatar(userId: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'avatar', orgId, userId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/avatar/{userId}\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/avatar/${userId}`)\n },\n enabled: !!userId,\n staleTime: 1000 * 60 * 30,\n gcTime: 1000 * 60 * 55,\n retry: false, // Don't retry if avatar doesn't exist\n })\n\n return {\n avatarUrl: query.data?.url ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useMediaList - List media files in organization's library\n *\n * @param type - Media type to list ('media', 'logos', 'avatars')\n * @param limit - Maximum number of items to return (default: 50)\n *\n * @example\n * ```tsx\n * const { items, isLoading } = useMediaList('media', 20)\n *\n * return (\n * <div className=\"grid\">\n * {items.map(item => (\n * <MediaThumbnail key={item.key} item={item} />\n * ))}\n * </div>\n * )\n * ```\n */\nexport function useMediaList(type: 'media' | 'logos' | 'avatars' = 'media', limit = 50) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<MediaListResponse>({\n queryKey: ['axcloud', 'media', 'list', orgId, type, limit],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/list?type=xxx&limit=xxx\n return client.get<MediaListResponse>(`/media/public/${orgId}/list`, {\n type,\n limit,\n })\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n items: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useMedia - Fetch a specific media file by ID\n *\n * @param mediaId - The media ID (filename including extension)\n *\n * @example\n * ```tsx\n * const { mediaUrl } = useMedia('hero-image.jpg')\n * return <img src={mediaUrl} alt=\"Hero\" />\n * ```\n */\nexport function useMedia(mediaId: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'file', orgId, mediaId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/media/{mediaId}\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/media/${mediaId}`)\n },\n enabled: !!mediaId,\n staleTime: 1000 * 60 * 30,\n gcTime: 1000 * 60 * 55,\n })\n\n return {\n mediaUrl: query.data?.url ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n DocumentFolder,\n DocumentFolderListResponse,\n DocumentItem,\n DocumentListResponse,\n DocumentQueryOptions,\n SignedDocumentUrl,\n} from '../../core/types'\n\nfunction buildDocumentParams(options?: DocumentQueryOptions): Record<string, string | number | boolean | undefined> {\n return {\n search: options?.search,\n tags: options?.tags?.join(','),\n limit: options?.limit,\n }\n}\n\n/**\n * List documents that have been explicitly published for public SDK access.\n *\n * Documents with members/internal/section audience stay inside AxCloud.\n */\nexport function useDocuments(options?: DocumentQueryOptions) {\n const { client, orgId } = useAxCloudContext()\n const params = buildDocumentParams(options)\n\n const query = useQuery<DocumentListResponse>({\n queryKey: ['axcloud', 'documents', 'list', orgId, options],\n queryFn: async () => {\n return client.get<DocumentListResponse>(`/documents/public/${orgId}/documents`, params)\n },\n staleTime: 1000 * 60 * 5,\n })\n\n return {\n documents: query.data?.items ?? [],\n items: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * Fetch a short-lived signed download URL for a public document.\n */\nexport function useDocumentDownload(documentId: string | undefined) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedDocumentUrl>({\n queryKey: ['axcloud', 'documents', 'download', orgId, documentId],\n queryFn: async () => {\n return client.get<SignedDocumentUrl>(\n `/documents/public/${orgId}/documents/${encodeURIComponent(documentId || '')}/download`\n )\n },\n enabled: !!documentId,\n staleTime: 1000 * 60 * 10,\n gcTime: 1000 * 60 * 14,\n })\n\n return {\n url: query.data?.url ?? null,\n documentUrl: query.data?.url ?? null,\n filename: query.data?.filename ?? null,\n mimeType: query.data?.mimeType ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * List documents the current member is allowed to see.\n *\n * Hits the member endpoint (`/documents/members/...`) which is NOT a\n * `/public/` path, so the core client automatically attaches the member's\n * `Authorization: Bearer <JWT>` header instead of the public API key.\n *\n * Returns public documents plus members/internal documents and section\n * documents for the member's sections. Items include `section_ids` and\n * uploader metadata (`uploaded_by_name`, `created_at`).\n */\nexport function useMemberDocuments(options?: DocumentQueryOptions) {\n const { client, orgId } = useAxCloudContext()\n const params = buildDocumentParams(options)\n const folderId = options?.folderId\n\n const query = useQuery<DocumentListResponse>({\n queryKey: ['axcloud', 'documents', 'member', 'list', orgId, options],\n queryFn: async () => {\n return client.get<DocumentListResponse>(`/documents/members/${orgId}/documents`, params)\n },\n staleTime: 1000 * 60 * 5,\n })\n\n const allItems = query.data?.items ?? []\n // Filter by folder client-side so the same cached list can back multiple\n // folder views without extra round-trips. Backward compatible: when no\n // `folderId` is provided every document is returned unchanged.\n const items = folderId\n ? allItems.filter((doc) => doc.folder_ids?.includes(folderId))\n : allItems\n\n return {\n documents: items,\n items,\n count: folderId ? items.length : query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * List the document folders the current member is allowed to see.\n *\n * Hits the member endpoint (`/documents/members/${orgId}/document-folders`),\n * which is NOT a `/public/` path, so the core client attaches the member's\n * `Authorization: Bearer <JWT>` header instead of the public API key.\n *\n * Returns the member's section folders plus org-level folders\n * (`section_id === null`). Use the returned folder ids with\n * `useMemberDocuments({ folderId })` to scope a document list.\n */\nexport function useMemberDocumentFolders() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<DocumentFolderListResponse>({\n queryKey: ['axcloud', 'documents', 'member', 'folders', orgId],\n queryFn: async () => {\n return client.get<DocumentFolderListResponse>(\n `/documents/members/${orgId}/document-folders`\n )\n },\n staleTime: 1000 * 60 * 5,\n })\n\n return {\n folders: query.data?.folders ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * Fetch a short-lived signed download URL for a member-accessible document.\n */\nexport function useMemberDocumentDownload(documentId: string | undefined) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedDocumentUrl>({\n queryKey: ['axcloud', 'documents', 'member', 'download', orgId, documentId],\n queryFn: async () => {\n return client.get<SignedDocumentUrl>(\n `/documents/members/${orgId}/documents/${encodeURIComponent(documentId || '')}/download`\n )\n },\n enabled: !!documentId,\n staleTime: 1000 * 60 * 10,\n gcTime: 1000 * 60 * 14,\n })\n\n return {\n url: query.data?.url ?? null,\n documentUrl: query.data?.url ?? null,\n filename: query.data?.filename ?? null,\n mimeType: query.data?.mimeType ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport type {\n DocumentFolder,\n DocumentFolderListResponse,\n DocumentItem,\n DocumentQueryOptions,\n SignedDocumentUrl,\n}\n","import { useMutation, useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n BarnsportActivitiesFilter,\n BarnsportActivityListItem,\n BarnsportActivityResponse,\n BarnsportClubRemovalRequest,\n BarnsportClubRemovalResponse,\n BarnsportInterestSubmissionRequest,\n BarnsportInterestSubmissionResponse,\n BarnsportListResponse,\n BarnsportMunicipality,\n BarnsportSitemapResponse,\n BarnsportSport,\n} from '../../core/barnsport'\n\nexport function useBarnsportMunicipalities() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<BarnsportListResponse<BarnsportMunicipality>>({\n queryKey: ['axcloud', 'barnsport', 'municipalities', orgId],\n queryFn: () =>\n client.get<BarnsportListResponse<BarnsportMunicipality>>(\n `/barnsport/public/${orgId}/municipalities`\n ),\n staleTime: 1000 * 60 * 30,\n })\n\n return {\n municipalities: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport function useBarnsportSports() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<BarnsportListResponse<BarnsportSport>>({\n queryKey: ['axcloud', 'barnsport', 'sports', orgId],\n queryFn: () =>\n client.get<BarnsportListResponse<BarnsportSport>>(\n `/barnsport/public/${orgId}/sports`\n ),\n staleTime: 1000 * 60 * 30,\n })\n\n return {\n sports: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport function useBarnsportSport(slug: string | undefined) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<{ sport: BarnsportSport }>({\n queryKey: ['axcloud', 'barnsport', 'sport', orgId, slug],\n queryFn: () =>\n client.get<{ sport: BarnsportSport }>(\n `/barnsport/public/${orgId}/sports/${slug || ''}`\n ),\n enabled: Boolean(slug),\n staleTime: 1000 * 60 * 15,\n })\n\n return {\n sport: query.data?.sport ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport function useBarnsportActivities(filters: BarnsportActivitiesFilter = {}) {\n const { client, orgId } = useAxCloudContext()\n const params: Record<string, string | number | boolean | undefined> = { ...filters }\n\n const query = useQuery<BarnsportListResponse<BarnsportActivityListItem>>({\n queryKey: ['axcloud', 'barnsport', 'activities', orgId, filters],\n queryFn: () =>\n client.get<BarnsportListResponse<BarnsportActivityListItem>>(\n `/barnsport/public/${orgId}/activities`,\n params\n ),\n staleTime: 1000 * 60 * 5,\n })\n\n return {\n activities: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n nextCursor: query.data?.nextCursor ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport function useBarnsportActivity(slug: string | undefined) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<BarnsportActivityResponse>({\n queryKey: ['axcloud', 'barnsport', 'activity', orgId, slug],\n queryFn: () =>\n client.get<BarnsportActivityResponse>(\n `/barnsport/public/${orgId}/activities/${slug || ''}`\n ),\n enabled: Boolean(slug),\n staleTime: 1000 * 60 * 5,\n })\n\n return {\n activity: query.data?.activity ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport function useBarnsportSitemap(baseUrl?: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<BarnsportSitemapResponse>({\n queryKey: ['axcloud', 'barnsport', 'sitemap', orgId, baseUrl],\n queryFn: () =>\n client.get<BarnsportSitemapResponse>(`/barnsport/public/${orgId}/sitemap`, {\n baseUrl,\n }),\n staleTime: 1000 * 60 * 15,\n })\n\n return {\n sitemap: query.data ?? null,\n urls: query.data?.urls ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport function useSubmitBarnsportInterest() {\n const { client, orgId } = useAxCloudContext()\n\n return useMutation<BarnsportInterestSubmissionResponse, Error, BarnsportInterestSubmissionRequest>({\n mutationFn: (submission) =>\n client.post<BarnsportInterestSubmissionResponse>(\n `/barnsport/public/${orgId}/interest`,\n submission\n ),\n })\n}\n\nexport function useSubmitBarnsportClubRemovalRequest(clubSlug: string | undefined) {\n const { client, orgId } = useAxCloudContext()\n\n return useMutation<BarnsportClubRemovalResponse, Error, BarnsportClubRemovalRequest>({\n mutationFn: (request) =>\n client.post<BarnsportClubRemovalResponse>(\n `/barnsport/public/${orgId}/clubs/${clubSlug || ''}/removal-request`,\n request\n ),\n })\n}\n","import React from 'react'\nimport { useAuth } from '../auth/useAuth'\n\ninterface LoginButtonProps {\n /**\n * Button text when not authenticated\n */\n children?: React.ReactNode\n\n /**\n * URL to return to after login\n */\n returnTo?: string\n\n /**\n * Additional CSS class names\n */\n className?: string\n\n /**\n * Inline styles\n */\n style?: React.CSSProperties\n}\n\n/**\n * LoginButton - Trigger Auth0 Universal Login\n *\n * @example\n * ```tsx\n * <LoginButton>Sign In</LoginButton>\n *\n * // With custom return URL\n * <LoginButton returnTo=\"/dashboard\">Sign In</LoginButton>\n *\n * // With styling\n * <LoginButton className=\"btn btn-primary\">Sign In</LoginButton>\n * ```\n */\nexport function LoginButton({\n children = 'Log in',\n returnTo,\n className,\n style,\n}: LoginButtonProps) {\n const { login, isLoading } = useAuth()\n\n const handleClick = () => {\n login({ returnTo })\n }\n\n return (\n <button\n onClick={handleClick}\n disabled={isLoading}\n className={className}\n style={style}\n type=\"button\"\n >\n {isLoading ? 'Loading...' : children}\n </button>\n )\n}\n\ninterface LogoutButtonProps {\n /**\n * Button text\n */\n children?: React.ReactNode\n\n /**\n * URL to return to after logout\n */\n returnTo?: string\n\n /**\n * Additional CSS class names\n */\n className?: string\n\n /**\n * Inline styles\n */\n style?: React.CSSProperties\n}\n\n/**\n * LogoutButton - Trigger logout\n *\n * @example\n * ```tsx\n * <LogoutButton>Sign Out</LogoutButton>\n * ```\n */\nexport function LogoutButton({\n children = 'Log out',\n returnTo,\n className,\n style,\n}: LogoutButtonProps) {\n const { logout } = useAuth()\n\n const handleClick = () => {\n logout({ returnTo })\n }\n\n return (\n <button\n onClick={handleClick}\n className={className}\n style={style}\n type=\"button\"\n >\n {children}\n </button>\n )\n}\n","import React from 'react';\nimport { useAuth } from '../auth/useAuth';\nimport { useUser } from '../auth/useUser';\nimport type { UserRole } from '../../core/types';\n\ninterface ProtectedRouteProps {\n /**\n * Content to render when authenticated\n */\n children: React.ReactNode;\n\n /**\n * Required role(s) to access this route\n */\n roles?: UserRole | UserRole[];\n\n /**\n * Component to render while loading\n */\n loadingComponent?: React.ReactNode;\n\n /**\n * Component to render when not authenticated\n */\n unauthenticatedComponent?: React.ReactNode;\n\n /**\n * Component to render when authenticated but lacking required role\n */\n unauthorizedComponent?: React.ReactNode;\n\n /**\n * Whether to automatically redirect to login when not authenticated\n * @default false\n */\n redirectToLogin?: boolean;\n\n /**\n * Return URL after login (only used with redirectToLogin)\n */\n returnTo?: string;\n}\n\n/**\n * ProtectedRoute - Require authentication to view content\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ProtectedRoute>\n * <MemberContent />\n * </ProtectedRoute>\n *\n * // With role requirement\n * <ProtectedRoute roles=\"admin\">\n * <AdminDashboard />\n * </ProtectedRoute>\n *\n * // With multiple allowed roles\n * <ProtectedRoute roles={['admin', 'editor']}>\n * <ContentEditor />\n * </ProtectedRoute>\n *\n * // With custom fallbacks\n * <ProtectedRoute\n * loadingComponent={<Spinner />}\n * unauthenticatedComponent={<LoginPrompt />}\n * unauthorizedComponent={<AccessDenied />}\n * >\n * <ProtectedContent />\n * </ProtectedRoute>\n *\n * // Auto-redirect to login\n * <ProtectedRoute redirectToLogin>\n * <MemberArea />\n * </ProtectedRoute>\n * ```\n */\nexport function ProtectedRoute({\n children,\n roles,\n loadingComponent,\n unauthenticatedComponent,\n unauthorizedComponent,\n redirectToLogin = false,\n returnTo,\n}: ProtectedRouteProps) {\n const { isAuthenticated, isLoading: isAuthLoading, login } = useAuth();\n const { role, isLoading: isUserLoading } = useUser();\n\n const isLoading = isAuthLoading || (isAuthenticated && isUserLoading);\n\n // Show loading state\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>;\n }\n\n // Not authenticated\n if (!isAuthenticated) {\n if (redirectToLogin) {\n login({ returnTo: returnTo || window.location.pathname });\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>;\n }\n return <>{unauthenticatedComponent ?? <DefaultUnauthenticatedComponent />}</>;\n }\n\n // Check role requirements\n if (roles) {\n const requiredRoles = Array.isArray(roles) ? roles : [roles];\n const hasRequiredRole = role !== null && role !== undefined && requiredRoles.includes(role);\n\n if (!hasRequiredRole) {\n return <>{unauthorizedComponent ?? <DefaultUnauthorizedComponent />}</>;\n }\n }\n\n // All checks passed\n return <>{children}</>;\n}\n\n// Default fallback components (minimal styling)\nfunction DefaultLoadingComponent() {\n return <div style={{ padding: '20px', textAlign: 'center' }}>Loading...</div>;\n}\n\nfunction DefaultUnauthenticatedComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n <p>Please log in to view this content.</p>\n </div>\n );\n}\n\nfunction DefaultUnauthorizedComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n <p>You don't have permission to view this content.</p>\n </div>\n );\n}\n","import React from 'react'\nimport { useOrg } from '../hooks/useOrg'\nimport type { AxCloudModule } from '../../core/types'\n\ninterface ModuleGateProps {\n /**\n * Required module(s) to render children\n */\n module: AxCloudModule | AxCloudModule[]\n\n /**\n * Content to render when module is enabled\n */\n children: React.ReactNode\n\n /**\n * Content to render when module is NOT enabled\n */\n fallback?: React.ReactNode\n\n /**\n * Whether ALL modules are required (true) or ANY module (false)\n * @default false (any)\n */\n requireAll?: boolean\n}\n\n/**\n * ModuleGate - Conditionally render based on organization modules\n *\n * Only renders children if the organization has the required module(s) enabled.\n *\n * @example\n * ```tsx\n * // Single module\n * <ModuleGate module=\"training\">\n * <TrainingSection />\n * </ModuleGate>\n *\n * // With fallback\n * <ModuleGate module=\"ai\" fallback={<UpgradePrompt />}>\n * <AIChatWidget />\n * </ModuleGate>\n *\n * // Multiple modules (any)\n * <ModuleGate module={['training', 'documents']}>\n * <LearningCenter />\n * </ModuleGate>\n *\n * // Multiple modules (all required)\n * <ModuleGate module={['training', 'ai']} requireAll>\n * <AITrainingAssistant />\n * </ModuleGate>\n * ```\n */\nexport function ModuleGate({\n module,\n children,\n fallback = null,\n requireAll = false,\n}: ModuleGateProps) {\n const { hasModule, isLoading } = useOrg()\n\n // While loading org data, don't render anything\n if (isLoading) {\n return null\n }\n\n const requiredModules = Array.isArray(module) ? module : [module]\n\n const hasAccess = requireAll\n ? requiredModules.every(m => hasModule(m))\n : requiredModules.some(m => hasModule(m))\n\n if (!hasAccess) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n\n/**\n * useModuleAccess - Hook for programmatic module checks\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { hasModule, modules } = useModuleAccess()\n *\n * return (\n * <nav>\n * <Link to=\"/news\">News</Link>\n * {hasModule('training') && <Link to=\"/training\">Training</Link>}\n * {hasModule('ai') && <Link to=\"/chat\">AI Chat</Link>}\n * </nav>\n * )\n * }\n * ```\n */\nexport function useModuleAccess() {\n const { hasModule, modules, isLoading } = useOrg()\n\n return {\n hasModule,\n modules,\n isLoading,\n }\n}\n","/**\n * LinkedAccountsList Component\n *\n * Ready-to-use component for displaying and managing linked social accounts.\n * Can be used in customer frontends (SPF \"mina sidor\" etc.).\n *\n * Import the CSS file for default styling:\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n *\n * @example\n * ```tsx\n * import { LinkedAccountsList } from '@axcode/axcloud-sdk'\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n *\n * function MinProfil() {\n * return (\n * <div>\n * <h2>Kopplade konton</h2>\n * <LinkedAccountsList providers={['google', 'microsoft']} />\n * </div>\n * )\n * }\n * ```\n */\n\nimport React from 'react'\nimport { useLinkedAccounts, LinkedIdentity, AvailableProvider } from '../hooks/useLinkedAccounts'\n\nexport interface LinkedAccountsListProps {\n /** Which providers to show (default: all available) */\n providers?: ('google' | 'microsoft' | 'apple')[]\n /** Show connect buttons for unlinked providers */\n showConnectButtons?: boolean\n /** Custom class name for the container */\n className?: string\n /** Callback when an account is successfully unlinked */\n onUnlink?: (provider: string) => void\n /** Callback when link flow is initiated */\n onLinkInitiated?: (provider: string) => void\n /** Custom render for identity items */\n renderIdentity?: (identity: LinkedIdentity, onUnlink: () => void) => React.ReactNode\n /** Custom render for available provider items */\n renderAvailableProvider?: (provider: AvailableProvider, onLink: () => void) => React.ReactNode\n}\n\n// Default provider icons as inline SVG\n/**\n * Supported OAuth providers for account linking\n */\nconst SUPPORTED_OAUTH_PROVIDERS = ['google', 'microsoft', 'apple'] as const\ntype SupportedOAuthProvider = typeof SUPPORTED_OAUTH_PROVIDERS[number]\n\n/**\n * Type guard to validate if a provider string is a supported OAuth provider\n */\nfunction isSupportedOAuthProvider(provider: string): provider is SupportedOAuthProvider {\n return SUPPORTED_OAUTH_PROVIDERS.includes(provider as SupportedOAuthProvider)\n}\n\nconst ProviderIcons: Record<string, React.FC<{ className?: string }>> = {\n google: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n ),\n microsoft: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path fill=\"#F25022\" d=\"M1 1h10v10H1z\"/>\n <path fill=\"#00A4EF\" d=\"M1 13h10v10H1z\"/>\n <path fill=\"#7FBA00\" d=\"M13 1h10v10H13z\"/>\n <path fill=\"#FFB900\" d=\"M13 13h10v10H13z\"/>\n </svg>\n ),\n apple: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\"/>\n </svg>\n ),\n email: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/>\n <polyline points=\"22,6 12,13 2,6\"/>\n </svg>\n ),\n}\n\n/**\n * LinkedAccountsList - Ready-to-use component for managing linked accounts\n *\n * Uses CSS classes for styling. Import the CSS file for default styles:\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n */\nexport function LinkedAccountsList({\n providers,\n showConnectButtons = true,\n className,\n onUnlink,\n onLinkInitiated,\n renderIdentity,\n renderAvailableProvider,\n}: LinkedAccountsListProps) {\n const {\n identities,\n availableProviders,\n canUnlink,\n isLoading,\n error,\n linkAccount,\n unlinkAccount,\n } = useLinkedAccounts()\n\n // Filter providers if specified\n const filteredIdentities = providers\n ? identities.filter(i =>\n providers.some(p =>\n i.provider.toLowerCase().includes(p) ||\n i.provider_icon === p\n )\n )\n : identities\n\n const filteredAvailableProviders = providers\n ? availableProviders.filter(p =>\n providers.some(provider =>\n p.provider.toLowerCase().includes(provider) ||\n p.icon === provider\n )\n )\n : availableProviders\n\n const handleUnlink = (provider: string) => {\n unlinkAccount(provider)\n onUnlink?.(provider)\n }\n\n const handleLink = (provider: 'google' | 'microsoft' | 'apple') => {\n onLinkInitiated?.(provider)\n linkAccount(provider)\n }\n\n if (isLoading) {\n return (\n <div className={`axcloud-linked-accounts__loading ${className || ''}`}>\n Loading linked accounts...\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`axcloud-linked-accounts__error ${className || ''}`}>\n Failed to load linked accounts. Please try again.\n </div>\n )\n }\n\n const getIcon = (iconName: string, muted = false) => {\n const IconComponent = ProviderIcons[iconName] || ProviderIcons.email\n const iconClass = muted\n ? 'axcloud-linked-accounts__icon axcloud-linked-accounts__icon--muted'\n : 'axcloud-linked-accounts__icon'\n return <IconComponent className={iconClass} />\n }\n\n return (\n <div className={`axcloud-linked-accounts ${className || ''}`}>\n {/* Connected Accounts */}\n {filteredIdentities.map((identity) => {\n if (renderIdentity) {\n return renderIdentity(identity, () => handleUnlink(identity.provider))\n }\n\n return (\n <div key={`${identity.provider}-${identity.user_id}`} className=\"axcloud-linked-accounts__item\">\n <div className=\"axcloud-linked-accounts__info\">\n {getIcon(identity.provider_icon)}\n <div>\n <div className=\"axcloud-linked-accounts__name-row\">\n <span className=\"axcloud-linked-accounts__provider-name\">\n {identity.provider_display_name}\n </span>\n {identity.is_primary && (\n <span className=\"axcloud-linked-accounts__badge\">Primary</span>\n )}\n </div>\n {identity.profile_data?.email && (\n <div className=\"axcloud-linked-accounts__email\">\n {identity.profile_data.email}\n </div>\n )}\n </div>\n </div>\n <div className=\"axcloud-linked-accounts__actions\">\n <span className=\"axcloud-linked-accounts__connected\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n Connected\n </span>\n {canUnlink && !identity.is_primary && (\n <button\n onClick={() => handleUnlink(identity.provider)}\n className=\"axcloud-linked-accounts__button axcloud-linked-accounts__button--disconnect\"\n >\n Disconnect\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Available Providers */}\n {showConnectButtons &&\n filteredAvailableProviders.map((provider) => {\n if (renderAvailableProvider) {\n return renderAvailableProvider(provider, () => {\n if (isSupportedOAuthProvider(provider.provider)) {\n handleLink(provider.provider)\n }\n })\n }\n\n return (\n <div key={provider.provider} className=\"axcloud-linked-accounts__available\">\n <div className=\"axcloud-linked-accounts__info\">\n {getIcon(provider.icon, true)}\n <div>\n <span className=\"axcloud-linked-accounts__provider-name\">\n {provider.display_name}\n </span>\n <div className=\"axcloud-linked-accounts__email\">Not connected</div>\n </div>\n </div>\n <button\n onClick={() => {\n if (isSupportedOAuthProvider(provider.provider)) {\n handleLink(provider.provider)\n }\n }}\n className=\"axcloud-linked-accounts__button axcloud-linked-accounts__button--connect\"\n >\n Connect\n </button>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default LinkedAccountsList\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/core/forms.ts","../src/core/voting.ts","../src/react/auth/auth0Invitation.ts","../src/react/provider.tsx","../src/react/auth/useAuth.ts","../src/react/auth/useUser.ts","../src/react/hooks/useOrg.ts","../src/react/hooks/useNews.ts","../src/react/hooks/useMySection.ts","../src/react/hooks/useForms.ts","../src/react/hooks/useVoting.ts","../src/react/hooks/useLinkedAccounts.ts","../src/react/hooks/useMedia.ts","../src/react/hooks/useDocuments.ts","../src/react/components/LoginButton.tsx","../src/react/components/ProtectedRoute.tsx","../src/react/components/ModuleGate.tsx","../src/react/components/LinkedAccountsList.tsx"],"names":["QueryClient","isAxCloudError","useAuth0","useAnalyticsRuntime","useState","useCallback","useLayoutEffect","useRef","useMemo","AxCloudClient","jsx","AxCloudContext","QueryClientProvider","Auth0Provider","useAxCloudContext","organizationId","useQuery","useQueryClient","useMutation","useContent","Fragment","jsxs"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * AxCloud SDK Types\n *\n * Note: In the future, these types should be auto-generated from the OpenAPI spec.\n * For now, they are manually defined based on the AxCloud API.\n */\n\nimport type { AxCloudAnalyticsOptions } from './analytics';\n\n// Module types available in AxCloud\nexport type AxCloudModule =\n | 'content'\n | 'members'\n | 'sections'\n | 'training'\n | 'ai'\n | 'documents'\n | 'voting';\n\n// System roles (fixed, cannot be modified)\nexport type SystemRole = 'super_admin' | 'org_admin' | 'section_admin' | 'member' | 'viewer';\n\n// Legacy role names for backwards compatibility\nexport type UserRole = SystemRole | 'superadmin' | 'admin' | 'editor';\n\n// Base roles that custom roles can extend (excludes super_admin)\nexport type BaseRole = 'org_admin' | 'section_admin' | 'member' | 'viewer';\n\n/**\n * Custom role definition\n */\nexport interface CustomRole {\n role_id: string;\n org_id: string;\n name: string;\n description?: string;\n baseRole: BaseRole;\n permissions?: string[]; // Explicit permissions (optional)\n deniedPermissions?: string[]; // Permissions removed from base role\n effectivePermissions?: string[]; // Calculated: base - denied (from API)\n color?: string;\n icon?: string;\n hierarchy: number;\n isSystem: false;\n isActive: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\n// Organization\nexport interface Organization {\n id: string;\n name: string;\n slug: string;\n description?: string;\n modules: AxCloudModule[];\n settings?: OrganizationSettings;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface OrganizationSettings {\n allowPublicSignup?: boolean;\n requireEmailVerification?: boolean;\n defaultUserRole?: UserRole;\n theme?: {\n primaryColor?: string;\n logo?: string;\n };\n}\n\n// Section (groups within organization)\nexport interface Section {\n id: string;\n organizationId: string;\n name: string;\n description?: string;\n slug: string;\n parentId?: string;\n permissions?: SectionPermissions;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SectionPermissions {\n canViewMembers?: boolean;\n canEditContent?: boolean;\n canManageMembers?: boolean;\n}\n\n// User\nexport interface User {\n id: string;\n email: string;\n name: string;\n firstName?: string;\n lastName?: string;\n /** Organization-specific title/position. Managed by organization administrators. */\n title?: string | null;\n phone?: string | null;\n address?: string | null;\n avatar?: string;\n organizationId: string;\n sectionId?: string;\n role: UserRole; // System role or custom role ID\n customRole?: CustomRole; // Full custom role object if using custom role\n permissions?: string[]; // Effective permissions (calculated)\n metadata?: Record<string, unknown>;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Check if user has a specific permission\n */\nexport function userHasPermission(user: User, permission: string): boolean {\n // If user has explicit permissions array, use it\n if (user.permissions && user.permissions.length > 0) {\n return user.permissions.includes(permission);\n }\n\n // Fallback: check if user has a custom role with effective permissions\n if (user.customRole?.effectivePermissions) {\n return user.customRole.effectivePermissions.includes(permission);\n }\n\n return false;\n}\n\n/**\n * Check if user has any of the specified permissions\n */\nexport function userHasAnyPermission(user: User, permissions: string[]): boolean {\n return permissions.some((p) => userHasPermission(user, p));\n}\n\n/**\n * Check if user has all of the specified permissions\n */\nexport function userHasAllPermissions(user: User, permissions: string[]): boolean {\n return permissions.every((p) => userHasPermission(user, p));\n}\n\n// Membership info (extended user data)\nexport interface Membership {\n userId: string;\n organizationId: string;\n sectionId?: string;\n section?: Section;\n role: UserRole;\n /** Organization-specific title/position, separate from the access role. */\n title?: string | null;\n status: 'active' | 'pending' | 'suspended' | 'expired';\n joinedAt: string;\n expiresAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n// Content types\nexport interface ContentBlock {\n id: string;\n type: string;\n content?: string;\n url?: string;\n alt?: string;\n level?: 1 | 2 | 3 | 4 | 5 | 6;\n items?: unknown[];\n language?: string;\n caption?: string;\n attributes?: Record<string, unknown>;\n ordered?: boolean;\n author?: string;\n}\n\nexport interface ContentTranslation {\n title: string;\n slug: string;\n description?: string;\n blocks: ContentBlock[];\n /** Structured website/template fields for this language. */\n fields?: Record<string, unknown>;\n metaTitle?: string;\n metaDescription?: string;\n keywords?: string[];\n}\n\nexport type ContentPublicationState = 'draft' | 'published' | 'archived';\nexport type ContentAudience = 'public' | 'internal' | 'members' | 'section';\n\nexport interface ContentItem {\n id: string;\n /** Present when a consumer needs to distinguish organizations outside its configured provider. */\n organizationId?: string;\n type: string;\n title: string;\n slug: string;\n /** Legacy string content. New AxCloud content uses `blocks`. */\n content?: string;\n description?: string;\n blocks?: ContentBlock[];\n /** Template identifier used by websites, e.g. \"home\" or \"landing\". */\n template?: string;\n /** Structured website/template fields. Frontends own layout and read these values by key. */\n fields?: Record<string, unknown>;\n excerpt?: string;\n author?: {\n id: string;\n name: string;\n };\n status?: ContentPublicationState;\n visibility?: ContentPublicationState;\n /** @deprecated Delivery access is derived from publication metadata and the verified visitor. */\n audience?: ContentAudience;\n sectionId?: string;\n tags?: string[];\n lang?: string;\n featuredImage?: string;\n metaTitle?: string;\n metaDescription?: string;\n keywords?: string[];\n translations?: Record<string, ContentTranslation>;\n currentLanguage?: string;\n availableLanguages?: string[];\n seo?: {\n canonical: string;\n hreflang: Array<{ lang: string; href: string }>;\n };\n publishedAt?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface NewsItem extends ContentItem {\n type: 'news';\n featuredImage?: string;\n category?: string;\n tags?: string[];\n}\n\nexport interface Page extends ContentItem {\n type: 'page';\n template?: string;\n order?: number;\n}\n\n// API Response types\nexport interface ContentListResponse<T> {\n items: T[];\n count: number;\n total: number;\n page: number;\n pageSize: number;\n hasMore: boolean;\n nextCursor?: string;\n}\n\n/** @deprecated Use ContentListResponse. */\nexport type PaginatedResponse<T> = ContentListResponse<T>;\n\nexport type ContentCollectionType = 'news' | 'pages' | 'events';\nexport type ContentDetailType = 'news' | 'page' | 'event';\n\n// SDK Configuration\nexport interface AxCloudConfig {\n orgId: string;\n apiUrl: string;\n /** API stage - defaults to 'dev'. Use 'prod' for production. */\n stage: string;\n /** API key for public content endpoints (optional - required for public API access) */\n apiKey?: string;\n /** Optional privacy-safe web analytics collection. */\n analytics?: AxCloudAnalyticsOptions;\n auth0: {\n domain: string;\n clientId: string;\n redirectUri: string;\n audience?: string;\n /** Auth0 Organization ID. Use this for invite-only member sites. */\n organization?: string;\n /** Database connection name for password operations. Defaults to 'Username-Password-Authentication' */\n connection?: string;\n };\n}\n\n// Query options\nexport interface ContentQueryOptions {\n page?: number;\n pageSize?: number;\n /** @deprecated Delivery endpoints always return the published snapshot. */\n status?: ContentPublicationState;\n /** @deprecated Delivery endpoints always return the published snapshot. */\n visibility?: ContentPublicationState;\n audience?: ContentAudience;\n /** @deprecated Member section access is derived from the verified token. */\n sectionId?: string;\n search?: string;\n sortBy?: 'publishedAt' | 'createdAt' | 'updatedAt' | 'title';\n sortOrder?: 'asc' | 'desc';\n tags?: string[];\n /** Return the requested translation when content has language variants. */\n lang?: string;\n /** Force public endpoint even when authenticated (for public pages) */\n publicOnly?: boolean;\n}\n\n// ============================================\n// MEDIA & BRANDING TYPES\n// ============================================\n\n/**\n * Organization branding information\n */\nexport interface OrganizationBranding {\n organizationId: string;\n name: string;\n branding: {\n /** Signed URL for logo (expires in 1 hour) */\n logoUrl: string | null;\n /** Seconds until logoUrl expires */\n logoExpiresIn: number | null;\n /** Primary brand color (hex) */\n primaryColor: string | null;\n /** Secondary brand color (hex) */\n secondaryColor: string | null;\n };\n}\n\n/**\n * Signed URL response for media assets\n */\nexport interface SignedMediaUrl {\n /** Signed S3 URL (expires in 1 hour) */\n url: string;\n /** Seconds until URL expires */\n expiresIn: number;\n /** S3 bucket name */\n bucket: string;\n /** S3 object key */\n key: string;\n}\n\n/**\n * Media list item\n */\nexport interface MediaItem {\n /** File key (filename) */\n key: string;\n /** File size in bytes */\n size: number;\n /** Last modified timestamp */\n lastModified: string;\n}\n\n/**\n * Media list response\n */\nexport interface MediaListResponse {\n items: MediaItem[];\n count: number;\n bucket: string;\n prefix: string;\n}\n\n// ============================================\n// DOCUMENT TYPES\n// ============================================\n\nexport type DocumentStatus = 'draft' | 'published' | 'archived';\nexport type DocumentAudience = 'public' | 'members' | 'section' | 'internal';\nexport type DocumentSourceProvider = 'upload' | 'sharepoint';\n\n/**\n * Public document metadata exposed through the AxCloud SDK.\n */\nexport interface DocumentItem {\n document_id: string;\n org_id: string;\n title: string;\n description?: string;\n filename: string;\n mime_type: string;\n size: number;\n status: DocumentStatus;\n audience: DocumentAudience;\n tags: string[];\n source_provider: DocumentSourceProvider;\n created_at: string;\n updated_at: string;\n published_at?: string;\n /** Section IDs this document is scoped to (member endpoint only). */\n section_ids?: string[];\n /** Display name of the member who uploaded the document (member endpoint only). */\n uploaded_by_name?: string;\n /** Folder IDs this document belongs to (member endpoint only). */\n folder_ids?: string[];\n}\n\nexport interface DocumentListResponse {\n items: DocumentItem[];\n count: number;\n}\n\n/**\n * A document folder the current member is allowed to see.\n *\n * Members receive folders for their own sections plus org-level folders\n * (`section_id === null`). Returned by the member document-folders endpoint.\n */\nexport interface DocumentFolder {\n id: string;\n /** Section this folder belongs to, or `null` for org-level folders. */\n section_id: string | null;\n /** Parent folder for nesting, or `null` for a top-level folder. */\n parent_folder_id: string | null;\n name: string;\n sort_order: number;\n}\n\nexport interface DocumentFolderListResponse {\n folders: DocumentFolder[];\n}\n\nexport interface SignedDocumentUrl {\n documentId: string;\n url: string;\n expiresIn: number;\n filename: string;\n mimeType: string;\n}\n\nexport interface DocumentQueryOptions {\n search?: string;\n tags?: string[];\n limit?: number;\n /** Restrict results to documents belonging to this folder (member endpoint only). */\n folderId?: string;\n}\n","/**\n * AxCloud Forms Module\n *\n * Public functions for form submissions.\n * Requires organization API key for authentication.\n * Used by public websites like airene.io, theremoters.io, etc.\n */\n\n/**\n * Form submission request\n */\nexport interface FormSubmission {\n /** Organization API key (required for authentication) */\n apiKey: string\n /** Site domain (e.g., 'airene.io') */\n site: string\n /** Form type: 'waitlist', 'contact', or 'membership' */\n formType: 'waitlist' | 'contact' | 'membership'\n /** Email address */\n email: string\n /** Additional form data */\n data?: Record<string, unknown>\n}\n\n/**\n * Form submission response\n */\nexport interface FormSubmissionResponse {\n /** Whether the submission was successful */\n success: boolean\n /** User-friendly message */\n message: string\n /** Unique submission ID */\n submissionId: string\n}\n\n/**\n * Form submission stored in database\n */\nexport interface FormSubmissionRecord {\n submission_id: string\n org_id: string\n site: string\n form_type: 'waitlist' | 'contact' | 'membership'\n status: 'pending' | 'approved' | 'rejected' | 'converted'\n email: string\n data: Record<string, unknown>\n created_at: string\n updated_at: string\n reviewed_by?: string\n reviewed_at?: string\n notes?: string\n user_id?: string\n}\n\n/**\n * Form stats response from API\n */\nexport interface FormStatsResponse {\n stats: {\n total: number\n byStatus: Record<string, number>\n byType: Record<string, number>\n bySite: Record<string, number>\n recent: {\n today: number\n last7Days: number\n last30Days: number\n }\n }\n summary: {\n pending: number\n approved: number\n rejected: number\n conversionRate: string\n }\n period: {\n days: number\n from: string\n to: string\n }\n}\n\n/**\n * Paginated response for form submissions\n */\nexport interface FormSubmissionsResponse {\n items: FormSubmissionRecord[]\n total: number\n cursor?: string\n hasMore: boolean\n}\n\n/**\n * Submit a form to AxCloud\n *\n * Requires organization API key for authentication.\n *\n * @param apiUrl - AxCloud Forms API base URL (e.g., 'https://api.axcloud.app/forms/dev')\n * @param submission - Form submission data including API key\n * @returns Submission response with ID\n *\n * @example\n * ```tsx\n * import { submitForm } from '@axcloud/sdk'\n *\n * const handleSubmit = async (email: string) => {\n * const result = await submitForm(\n * 'https://api.axcloud.app/forms/dev',\n * {\n * apiKey: 'your-org-api-key',\n * site: 'airene.io',\n * formType: 'waitlist',\n * email,\n * data: { name: 'John Doe' }\n * }\n * )\n * console.log(result.message) // \"Thanks! We'll notify you when we launch.\"\n * }\n * ```\n */\nexport async function submitForm(\n apiUrl: string,\n submission: FormSubmission\n): Promise<FormSubmissionResponse> {\n const baseUrl = apiUrl.replace(/\\/$/, '')\n\n try {\n const response = await fetch(`${baseUrl}/public/submit`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n api_key: submission.apiKey,\n site: submission.site,\n form_type: submission.formType,\n email: submission.email,\n data: submission.data || {}\n })\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: 'Form submission failed' }))\n throw new Error(error.message || 'Form submission failed')\n }\n\n const result = await response.json()\n\n return {\n success: result.success,\n message: result.message,\n submissionId: result.submission_id\n }\n } catch (primaryError) {\n // Fallback: notify via email so signups aren't lost\n try {\n const notifyResponse = await fetch(`${baseUrl}/public/notify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n api_key: submission.apiKey,\n site: submission.site,\n form_type: submission.formType,\n email: submission.email\n })\n })\n\n if (notifyResponse.ok) {\n const result = await notifyResponse.json()\n return {\n success: true,\n message: result.message || \"Thanks! We'll notify you when we launch.\",\n submissionId: 'fallback'\n }\n }\n } catch {\n // Notify also failed — throw original error\n }\n\n throw primaryError\n }\n}\n\n/**\n * Create a form submission helper with pre-configured API URL, API key, and site\n *\n * @param config - Configuration with apiUrl, apiKey, and site\n * @returns Object with submit functions\n *\n * @example\n * ```tsx\n * import { createFormHelper } from '@axcloud/sdk'\n *\n * const forms = createFormHelper({\n * apiUrl: 'https://api.axcloud.app/forms/dev',\n * apiKey: 'your-org-api-key',\n * site: 'airene.io'\n * })\n *\n * // Now you can submit forms without repeating apiUrl, apiKey and site\n * const result = await forms.submit('waitlist', 'user@example.com')\n * ```\n */\nexport function createFormHelper(config: { apiUrl: string; apiKey: string; site: string }) {\n return {\n /**\n * Submit a waitlist form\n */\n submitWaitlist: (email: string, data?: Record<string, unknown>) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'waitlist',\n email,\n data\n }),\n\n /**\n * Submit a contact form\n */\n submitContact: (\n email: string,\n data: { name?: string; message: string; [key: string]: unknown }\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'contact',\n email,\n data\n }),\n\n /**\n * Submit a membership application\n */\n submitMembership: (\n email: string,\n data: {\n firstName?: string\n lastName?: string\n phone?: string\n [key: string]: unknown\n }\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType: 'membership',\n email,\n data\n }),\n\n /**\n * Generic submit function\n */\n submit: (\n formType: 'waitlist' | 'contact' | 'membership',\n email: string,\n data?: Record<string, unknown>\n ) =>\n submitForm(config.apiUrl, {\n apiKey: config.apiKey,\n site: config.site,\n formType,\n email,\n data\n })\n }\n}\n","/**\n * AxCloud Voting Module\n *\n * Functions for embedding voting/elections on a customer site (e.g. spf.se).\n *\n * Two channels:\n * - PUBLIC (code): no login — the personal one-time code is the credential.\n * Use {@link checkVotingCode}, {@link castVoteWithCode}, {@link getVotingReceipt}.\n * - AUTHED (Auth0): a logged-in member votes with their access token.\n * Use {@link getBallot}, {@link checkEligibility}, {@link castVote}.\n *\n * `votingApiUrl` is the Voting API base, e.g. 'https://api.axcloud.app/voting'.\n */\n\nexport interface BallotSeat {\n seat_id: string\n label_sv: string\n label_en?: string\n term?: string\n count: number\n order?: number\n}\n\nexport interface BallotCandidate {\n candidate_id: string\n name: string\n bio_sv?: string\n bio_en?: string\n presentation_media_id?: string\n photo_media_id?: string\n}\n\nexport interface BallotOption {\n option_id: string\n text: string\n description?: string\n}\n\nexport interface Ballot {\n poll_id: string\n poll_type: 'single_choice' | 'multiple_choice' | 'ranking' | 'election'\n title: string\n title_en?: string\n description?: string\n description_en?: string\n seats?: BallotSeat[]\n max_selections?: number\n min_selections?: number\n ends_at?: string\n options?: BallotOption[]\n candidates?: BallotCandidate[]\n}\n\nexport interface CodeEligibility {\n eligible: boolean\n has_voted: boolean\n reason?: string\n ballot?: Ballot\n}\n\nexport interface VoteReceipt {\n has_voted: boolean\n voted_at?: string\n selected_option_ids?: string[]\n selection?: string[]\n}\n\nexport interface CastVoteResult {\n success: boolean\n voted_at?: string\n message?: string\n}\n\nfunction baseOf(votingApiUrl: string): string {\n return votingApiUrl.replace(/\\/$/, '')\n}\n\n/** Unwrap the standard AxCloud { success, message, data } envelope. */\nasync function readJson<T>(response: Response): Promise<T> {\n const json = await response.json().catch(() => ({}))\n if (json && typeof json === 'object' && 'success' in json && 'data' in json) {\n return (json as { data: T }).data\n }\n return json as T\n}\n\nasync function ensureOk(response: Response): Promise<void> {\n if (!response.ok) {\n const body = await response.json().catch(() => ({}))\n const message = (body && (body.error || body.message)) || `Request failed with status ${response.status}`\n throw new Error(message)\n }\n}\n\n// ============================================\n// PUBLIC (code) channel — no authentication\n// ============================================\n\n/**\n * Validate a personal code and, if valid, return the ballot to render.\n */\nexport async function checkVotingCode(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; code: string }\n): Promise<CodeEligibility> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/eligibility`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: params.code })\n }\n )\n await ensureOk(response)\n return readJson<CodeEligibility>(response)\n}\n\n/**\n * Cast a vote using a personal code.\n */\nexport async function castVoteWithCode(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; code: string; selectedOptions: string[]; rankings?: Record<string, number> }\n): Promise<CastVoteResult> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/vote`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: params.code, selected_options: params.selectedOptions, rankings: params.rankings })\n }\n )\n await ensureOk(response)\n return readJson<CastVoteResult>(response)\n}\n\n/**\n * After voting, re-check a code to retrieve the voter's own selection.\n */\nexport async function getVotingReceipt(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; code: string }\n): Promise<VoteReceipt> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/public/organizations/${params.orgId}/polls/${params.pollId}/receipt`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ code: params.code })\n }\n )\n await ensureOk(response)\n return readJson<VoteReceipt>(response)\n}\n\n// ============================================\n// AUTHED (Auth0) channel — logged-in member\n// ============================================\n\nfunction authHeaders(accessToken: string): Record<string, string> {\n return { 'Content-Type': 'application/json', Authorization: `Bearer ${accessToken}` }\n}\n\n/**\n * Load a ballot (poll + candidates) for a logged-in member.\n */\nexport async function getBallot(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; accessToken: string }\n): Promise<Ballot> {\n const base = `${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}`\n const pollResp = await fetch(base, { headers: authHeaders(params.accessToken) })\n await ensureOk(pollResp)\n const poll = await readJson<Ballot & { options?: BallotOption[] }>(pollResp)\n\n let candidates: BallotCandidate[] = []\n if (poll.poll_type === 'election') {\n const candResp = await fetch(`${base}/candidates`, { headers: authHeaders(params.accessToken) })\n await ensureOk(candResp)\n const data = await readJson<{ candidates: BallotCandidate[] }>(candResp)\n candidates = data.candidates || []\n }\n return { ...poll, candidates }\n}\n\n/**\n * Check whether the logged-in member is eligible to vote / has already voted.\n */\nexport async function checkEligibility(\n votingApiUrl: string,\n params: { orgId: string; pollId: string; accessToken: string }\n): Promise<{ eligible: boolean; has_voted: boolean; reason?: string }> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}/eligibility`,\n { headers: authHeaders(params.accessToken) }\n )\n await ensureOk(response)\n return readJson(response)\n}\n\n/**\n * Cast a vote as a logged-in member.\n */\nexport async function castVote(\n votingApiUrl: string,\n params: {\n orgId: string\n pollId: string\n accessToken: string\n selectedOptions: string[]\n rankings?: Record<string, number>\n }\n): Promise<CastVoteResult> {\n const response = await fetch(\n `${baseOf(votingApiUrl)}/organizations/${params.orgId}/polls/${params.pollId}/vote`,\n {\n method: 'POST',\n headers: authHeaders(params.accessToken),\n body: JSON.stringify({ selected_options: params.selectedOptions, rankings: params.rankings })\n }\n )\n await ensureOk(response)\n return readJson<CastVoteResult>(response)\n}\n","export interface Auth0InvitationAuthorizationParams {\n invitation?: string;\n}\n\nconst AUTH0_INVITATION_PATTERN = /^[A-Za-z0-9_-]{1,2048}$/;\n\n/**\n * Reads an Auth0 organization invitation from the current product URL.\n * The URL may add an invitation ticket, but it may never override the\n * organization that the host application configured.\n */\nexport function readAuth0InvitationAuthorizationParams(\n configuredOrganization?: string,\n search = typeof window === 'undefined' ? '' : window.location.search\n): Auth0InvitationAuthorizationParams {\n if (!configuredOrganization || !search) return {};\n\n const params = new URLSearchParams(search);\n const invitation = params.get('invitation')?.trim();\n const organization = params.get('organization')?.trim();\n\n if (\n organization !== configuredOrganization ||\n !invitation ||\n !AUTH0_INVITATION_PATTERN.test(invitation)\n ) {\n return {};\n }\n\n return { invitation };\n}\n","import React, { useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { Auth0Provider, useAuth0 } from '@auth0/auth0-react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { AxCloudContext } from './context';\nimport { AxCloudClient } from '../core/client';\nimport type { AxCloudConfig } from '../core/types';\nimport type { AxCloudAnalyticsOptions } from '../core/analytics';\nimport { useAnalyticsRuntime } from './analytics';\nimport { isAxCloudError } from '../core/errors';\nimport { readAuth0InvitationAuthorizationParams } from './auth/auth0Invitation';\n\nexport interface AxCloudProviderProps {\n children: React.ReactNode;\n orgId: string;\n apiUrl: string;\n /** API stage - defaults to 'dev'. Use 'prod' for production. */\n stage?: string;\n /** API key for public content endpoints */\n apiKey?: string;\n /** Optional privacy-safe analytics collection through AxCloud. */\n analytics?: AxCloudAnalyticsOptions;\n auth0: {\n domain: string;\n clientId: string;\n redirectUri: string;\n audience?: string;\n /** Auth0 Organization ID. Use this for invite-only member sites. */\n organization?: string;\n /** Database connection name for password operations. Defaults to 'Username-Password-Authentication' */\n connection?: string;\n };\n queryClient?: QueryClient;\n /** Default request timeout in milliseconds (default: 30000) */\n timeout?: number;\n}\n\nfunction createDefaultQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 1000 * 60,\n gcTime: 1000 * 60 * 30,\n retry: (failureCount, error) => {\n if (isAxCloudError(error) && error.status >= 400 && error.status < 500) {\n return false;\n }\n return failureCount < 2;\n },\n refetchOnWindowFocus: true,\n },\n },\n });\n}\n\n// A caller may intentionally reuse a QueryClient across provider remounts.\n// Remember the complete identity/configuration that owns its AxCloud namespace\n// so a new provider can gate and purge stale data before mounting its children.\nconst queryClientAxCloudOwners = new WeakMap<QueryClient, string>();\n\nfunction createQueryClientOwnerSignature(\n config: AxCloudConfig,\n subject: string | null\n): string {\n return JSON.stringify([\n subject === null ? 'public' : 'authenticated',\n subject,\n config.orgId,\n config.stage,\n config.apiUrl,\n config.apiKey ?? null,\n config.auth0.domain,\n config.auth0.clientId,\n config.auth0.audience ?? null,\n config.auth0.organization ?? null,\n config.auth0.connection ?? null,\n ]);\n}\n\n/**\n * Inner provider that has access to Auth0 context\n */\nfunction AxCloudInnerProvider({\n children,\n config,\n queryClient,\n timeout,\n}: {\n children: React.ReactNode;\n config: AxCloudConfig;\n queryClient: QueryClient;\n timeout?: number;\n}) {\n const { getAccessTokenSilently, isAuthenticated, isLoading, user } = useAuth0();\n const analytics = useAnalyticsRuntime(config);\n const [, setOwnerGeneration] = useState(0);\n const currentSubject = isLoading\n ? undefined\n : isAuthenticated\n ? user?.sub\n : null;\n const currentOwnerSignature =\n currentSubject === undefined\n ? undefined\n : createQueryClientOwnerSignature(config, currentSubject);\n const hasKnownOwner = queryClientAxCloudOwners.has(queryClient);\n const ownerNeedsActivation =\n currentOwnerSignature !== undefined &&\n (!hasKnownOwner || queryClientAxCloudOwners.get(queryClient) !== currentOwnerSignature);\n\n const clearContentCache = useCallback(() => {\n // Several SDK surfaces contain identity-bound data (content, documents,\n // section members, linked accounts and the current profile). Clearing the\n // AxCloud namespace is safer than relying on every future hook to appear in\n // a hand-maintained logout list. Public data is refetched after the switch.\n queryClient.removeQueries({ queryKey: ['axcloud'] });\n }, [queryClient]);\n\n useLayoutEffect(() => {\n // An authenticated session without a subject is not safe to render as a\n // member identity. Keep the tree gated until Auth0 supplies the subject.\n if (currentOwnerSignature === undefined || !ownerNeedsActivation) return;\n\n // Unknown clients may already contain AxCloud data populated outside this\n // provider. Treat them exactly like a mismatched known owner: purge first,\n // then record ownership and only afterwards allow children to mount.\n clearContentCache();\n queryClientAxCloudOwners.set(queryClient, currentOwnerSignature);\n setOwnerGeneration((generation) => generation + 1);\n }, [clearContentCache, currentOwnerSignature, ownerNeedsActivation, queryClient]);\n\n // Use ref to store the token getter so it can be updated without recreating the client\n const tokenGetterRef = useRef<() => Promise<string | undefined>>(async () => undefined);\n\n // Update the ref when auth state changes\n tokenGetterRef.current = isAuthenticated\n ? async () => {\n try {\n return await getAccessTokenSilently();\n } catch {\n return undefined;\n }\n }\n : async () => undefined;\n\n // Create the API client with a stable token getter that uses the ref\n // This avoids recreating the client on auth changes while still getting fresh tokens\n const client = useMemo(() => {\n return new AxCloudClient({\n baseUrl: config.apiUrl,\n apiKey: config.apiKey,\n timeout,\n // Use a wrapper function that delegates to the ref\n // This ensures the client always uses the current auth state\n getAccessToken: async () => {\n if (tokenGetterRef.current) {\n return tokenGetterRef.current();\n }\n return undefined;\n },\n });\n }, [config.apiUrl, config.apiKey, timeout]);\n\n const contextValue = useMemo(\n () => ({\n config,\n client,\n orgId: config.orgId,\n stage: config.stage,\n isPublicMode: !isAuthenticated,\n isAuthLoading: isLoading,\n isAuthenticated,\n authSubject: isAuthenticated ? user?.sub : undefined,\n clearContentCache,\n analytics,\n }),\n [config, client, isAuthenticated, isLoading, user?.sub, clearContentCache, analytics]\n );\n\n const identityReady = currentOwnerSignature !== undefined && !ownerNeedsActivation;\n\n return (\n <AxCloudContext.Provider value={contextValue}>\n {identityReady ? children : null}\n </AxCloudContext.Provider>\n );\n}\n\n/**\n * AxCloudProvider - Main provider for the SDK\n *\n * Combines Auth0Provider, QueryClientProvider, and AxCloud context.\n *\n * @example\n * ```tsx\n * <AxCloudProvider\n * orgId=\"spf\"\n * apiUrl=\"https://api.axcloud.app\"\n * apiKey=\"your-api-key\" // Required for public content access\n * auth0={{\n * domain: \"auth.axcloud.app\",\n * clientId: \"xxx\",\n * redirectUri: window.location.origin,\n * organization: \"org_abc123\" // Optional Auth0 Organization ID for invite-only member sites\n * }}\n * >\n * <App />\n * </AxCloudProvider>\n * ```\n */\nexport function AxCloudProvider({\n children,\n orgId,\n apiUrl,\n stage = 'dev',\n apiKey,\n analytics,\n auth0,\n queryClient: providedQueryClient,\n timeout,\n}: AxCloudProviderProps) {\n const [ownedQueryClient] = useState(createDefaultQueryClient);\n const queryClient = providedQueryClient || ownedQueryClient;\n const invitationAuthorizationParams = readAuth0InvitationAuthorizationParams(auth0.organization);\n const config: AxCloudConfig = useMemo(\n () => ({\n orgId,\n apiUrl,\n stage,\n apiKey,\n analytics,\n auth0,\n }),\n [orgId, apiUrl, stage, apiKey, analytics, auth0]\n );\n\n return (\n <QueryClientProvider client={queryClient}>\n <Auth0Provider\n domain={auth0.domain}\n clientId={auth0.clientId}\n authorizationParams={{\n redirect_uri: auth0.redirectUri,\n audience: auth0.audience,\n ...(auth0.organization ? { organization: auth0.organization } : {}),\n ...invitationAuthorizationParams,\n }}\n >\n <AxCloudInnerProvider config={config} queryClient={queryClient} timeout={timeout}>\n {children}\n </AxCloudInnerProvider>\n </Auth0Provider>\n </QueryClientProvider>\n );\n}\n","import { useCallback } from 'react';\nimport { useAuth0, User as Auth0User } from '@auth0/auth0-react';\nimport { useAxCloudContext } from '../context';\nimport { isAxCloudError } from '../../core/errors';\nimport { readAuth0InvitationAuthorizationParams } from './auth0Invitation';\n\nexport interface AuthUser {\n id: string;\n email: string;\n name: string;\n avatar?: string;\n /** Auth0's authoritative email verification claim. */\n emailVerified?: boolean;\n}\n\nexport interface EmailVerificationResult {\n success: boolean;\n status: 'sent' | 'already_verified' | 'rate_limited' | 'failed';\n message: string;\n retryAfterSeconds?: number;\n}\n\nexport interface UseAuthReturn {\n isAuthenticated: boolean;\n isLoading: boolean;\n error: Error | undefined;\n user: AuthUser | null;\n /** True only when Auth0 explicitly reports email_verified=false. */\n needsEmailVerification: boolean;\n login: (options?: { returnTo?: string }) => Promise<void>;\n logout: (options?: { returnTo?: string }) => Promise<void>;\n getAccessToken: () => Promise<string | undefined>;\n getAuth0Client: () => Auth0ClientState;\n /** Refresh Auth0 tokens/profile and return the latest email verification state. */\n refreshUser: () => Promise<boolean>;\n /** Send a branded verification email that returns to the current product site. */\n requestEmailVerification: (options?: { returnTo?: string }) => Promise<EmailVerificationResult>;\n /** Request a password reset email for the current user or specified email */\n requestPasswordReset: (email?: string) => Promise<{ success: boolean; message: string }>;\n}\n\nexport interface Auth0ClientState {\n loginWithRedirect: ReturnType<typeof useAuth0>['loginWithRedirect'];\n logout: ReturnType<typeof useAuth0>['logout'];\n getAccessTokenSilently: ReturnType<typeof useAuth0>['getAccessTokenSilently'];\n getIdTokenClaims: ReturnType<typeof useAuth0>['getIdTokenClaims'];\n user: Auth0User | undefined;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: Error | undefined;\n}\n\n/**\n * useAuth - Authentication hook with simplified API and escape hatch\n *\n * Provides easy login/logout methods while allowing access to the\n * underlying Auth0 client for advanced use cases.\n *\n * @example\n * ```tsx\n * function Header() {\n * const { isAuthenticated, login, logout, user } = useAuth()\n *\n * return isAuthenticated ? (\n * <button onClick={logout}>Log out</button>\n * ) : (\n * <button onClick={login}>Log in</button>\n * )\n * }\n * ```\n *\n * @example\n * // Advanced: Get access token for manual API calls\n * ```tsx\n * function MyComponent() {\n * const { getAccessToken } = useAuth()\n *\n * const fetchData = async () => {\n * const token = await getAccessToken()\n * // Use token for custom API calls\n * }\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const { config, client, clearContentCache } = useAxCloudContext();\n const {\n isAuthenticated,\n isLoading,\n user: auth0User,\n error,\n loginWithRedirect,\n logout: auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n } = useAuth0();\n\n /**\n * Trigger login via Auth0 Universal Login\n */\n const login = useCallback(\n (options?: { returnTo?: string }) => {\n const invitationAuthorizationParams = readAuth0InvitationAuthorizationParams(\n config.auth0.organization\n );\n return loginWithRedirect({\n appState: {\n returnTo: options?.returnTo || window.location.pathname,\n },\n ...(config.auth0.organization\n ? {\n authorizationParams: {\n organization: config.auth0.organization,\n ...invitationAuthorizationParams,\n },\n }\n : {}),\n });\n },\n [config.auth0.organization, loginWithRedirect]\n );\n\n /**\n * Log out and optionally redirect\n */\n const logout = useCallback(\n (options?: { returnTo?: string }) => {\n // Identity-bound member content must disappear before Auth0 redirects.\n clearContentCache?.();\n return auth0Logout({\n logoutParams: {\n returnTo: options?.returnTo || window.location.origin,\n },\n });\n },\n [auth0Logout, clearContentCache]\n );\n\n /**\n * Get the current access token (for manual API calls)\n */\n const getAccessToken = useCallback(async () => {\n try {\n return await getAccessTokenSilently();\n } catch {\n return undefined;\n }\n }, [getAccessTokenSilently]);\n\n /**\n * Force Auth0 to refresh its cached ID token and user profile. This is used\n * after the user returns from the email verification link.\n */\n const refreshUser = useCallback(async (): Promise<boolean> => {\n await getAccessTokenSilently({ cacheMode: 'off' });\n const claims = await getIdTokenClaims();\n return claims?.email_verified === true;\n }, [getAccessTokenSilently, getIdTokenClaims]);\n\n /**\n * Request a verification email through AxCloud's authenticated email API.\n * The backend resolves the recipient and organization from the access token;\n * callers can only influence a return URL on the configured organization site.\n */\n const requestEmailVerification = useCallback(\n async (options?: { returnTo?: string }): Promise<EmailVerificationResult> => {\n if (!isAuthenticated || !auth0User) {\n return {\n success: false,\n status: 'failed',\n message: 'You must be signed in to verify your email.',\n };\n }\n\n if (auth0User.email_verified === true) {\n return {\n success: true,\n status: 'already_verified',\n message: 'Your email address is already verified.',\n };\n }\n\n try {\n const response = await client.post<{\n data?: {\n status?: 'sent' | 'already_verified';\n message?: string;\n retry_after_seconds?: number;\n };\n }>('/email/identity/verification-email', {\n return_to: options?.returnTo || window.location.href,\n });\n const data = response.data || {};\n\n return {\n success: true,\n status: data.status || 'sent',\n message: data.message || 'A verification email has been sent.',\n ...(data.retry_after_seconds !== undefined\n ? { retryAfterSeconds: data.retry_after_seconds }\n : {}),\n };\n } catch (requestError) {\n if (isAxCloudError(requestError) && requestError.status === 429) {\n const responseDetails = requestError.details?.details;\n const retryAfterSeconds = Number(\n responseDetails && typeof responseDetails === 'object'\n ? (responseDetails as Record<string, unknown>).retry_after_seconds\n : undefined\n );\n return {\n success: false,\n status: 'rate_limited',\n message: 'Please wait before requesting another verification email.',\n ...(Number.isFinite(retryAfterSeconds) ? { retryAfterSeconds } : {}),\n };\n }\n\n return {\n success: false,\n status: 'failed',\n message: 'Failed to send the verification email. Please try again.',\n };\n }\n },\n [auth0User, client, isAuthenticated]\n );\n\n /**\n * Get the full Auth0 client for advanced use cases (escape hatch)\n */\n const getAuth0Client = useCallback(() => {\n return {\n loginWithRedirect,\n logout: auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n user: auth0User,\n isAuthenticated,\n isLoading,\n error,\n };\n }, [\n loginWithRedirect,\n auth0Logout,\n getAccessTokenSilently,\n getIdTokenClaims,\n auth0User,\n isAuthenticated,\n isLoading,\n error,\n ]);\n\n /**\n * Request a password reset email\n * Can be used by logged-in users or on a \"forgot password\" page\n */\n const requestPasswordReset = useCallback(\n async (email?: string): Promise<{ success: boolean; message: string }> => {\n const targetEmail = email || auth0User?.email;\n\n if (!targetEmail) {\n return {\n success: false,\n message: 'Email address is required',\n };\n }\n\n try {\n // Call Auth0's change_password endpoint directly\n const auth0Domain = config.auth0.domain;\n const clientId = config.auth0.clientId;\n const connection = config.auth0.connection || 'Username-Password-Authentication';\n\n const response = await fetch(`https://${auth0Domain}/dbconnections/change_password`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n client_id: clientId,\n email: targetEmail.toLowerCase(),\n connection,\n }),\n });\n\n if (response.ok) {\n return {\n success: true,\n message: 'If an account exists with this email, a password reset link has been sent.',\n };\n }\n\n // Auth0 returns 200 even for non-existent emails for security\n return {\n success: true,\n message: 'If an account exists with this email, a password reset link has been sent.',\n };\n } catch {\n return {\n success: false,\n message: 'Failed to send password reset email. Please try again.',\n };\n }\n },\n [auth0User?.email, config.auth0.domain, config.auth0.clientId]\n );\n\n return {\n // Simple, abstracted API\n isAuthenticated,\n isLoading,\n error,\n user: auth0User\n ? {\n id: auth0User.sub || '',\n email: auth0User.email || '',\n name: auth0User.name || '',\n avatar: auth0User.picture,\n ...(typeof auth0User.email_verified === 'boolean'\n ? { emailVerified: auth0User.email_verified }\n : {}),\n }\n : null,\n needsEmailVerification: isAuthenticated && auth0User?.email_verified === false,\n login,\n logout,\n\n // Escape hatch for advanced use cases\n getAccessToken,\n getAuth0Client,\n refreshUser,\n requestEmailVerification,\n\n // Password management\n requestPasswordReset,\n };\n}\n","import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { useAuth0 } from '@auth0/auth0-react';\nimport { useAxCloudContext } from '../context';\nimport type { User } from '../../core/types';\n\nexport interface UserOrganizationSection {\n id: string;\n name: string;\n role: string;\n}\n\n// Normalized organization membership exposed by the SDK.\nexport interface UserOrganizationMembership {\n role: string;\n roles: string[];\n title: string | null;\n status: string | null;\n joinedAt: string | null;\n memberSince: string | null;\n sectionId: string | null;\n sectionIds: string[];\n sections: UserOrganizationSection[];\n}\n\nexport interface UserApiResponse extends User {\n allOrgIds: string[];\n organizationMemberships: Record<string, UserOrganizationMembership>;\n effectiveOrganizationId: string | null;\n isSuperAdmin: boolean;\n}\n\ntype RawCurrentUserResponse = Record<string, unknown>;\n\nexport interface UpdateMyProfileInput {\n firstName?: string;\n lastName?: string;\n phone?: string | null;\n address?: string | null;\n}\n\nexport interface MyProfileResponse {\n user_id: string;\n email: string;\n given_name: string;\n family_name: string;\n name: string;\n phone_number: string | null;\n phone: string | null;\n address: string | null;\n location: string | null;\n updated_at: string;\n}\n\nconst currentUserQueryKey = (stage: string, orgId: string, subject?: string) =>\n ['axcloud', 'user', 'me', stage, orgId, subject] as const;\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value : null;\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return Array.from(new Set(value.map(asString).filter((item): item is string => item !== null)));\n}\n\nfunction normalizeMembershipSections(rawMembership: Record<string, unknown>): UserOrganizationSection[] {\n const sections = new Map<string, UserOrganizationSection>();\n\n const addSection = (idValue: unknown, nameValue?: unknown, roleValue?: unknown) => {\n const id = asString(idValue);\n if (!id) return;\n\n const existing = sections.get(id);\n sections.set(id, {\n id,\n name: asString(nameValue) || existing?.name || id,\n role: asString(roleValue) || existing?.role || 'member',\n });\n };\n\n const directSections = rawMembership.sections;\n if (Array.isArray(directSections)) {\n for (const rawSection of directSections) {\n if (typeof rawSection === 'string') {\n addSection(rawSection);\n continue;\n }\n const section = asRecord(rawSection);\n addSection(\n section.id ?? section.sectionId ?? section.section_id,\n section.name ?? section.sectionName ?? section.section_name,\n section.role\n );\n }\n }\n\n const sectionMemberships = asRecord(\n rawMembership.sectionMemberships ?? rawMembership.section_memberships\n );\n for (const [sectionId, rawSectionMembership] of Object.entries(sectionMemberships)) {\n const sectionMembership = asRecord(rawSectionMembership);\n addSection(\n sectionId,\n sectionMembership.name ?? sectionMembership.sectionName ?? sectionMembership.section_name,\n sectionMembership.role\n );\n }\n\n for (const sectionId of asStringArray(rawMembership.sectionIds ?? rawMembership.section_ids)) {\n addSection(sectionId);\n }\n\n const primarySectionId = asString(rawMembership.sectionId ?? rawMembership.section_id);\n if (primarySectionId) addSection(primarySectionId);\n\n const normalized = Array.from(sections.values());\n if (!primarySectionId) return normalized;\n\n return normalized.sort((left, right) => {\n if (left.id === primarySectionId) return -1;\n if (right.id === primarySectionId) return 1;\n return 0;\n });\n}\n\nfunction normalizeMembership(rawValue: unknown): UserOrganizationMembership {\n const raw = asRecord(rawValue);\n const role = asString(raw.role) || 'member';\n const roles = asStringArray(raw.roles);\n const sections = normalizeMembershipSections(raw);\n const sectionId = asString(raw.sectionId ?? raw.section_id) || sections[0]?.id || null;\n const joinedAt = asString(raw.joinedAt ?? raw.joined_at);\n\n return {\n role,\n roles: roles.length > 0 ? roles : [role],\n title: asString(raw.title),\n status: asString(raw.status),\n joinedAt,\n memberSince: asString(raw.memberSince ?? raw.member_since) || joinedAt,\n sectionId,\n sectionIds: sections.map((section) => section.id),\n sections,\n };\n}\n\n/** Normalize the snake_case API payload into the SDK's camelCase user contract. */\nexport function normalizeCurrentUserResponse(\n raw: RawCurrentUserResponse,\n configuredOrgId: string\n): UserApiResponse {\n const rawMemberships = asRecord(\n raw.organizationMemberships ?? raw.organization_memberships\n );\n const organizationMemberships = Object.fromEntries(\n Object.entries(rawMemberships).map(([organizationId, membership]) => [\n organizationId,\n normalizeMembership(membership),\n ])\n );\n const allOrgIds = Array.from(\n new Set([\n ...asStringArray(raw.allOrgIds ?? raw.all_org_ids),\n ...Object.keys(organizationMemberships),\n ])\n );\n const effectiveOrganizationId = asString(\n raw.effectiveOrganizationId ?? raw.effective_org_id\n );\n const primaryOrganizationId = asString(\n raw.organizationId ?? raw.primary_org_id ?? raw.org_id\n );\n const organizationId =\n effectiveOrganizationId ||\n primaryOrganizationId ||\n (organizationMemberships[configuredOrgId] ? configuredOrgId : null) ||\n allOrgIds[0] ||\n configuredOrgId;\n const configuredMembership = organizationMemberships[configuredOrgId];\n const firstName = asString(raw.firstName ?? raw.first_name ?? raw.given_name) || '';\n const lastName = asString(raw.lastName ?? raw.last_name ?? raw.family_name) || '';\n const email = asString(raw.email) || '';\n const createdAt = asString(raw.createdAt ?? raw.created_at) || '';\n const updatedAt = asString(raw.updatedAt ?? raw.updated_at) || createdAt;\n const role = (configuredMembership?.role || asString(raw.role) || 'member') as User['role'];\n const sectionId = configuredMembership?.sectionId || asString(raw.sectionId ?? raw.section_id);\n const permissions = asStringArray(raw.permissions ?? raw.effective_permissions);\n const metadata = asRecord(raw.metadata);\n\n return {\n id: asString(raw.id ?? raw.userId ?? raw.user_id ?? raw.sub) || '',\n email,\n name:\n asString(raw.name) ||\n [firstName, lastName].filter(Boolean).join(' ') ||\n email,\n firstName,\n lastName,\n title: configuredMembership?.title ?? asString(raw.title),\n phone: asString(raw.phone ?? raw.phoneNumber ?? raw.phone_number),\n address: asString(raw.address ?? raw.location),\n avatar: asString(raw.avatar ?? raw.avatarUrl ?? raw.avatar_url ?? raw.picture) || undefined,\n organizationId,\n ...(sectionId ? { sectionId } : {}),\n role,\n permissions,\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n createdAt,\n updatedAt,\n allOrgIds,\n organizationMemberships,\n effectiveOrganizationId,\n isSuperAdmin:\n raw.isSuperAdmin === true ||\n raw.is_super_admin === true ||\n asString(raw.global_role) === 'super_admin' ||\n role === 'super_admin',\n };\n}\n\n/**\n * useUser - Fetch the current authenticated user from AxCloud\n *\n * Returns the full user profile including organization membership,\n * role, section, and permissions.\n *\n * Also validates that the user has access to the configured organization.\n *\n * @example\n * ```tsx\n * function Profile() {\n * const { user, isLoading, isError, hasOrgAccess } = useUser()\n *\n * if (isLoading) return <Spinner />\n * if (!hasOrgAccess) return <AccessDenied />\n * if (!user) return <LoginPrompt />\n *\n * return (\n * <div>\n * <h1>Welcome, {user.name}!</h1>\n * <p>Role: {user.role}</p>\n * <p>Organization: {user.organizationId}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useUser() {\n const { isAuthenticated, isLoading: isAuthLoading, user: auth0User } = useAuth0();\n const { client, stage, orgId } = useAxCloudContext();\n const queryKey = currentUserQueryKey(stage, orgId, auth0User?.sub);\n\n const query = useQuery<UserApiResponse>({\n queryKey,\n queryFn: async () => {\n // Stage is encoded by the configured API domain, not in the route path.\n const response = await client.get<RawCurrentUserResponse>('/api/users/me');\n return normalizeCurrentUserResponse(response, orgId);\n },\n enabled: isAuthenticated && !isAuthLoading,\n staleTime: 1000 * 60 * 5, // 5 minutes\n });\n\n // Check if user has access to the configured organization\n const userData = query.data;\n const userOrgIds = userData?.allOrgIds ?? [];\n const isSuperAdmin = userData?.isSuperAdmin === true;\n\n // Get user's role in this specific organization\n const orgMembership = userData?.organizationMemberships?.[orgId];\n const hasOrgAccess =\n userOrgIds.includes(orgId) &&\n orgMembership?.status?.trim().toLowerCase() === 'active';\n const roleInOrg = (orgMembership?.role as User['role'] | undefined) ?? null;\n const sectionId = orgMembership?.sectionId ?? userData?.sectionId ?? null;\n const sections = orgMembership?.sections?.length\n ? orgMembership.sections\n : sectionId\n ? [{ id: sectionId, name: sectionId, role: roleInOrg ?? 'member' }]\n : [];\n const section = sections.find((item) => item.id === sectionId) ?? sections[0] ?? null;\n const memberSince = orgMembership?.memberSince ?? null;\n\n return {\n user: query.data ?? null,\n isLoading: isAuthLoading || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Organization access\n hasOrgAccess,\n roleInOrg,\n organizationMembership: orgMembership ?? null,\n title: orgMembership?.title ?? query.data?.title ?? null,\n section,\n sections,\n sectionIds: orgMembership?.sectionIds?.length\n ? orgMembership.sectionIds\n : sectionId\n ? [sectionId]\n : [],\n joinedAt: orgMembership?.joinedAt ?? null,\n memberSince,\n\n // Convenience properties\n isAuthenticated,\n role: roleInOrg ?? query.data?.role ?? null,\n organizationId: query.data?.organizationId ?? null,\n sectionId,\n permissions: query.data?.permissions ?? [],\n isSuperAdmin,\n };\n}\n\n/**\n * Updates the authenticated user's self-service profile fields.\n * Organization title, email, roles and membership data are intentionally not writable here.\n */\nexport function useUpdateMyProfile() {\n const { client, stage } = useAxCloudContext();\n const queryClient = useQueryClient();\n\n return useMutation<MyProfileResponse, Error, UpdateMyProfileInput>({\n mutationFn: (updates) => client.patch<MyProfileResponse>('/api/users/me/profile', updates),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: ['axcloud', 'user', 'me', stage],\n exact: false,\n });\n },\n });\n}\n","import { useCallback } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type { Organization, AxCloudModule } from '../../core/types'\n\n/**\n * Public organization response from /content/public/{orgId}/org\n */\ninterface PublicOrganization {\n org_id: string\n name: string\n description?: string\n branding?: {\n logo?: string\n primaryColor?: string\n secondaryColor?: string\n }\n modules?: string[]\n contact?: {\n email?: string\n phone?: string\n website?: string\n }\n social?: {\n facebook?: string\n twitter?: string\n linkedin?: string\n instagram?: string\n }\n}\n\n/**\n * useOrg - Fetch organization info and check module availability\n *\n * Automatically uses the appropriate endpoint:\n * - With API key (public): `/content/public/{orgId}/org`\n * - With JWT auth: `/orgs/api/organizations/{orgId}`\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { org, hasModule, isLoading } = useOrg()\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <div>\n * <h1>{org.name}</h1>\n * {org.branding?.logo && <img src={org.branding.logo} alt={org.name} />}\n * {hasModule('training') && <TrainingSection />}\n * {hasModule('ai') && <AIChatWidget />}\n * </div>\n * )\n * }\n * ```\n */\nexport function useOrg() {\n const { client, orgId, stage, isPublicMode } = useAxCloudContext()\n\n // Determine if we should use public endpoint (API key mode or not authenticated)\n const usePublicEndpoint = isPublicMode\n\n const query = useQuery<Organization | PublicOrganization>({\n queryKey: ['axcloud', 'organization', orgId, stage, usePublicEndpoint],\n queryFn: async () => {\n if (usePublicEndpoint) {\n // Public API: /content/public/{orgId}/org (requires x-api-key)\n return client.get<PublicOrganization>(`/content/public/${orgId}/org`)\n } else {\n // Organizations service: /orgs/api/organizations/{orgId}\n return client.get<Organization>(`/orgs/api/organizations/${orgId}`)\n }\n },\n staleTime: 1000 * 60 * 10, // 10 minutes (org data rarely changes)\n })\n\n // Normalize the response to handle both formats\n const orgData = query.data\n const normalizedOrg = orgData ? {\n id: (orgData as Organization).id || (orgData as PublicOrganization).org_id,\n org_id: (orgData as PublicOrganization).org_id || (orgData as Organization).id,\n name: orgData.name,\n description: orgData.description,\n branding: (orgData as PublicOrganization).branding || (orgData as Organization).settings?.theme,\n modules: orgData.modules || [],\n contact: (orgData as PublicOrganization).contact,\n social: (orgData as PublicOrganization).social,\n } : null\n\n /**\n * Check if a specific module is enabled for this organization\n */\n const hasModule = useCallback(\n (module: AxCloudModule): boolean => {\n const mods = normalizedOrg?.modules || []\n return mods.includes(module)\n },\n [normalizedOrg?.modules]\n )\n\n /**\n * Get all enabled modules\n */\n const modules = normalizedOrg?.modules ?? []\n\n return {\n org: normalizedOrg,\n orgId,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Module helpers\n hasModule,\n modules,\n }\n}\n","import type { ContentQueryOptions, NewsItem } from '../../core/types'\nimport { useContent } from './useContent'\n\n/**\n * Fetch published news visible to the current visitor.\n *\n * This typed convenience wrapper shares access, cache and pagination behavior\n * with the generic content hook.\n */\nexport function useNews(options: ContentQueryOptions = {}) {\n return useContent<NewsItem>('news', options)\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAuth0 } from '@auth0/auth0-react'\nimport { useAxCloudContext } from '../context'\nimport { useUser } from '../auth/useUser'\nimport type { Section, User } from '../../core/types'\n\ninterface SectionWithMembers extends Section {\n members?: User[]\n memberCount?: number\n}\n\n/**\n * useMySection - Fetch the current user's section\n *\n * Returns the section the authenticated user belongs to,\n * along with optional member list if the user has permission to view.\n *\n * @example\n * ```tsx\n * function MySectionPage() {\n * const { section, members, isLoading } = useMySection()\n *\n * if (isLoading) return <Spinner />\n * if (!section) return <p>You are not assigned to a section</p>\n *\n * return (\n * <div>\n * <h1>{section.name}</h1>\n * <p>{section.description}</p>\n * <h2>Members ({members.length})</h2>\n * <ul>\n * {members.map(m => <li key={m.id}>{m.name}</li>)}\n * </ul>\n * </div>\n * )\n * }\n * ```\n */\nexport function useMySection(options: { includeMembers?: boolean } = {}) {\n const { includeMembers = true } = options\n const { isAuthenticated } = useAuth0()\n const { client, orgId, stage } = useAxCloudContext()\n const { user, sectionId, isLoading: isUserLoading } = useUser()\n\n const query = useQuery<SectionWithMembers>({\n queryKey: ['axcloud', 'mySection', orgId, sectionId, includeMembers, stage],\n queryFn: async () => {\n if (!sectionId) {\n throw new Error('User is not assigned to a section')\n }\n\n // Organizations service uses /orgs base path\n // Response may be wrapped in { success, data } by responseWrapper\n const response = await client.get<SectionWithMembers | { success: boolean; data: SectionWithMembers }>(\n `/orgs/api/organizations/${orgId}/sections/${sectionId}`,\n { includeMembers: includeMembers ? 'true' : undefined }\n )\n\n return 'success' in response && response.success === true && response.data ? response.data : response as SectionWithMembers\n },\n enabled: isAuthenticated && !isUserLoading && !!sectionId,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n section: query.data ?? null,\n sectionId,\n members: query.data?.members ?? [],\n memberCount: query.data?.memberCount ?? 0,\n isLoading: isUserLoading || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n\n // Helper: Does the user have a section?\n hasSection: !!sectionId,\n\n // The current user in context\n user,\n }\n}\n\n/**\n * useSections - Fetch all sections for the organization\n *\n * @example\n * ```tsx\n * const { sections } = useSections()\n * ```\n */\ninterface SectionsResponse {\n sections: Section[]\n total: number\n}\n\nexport function useSections() {\n const { client, orgId, stage } = useAxCloudContext()\n\n const query = useQuery<SectionsResponse>({\n queryKey: ['axcloud', 'sections', orgId, stage],\n queryFn: async () => {\n // Organizations service uses /orgs base path\n // Response may be wrapped in { success, data } by responseWrapper\n const response = await client.get<SectionsResponse | { success: boolean; data: SectionsResponse }>(`/orgs/api/organizations/${orgId}/sections`)\n return 'success' in response && response.success === true && response.data ? response.data : response as SectionsResponse\n },\n staleTime: 1000 * 60 * 10, // 10 minutes\n })\n\n return {\n sections: query.data?.sections ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","/**\n * useForms - Admin hooks for managing form submissions\n *\n * These hooks require authentication and are intended for use in\n * the AxCloud admin dashboard.\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n FormSubmissionRecord,\n FormSubmissionsResponse,\n FormStatsResponse\n} from '../../core/forms'\n\nexport interface UseFormsOptions {\n /** Filter by form type */\n formType?: 'waitlist' | 'contact' | 'membership'\n /** Filter by status */\n status?: 'pending' | 'approved' | 'rejected' | 'converted'\n /** Number of items per page (default 50, max 100) */\n limit?: number\n /** Pagination cursor */\n cursor?: string\n}\n\nexport interface UseFormStatsOptions {\n /** Number of days to include (default 30, max 365) */\n days?: number\n}\n\n/**\n * useForms - Fetch form submissions for the organization (admin only)\n *\n * @example\n * ```tsx\n * function FormSubmissions() {\n * const { data, isLoading, hasMore, refetch } = useForms({\n * status: 'pending'\n * })\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <ul>\n * {data.map(submission => (\n * <li key={submission.submission_id}>{submission.email}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n */\nexport function useForms(options: UseFormsOptions = {}) {\n const { client, stage } = useAxCloudContext()\n\n const { formType, status, limit = 50, cursor } = options\n\n const query = useQuery<FormSubmissionsResponse>({\n queryKey: ['axcloud', 'forms', 'submissions', stage, formType, status, limit, cursor],\n queryFn: async () => {\n const params: Record<string, string | number> = { limit }\n if (formType) params.form_type = formType\n if (status) params.status = status\n if (cursor) params.cursor = cursor\n\n return client.get<FormSubmissionsResponse>(`/${stage}/api/admin/forms/submissions`, params)\n },\n staleTime: 1000 * 30 // 30 seconds\n })\n\n return {\n data: query.data?.items ?? [],\n total: query.data?.total ?? 0,\n hasMore: query.data?.hasMore ?? false,\n cursor: query.data?.cursor,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch\n }\n}\n\n/**\n * useFormStats - Fetch form submission statistics (admin only)\n *\n * @example\n * ```tsx\n * function FormDashboard() {\n * const { stats, summary, isLoading } = useFormStats({ days: 30 })\n *\n * if (isLoading) return <Spinner />\n *\n * return (\n * <div>\n * <p>Pending: {summary.pending}</p>\n * <p>Approved: {summary.approved}</p>\n * <p>Conversion Rate: {summary.conversionRate}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useFormStats(options: UseFormStatsOptions = {}) {\n const { client, stage } = useAxCloudContext()\n\n const { days = 30 } = options\n\n const query = useQuery<FormStatsResponse>({\n queryKey: ['axcloud', 'forms', 'stats', stage, days],\n queryFn: async () => {\n return client.get<FormStatsResponse>(`/${stage}/api/admin/forms/stats`, { days })\n },\n staleTime: 1000 * 60 * 5 // 5 minutes\n })\n\n return {\n stats: query.data?.stats,\n summary: query.data?.summary,\n period: query.data?.period,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch\n }\n}\n\n/**\n * useUpdateFormSubmission - Mutation hook for updating submission status\n *\n * @example\n * ```tsx\n * function SubmissionRow({ submission }) {\n * const { mutate: updateSubmission, isLoading } = useUpdateFormSubmission()\n *\n * const handleApprove = () => {\n * updateSubmission({\n * submissionId: submission.submission_id,\n * status: 'approved',\n * notes: 'Approved by admin'\n * })\n * }\n *\n * return (\n * <button onClick={handleApprove} disabled={isLoading}>\n * Approve\n * </button>\n * )\n * }\n * ```\n */\nexport function useUpdateFormSubmission() {\n const { client, stage } = useAxCloudContext()\n const queryClient = useQueryClient()\n\n return useMutation({\n mutationFn: async ({\n submissionId,\n status,\n notes\n }: {\n submissionId: string\n status: 'approved' | 'rejected'\n notes?: string\n }) => {\n return client.patch<{\n success: boolean\n message: string\n submission: FormSubmissionRecord\n user_created?: boolean\n user_id?: string\n }>(`/${stage}/api/admin/forms/submissions/${submissionId}`, { status, notes })\n },\n onSuccess: () => {\n // Invalidate forms queries to refresh the list\n queryClient.invalidateQueries({ queryKey: ['axcloud', 'forms'] })\n }\n })\n}\n","/**\n * useCodeBallot — drive the public (no-login) personal-code voting flow.\n *\n * Lets a customer site (e.g. spf.se) render a native /rosta page: the voter enters\n * their code, the ballot appears, they vote, and they can re-check their selection.\n */\nimport { useCallback, useMemo, useState } from 'react'\nimport { useAxCloudContext } from '../context'\nimport {\n checkVotingCode,\n castVoteWithCode,\n getVotingReceipt,\n type Ballot,\n type VoteReceipt,\n} from '../../core/voting'\n\nexport type CodeBallotStage = 'enter_code' | 'ballot' | 'submitted' | 'already_voted'\n\nexport interface UseCodeBallotOptions {\n pollId: string\n /** Override the Voting API base URL. Defaults to `${config.apiUrl}/voting`. */\n votingApiUrl?: string\n}\n\nexport function useCodeBallot({ pollId, votingApiUrl }: UseCodeBallotOptions) {\n const { orgId, config } = useAxCloudContext()\n const baseUrl = votingApiUrl || `${config.apiUrl.replace(/\\/$/, '')}/voting`\n\n const [stage, setStage] = useState<CodeBallotStage>('enter_code')\n const [code, setCode] = useState<string>('')\n const [ballot, setBallot] = useState<Ballot | null>(null)\n const [receipt, setReceipt] = useState<VoteReceipt | null>(null)\n const [reason, setReason] = useState<string | undefined>(undefined)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const validateCode = useCallback(\n async (inputCode: string) => {\n setLoading(true)\n setError(null)\n try {\n const result = await checkVotingCode(baseUrl, { orgId, pollId, code: inputCode })\n setCode(inputCode)\n setReason(result.reason)\n if (result.has_voted) {\n const r = await getVotingReceipt(baseUrl, { orgId, pollId, code: inputCode }).catch(() => null)\n setReceipt(r)\n setStage('already_voted')\n } else if (result.eligible && result.ballot) {\n setBallot(result.ballot)\n setStage('ballot')\n } else {\n setError(result.reason || 'This code cannot be used to vote right now.')\n }\n return result\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to validate code')\n return null\n } finally {\n setLoading(false)\n }\n },\n [baseUrl, orgId, pollId],\n )\n\n const submitVote = useCallback(\n async (selectedOptions: string[], rankings?: Record<string, number>) => {\n setLoading(true)\n setError(null)\n try {\n await castVoteWithCode(baseUrl, { orgId, pollId, code, selectedOptions, rankings })\n const r = await getVotingReceipt(baseUrl, { orgId, pollId, code }).catch(() => null)\n setReceipt(r)\n setStage('submitted')\n return true\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to submit vote')\n return false\n } finally {\n setLoading(false)\n }\n },\n [baseUrl, orgId, pollId, code],\n )\n\n const reset = useCallback(() => {\n setStage('enter_code')\n setCode('')\n setBallot(null)\n setReceipt(null)\n setReason(undefined)\n setError(null)\n }, [])\n\n return useMemo(\n () => ({ stage, code, ballot, receipt, reason, loading, error, validateCode, submitVote, reset }),\n [stage, code, ballot, receipt, reason, loading, error, validateCode, submitVote, reset],\n )\n}\n","/**\n * useLinkedAccounts Hook\n *\n * Manages linked social accounts (identities) for the current user.\n * Supports Google, Microsoft, and Apple OAuth providers.\n *\n * Uses React-Query for caching, background refresh, and automatic refetch.\n *\n * @example\n * ```tsx\n * function AccountSettings() {\n * const {\n * identities,\n * availableProviders,\n * isLoading,\n * linkAccount,\n * unlinkAccount,\n * canUnlink\n * } = useLinkedAccounts()\n *\n * return (\n * <div>\n * {identities.map(identity => (\n * <div key={identity.provider}>\n * {identity.provider_display_name}\n * {canUnlink && !identity.is_primary && (\n * <button onClick={() => unlinkAccount(identity.provider)}>\n * Disconnect\n * </button>\n * )}\n * </div>\n * ))}\n * {availableProviders.map(provider => (\n * <button key={provider.provider} onClick={() => linkAccount(provider.provider)}>\n * Connect {provider.display_name}\n * </button>\n * ))}\n * </div>\n * )\n * }\n * ```\n */\n\nimport { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport { useAuth } from '../auth/useAuth'\n\nexport interface LinkedIdentity {\n provider: string\n provider_display_name: string\n provider_icon: string\n user_id: string\n connection: string\n is_social: boolean\n is_primary: boolean\n profile_data?: {\n email?: string\n name?: string\n picture?: string\n }\n}\n\nexport interface AvailableProvider {\n provider: string\n display_name: string\n icon: string\n}\n\nexport interface IdentitiesResponse {\n identities: LinkedIdentity[]\n available_providers: AvailableProvider[]\n can_unlink: boolean\n}\n\nexport interface LinkIdentityResponse {\n authorization_url: string\n provider: string\n provider_display_name: string\n message: string\n}\n\nexport interface UnlinkIdentityResponse {\n success: boolean\n message: string\n provider: string\n provider_display_name: string\n remaining_identities: number\n}\n\nexport interface UseLinkedAccountsReturn {\n /** List of linked identities/accounts */\n identities: LinkedIdentity[]\n /** List of providers available for linking */\n availableProviders: AvailableProvider[]\n /** Whether the user can unlink accounts (must have >1) */\n canUnlink: boolean\n /** Loading state */\n isLoading: boolean\n /** Error state */\n error: Error | null\n /** Initiate linking a new account - redirects to OAuth flow */\n linkAccount: (provider: 'google' | 'microsoft' | 'apple') => void\n /** Unlink an account */\n unlinkAccount: (provider: string) => void\n /** Whether a link operation is in progress */\n isLinking: boolean\n /** Whether an unlink operation is in progress */\n isUnlinking: boolean\n /** Refresh the identities list */\n refetch: () => Promise<unknown>\n}\n\n/** Query key for linked accounts */\nexport const LINKED_ACCOUNTS_QUERY_KEY = ['axcloud', 'linked-accounts'] as const\n\n/**\n * useLinkedAccounts - Manage social login accounts\n *\n * Provides functionality to view, link, and unlink social accounts\n * (Google, Microsoft, Apple) from the user's profile.\n *\n * Uses React-Query for caching and automatic state management.\n */\nexport function useLinkedAccounts(): UseLinkedAccountsReturn {\n const { client, stage } = useAxCloudContext()\n const { isAuthenticated } = useAuth()\n const queryClient = useQueryClient()\n\n /**\n * Query for fetching identities\n */\n const query = useQuery({\n queryKey: [...LINKED_ACCOUNTS_QUERY_KEY, stage],\n queryFn: async () => {\n return client.get<IdentitiesResponse>(`/identities/api/users/me/identities`)\n },\n enabled: isAuthenticated,\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n /**\n * Mutation for linking a new account\n */\n const linkMutation = useMutation({\n mutationFn: async (provider: 'google' | 'microsoft' | 'apple') => {\n const response = await client.post<LinkIdentityResponse>(\n `/identities/api/users/me/identities/${provider}/link`,\n {}\n )\n\n // Redirect to authorization URL\n if (response.authorization_url) {\n window.location.href = response.authorization_url\n }\n\n return response\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: LINKED_ACCOUNTS_QUERY_KEY })\n },\n })\n\n /**\n * Mutation for unlinking an account\n */\n const unlinkMutation = useMutation({\n mutationFn: async (provider: string) => {\n return client.delete<UnlinkIdentityResponse>(\n `/identities/api/users/me/identities/${provider}`\n )\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: LINKED_ACCOUNTS_QUERY_KEY })\n },\n })\n\n return {\n identities: query.data?.identities ?? [],\n availableProviders: query.data?.available_providers ?? [],\n canUnlink: query.data?.can_unlink ?? false,\n isLoading: query.isLoading,\n error: query.error,\n linkAccount: linkMutation.mutate,\n unlinkAccount: unlinkMutation.mutate,\n isLinking: linkMutation.isPending,\n isUnlinking: unlinkMutation.isPending,\n refetch: query.refetch,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n OrganizationBranding,\n SignedMediaUrl,\n MediaListResponse,\n} from '../../core/types'\n\n/**\n * useBranding - Fetch organization branding (logo, colors)\n *\n * Returns branding information including a signed URL for the logo.\n * The logo URL expires after 1 hour and will be refreshed automatically.\n *\n * @example\n * ```tsx\n * const { branding, logoUrl, isLoading } = useBranding()\n *\n * return (\n * <header>\n * {logoUrl && <img src={logoUrl} alt=\"Logo\" />}\n * <h1 style={{ color: branding?.primaryColor }}>Welcome</h1>\n * </header>\n * )\n * ```\n */\nexport function useBranding() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<OrganizationBranding>({\n queryKey: ['axcloud', 'media', 'branding', orgId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/branding\n return client.get<OrganizationBranding>(`/media/public/${orgId}/branding`)\n },\n staleTime: 1000 * 60 * 30, // 30 minutes (logo URL valid for 1 hour)\n gcTime: 1000 * 60 * 55, // Garbage collect before URL expires\n })\n\n return {\n branding: query.data?.branding ?? null,\n logoUrl: query.data?.branding?.logoUrl ?? null,\n organizationName: query.data?.name ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useLogo - Fetch organization logo URL\n *\n * Returns a signed URL for the organization logo.\n * Use this when you only need the logo, not full branding info.\n *\n * @example\n * ```tsx\n * const { logoUrl, isLoading } = useLogo()\n *\n * if (isLoading) return <Skeleton />\n * return logoUrl ? <img src={logoUrl} alt=\"Logo\" /> : <DefaultLogo />\n * ```\n */\nexport function useLogo() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'logo', orgId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/logo\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/logo`)\n },\n staleTime: 1000 * 60 * 30, // 30 minutes\n gcTime: 1000 * 60 * 55, // Garbage collect before URL expires\n })\n\n return {\n logoUrl: query.data?.url ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useAvatar - Fetch user avatar URL\n *\n * @param userId - The user ID to fetch avatar for\n *\n * @example\n * ```tsx\n * const { avatarUrl } = useAvatar(user.id)\n * return <img src={avatarUrl || defaultAvatar} alt={user.name} />\n * ```\n */\nexport function useAvatar(userId: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'avatar', orgId, userId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/avatar/{userId}\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/avatar/${userId}`)\n },\n enabled: !!userId,\n staleTime: 1000 * 60 * 30,\n gcTime: 1000 * 60 * 55,\n retry: false, // Don't retry if avatar doesn't exist\n })\n\n return {\n avatarUrl: query.data?.url ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useMediaList - List media files in organization's library\n *\n * @param type - Media type to list ('media', 'logos', 'avatars')\n * @param limit - Maximum number of items to return (default: 50)\n *\n * @example\n * ```tsx\n * const { items, isLoading } = useMediaList('media', 20)\n *\n * return (\n * <div className=\"grid\">\n * {items.map(item => (\n * <MediaThumbnail key={item.key} item={item} />\n * ))}\n * </div>\n * )\n * ```\n */\nexport function useMediaList(type: 'media' | 'logos' | 'avatars' = 'media', limit = 50) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<MediaListResponse>({\n queryKey: ['axcloud', 'media', 'list', orgId, type, limit],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/list?type=xxx&limit=xxx\n return client.get<MediaListResponse>(`/media/public/${orgId}/list`, {\n type,\n limit,\n })\n },\n staleTime: 1000 * 60 * 5, // 5 minutes\n })\n\n return {\n items: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * useMedia - Fetch a specific media file by ID\n *\n * @param mediaId - The media ID (filename including extension)\n *\n * @example\n * ```tsx\n * const { mediaUrl } = useMedia('hero-image.jpg')\n * return <img src={mediaUrl} alt=\"Hero\" />\n * ```\n */\nexport function useMedia(mediaId: string) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedMediaUrl>({\n queryKey: ['axcloud', 'media', 'file', orgId, mediaId],\n queryFn: async () => {\n // Media API: /media/public/{orgId}/media/{mediaId}\n return client.get<SignedMediaUrl>(`/media/public/${orgId}/media/${mediaId}`)\n },\n enabled: !!mediaId,\n staleTime: 1000 * 60 * 30,\n gcTime: 1000 * 60 * 55,\n })\n\n return {\n mediaUrl: query.data?.url ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import { useQuery } from '@tanstack/react-query'\nimport { useAxCloudContext } from '../context'\nimport type {\n DocumentFolder,\n DocumentFolderListResponse,\n DocumentItem,\n DocumentListResponse,\n DocumentQueryOptions,\n SignedDocumentUrl,\n} from '../../core/types'\n\nfunction buildDocumentParams(options?: DocumentQueryOptions): Record<string, string | number | boolean | undefined> {\n return {\n search: options?.search,\n tags: options?.tags?.join(','),\n limit: options?.limit,\n }\n}\n\n/**\n * List documents that have been explicitly published for public SDK access.\n *\n * Documents with members/internal/section audience stay inside AxCloud.\n */\nexport function useDocuments(options?: DocumentQueryOptions) {\n const { client, orgId } = useAxCloudContext()\n const params = buildDocumentParams(options)\n\n const query = useQuery<DocumentListResponse>({\n queryKey: ['axcloud', 'documents', 'list', orgId, options],\n queryFn: async () => {\n return client.get<DocumentListResponse>(`/documents/public/${orgId}/documents`, params)\n },\n staleTime: 1000 * 60 * 5,\n })\n\n return {\n documents: query.data?.items ?? [],\n items: query.data?.items ?? [],\n count: query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * Fetch a short-lived signed download URL for a public document.\n */\nexport function useDocumentDownload(documentId: string | undefined) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedDocumentUrl>({\n queryKey: ['axcloud', 'documents', 'download', orgId, documentId],\n queryFn: async () => {\n return client.get<SignedDocumentUrl>(\n `/documents/public/${orgId}/documents/${encodeURIComponent(documentId || '')}/download`\n )\n },\n enabled: !!documentId,\n staleTime: 1000 * 60 * 10,\n gcTime: 1000 * 60 * 14,\n })\n\n return {\n url: query.data?.url ?? null,\n documentUrl: query.data?.url ?? null,\n filename: query.data?.filename ?? null,\n mimeType: query.data?.mimeType ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * List documents the current member is allowed to see.\n *\n * Hits the member endpoint (`/documents/members/...`) which is NOT a\n * `/public/` path, so the core client automatically attaches the member's\n * `Authorization: Bearer <JWT>` header instead of the public API key.\n *\n * Returns public documents plus members/internal documents and section\n * documents for the member's sections. Items include `section_ids` and\n * uploader metadata (`uploaded_by_name`, `created_at`).\n */\nexport function useMemberDocuments(options?: DocumentQueryOptions) {\n const { client, orgId } = useAxCloudContext()\n const params = buildDocumentParams(options)\n const folderId = options?.folderId\n\n const query = useQuery<DocumentListResponse>({\n queryKey: ['axcloud', 'documents', 'member', 'list', orgId, options],\n queryFn: async () => {\n return client.get<DocumentListResponse>(`/documents/members/${orgId}/documents`, params)\n },\n staleTime: 1000 * 60 * 5,\n })\n\n const allItems = query.data?.items ?? []\n // Filter by folder client-side so the same cached list can back multiple\n // folder views without extra round-trips. Backward compatible: when no\n // `folderId` is provided every document is returned unchanged.\n const items = folderId\n ? allItems.filter((doc) => doc.folder_ids?.includes(folderId))\n : allItems\n\n return {\n documents: items,\n items,\n count: folderId ? items.length : query.data?.count ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * List the document folders the current member is allowed to see.\n *\n * Hits the member endpoint (`/documents/members/${orgId}/document-folders`),\n * which is NOT a `/public/` path, so the core client attaches the member's\n * `Authorization: Bearer <JWT>` header instead of the public API key.\n *\n * Returns the member's section folders plus org-level folders\n * (`section_id === null`). Use the returned folder ids with\n * `useMemberDocuments({ folderId })` to scope a document list.\n */\nexport function useMemberDocumentFolders() {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<DocumentFolderListResponse>({\n queryKey: ['axcloud', 'documents', 'member', 'folders', orgId],\n queryFn: async () => {\n return client.get<DocumentFolderListResponse>(\n `/documents/members/${orgId}/document-folders`\n )\n },\n staleTime: 1000 * 60 * 5,\n })\n\n return {\n folders: query.data?.folders ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\n/**\n * Fetch a short-lived signed download URL for a member-accessible document.\n */\nexport function useMemberDocumentDownload(documentId: string | undefined) {\n const { client, orgId } = useAxCloudContext()\n\n const query = useQuery<SignedDocumentUrl>({\n queryKey: ['axcloud', 'documents', 'member', 'download', orgId, documentId],\n queryFn: async () => {\n return client.get<SignedDocumentUrl>(\n `/documents/members/${orgId}/documents/${encodeURIComponent(documentId || '')}/download`\n )\n },\n enabled: !!documentId,\n staleTime: 1000 * 60 * 10,\n gcTime: 1000 * 60 * 14,\n })\n\n return {\n url: query.data?.url ?? null,\n documentUrl: query.data?.url ?? null,\n filename: query.data?.filename ?? null,\n mimeType: query.data?.mimeType ?? null,\n expiresIn: query.data?.expiresIn ?? null,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n\nexport type {\n DocumentFolder,\n DocumentFolderListResponse,\n DocumentItem,\n DocumentQueryOptions,\n SignedDocumentUrl,\n}\n","import React from 'react'\nimport { useAuth } from '../auth/useAuth'\n\ninterface LoginButtonProps {\n /**\n * Button text when not authenticated\n */\n children?: React.ReactNode\n\n /**\n * URL to return to after login\n */\n returnTo?: string\n\n /**\n * Additional CSS class names\n */\n className?: string\n\n /**\n * Inline styles\n */\n style?: React.CSSProperties\n}\n\n/**\n * LoginButton - Trigger Auth0 Universal Login\n *\n * @example\n * ```tsx\n * <LoginButton>Sign In</LoginButton>\n *\n * // With custom return URL\n * <LoginButton returnTo=\"/dashboard\">Sign In</LoginButton>\n *\n * // With styling\n * <LoginButton className=\"btn btn-primary\">Sign In</LoginButton>\n * ```\n */\nexport function LoginButton({\n children = 'Log in',\n returnTo,\n className,\n style,\n}: LoginButtonProps) {\n const { login, isLoading } = useAuth()\n\n const handleClick = () => {\n login({ returnTo })\n }\n\n return (\n <button\n onClick={handleClick}\n disabled={isLoading}\n className={className}\n style={style}\n type=\"button\"\n >\n {isLoading ? 'Loading...' : children}\n </button>\n )\n}\n\ninterface LogoutButtonProps {\n /**\n * Button text\n */\n children?: React.ReactNode\n\n /**\n * URL to return to after logout\n */\n returnTo?: string\n\n /**\n * Additional CSS class names\n */\n className?: string\n\n /**\n * Inline styles\n */\n style?: React.CSSProperties\n}\n\n/**\n * LogoutButton - Trigger logout\n *\n * @example\n * ```tsx\n * <LogoutButton>Sign Out</LogoutButton>\n * ```\n */\nexport function LogoutButton({\n children = 'Log out',\n returnTo,\n className,\n style,\n}: LogoutButtonProps) {\n const { logout } = useAuth()\n\n const handleClick = () => {\n logout({ returnTo })\n }\n\n return (\n <button\n onClick={handleClick}\n className={className}\n style={style}\n type=\"button\"\n >\n {children}\n </button>\n )\n}\n","import React from 'react';\nimport { useAuth } from '../auth/useAuth';\nimport { useUser } from '../auth/useUser';\nimport type { UserRole } from '../../core/types';\n\ninterface ProtectedRouteProps {\n /**\n * Content to render when authenticated\n */\n children: React.ReactNode;\n\n /**\n * Required role(s) to access this route\n */\n roles?: UserRole | UserRole[];\n\n /**\n * Component to render while loading\n */\n loadingComponent?: React.ReactNode;\n\n /**\n * Component to render when not authenticated\n */\n unauthenticatedComponent?: React.ReactNode;\n\n /**\n * Component to render when authenticated but lacking required role\n */\n unauthorizedComponent?: React.ReactNode;\n\n /**\n * Whether to automatically redirect to login when not authenticated\n * @default false\n */\n redirectToLogin?: boolean;\n\n /**\n * Return URL after login (only used with redirectToLogin)\n */\n returnTo?: string;\n}\n\n/**\n * ProtectedRoute - Require authentication to view content\n *\n * @example\n * ```tsx\n * // Basic usage\n * <ProtectedRoute>\n * <MemberContent />\n * </ProtectedRoute>\n *\n * // With role requirement\n * <ProtectedRoute roles=\"admin\">\n * <AdminDashboard />\n * </ProtectedRoute>\n *\n * // With multiple allowed roles\n * <ProtectedRoute roles={['admin', 'editor']}>\n * <ContentEditor />\n * </ProtectedRoute>\n *\n * // With custom fallbacks\n * <ProtectedRoute\n * loadingComponent={<Spinner />}\n * unauthenticatedComponent={<LoginPrompt />}\n * unauthorizedComponent={<AccessDenied />}\n * >\n * <ProtectedContent />\n * </ProtectedRoute>\n *\n * // Auto-redirect to login\n * <ProtectedRoute redirectToLogin>\n * <MemberArea />\n * </ProtectedRoute>\n * ```\n */\nexport function ProtectedRoute({\n children,\n roles,\n loadingComponent,\n unauthenticatedComponent,\n unauthorizedComponent,\n redirectToLogin = false,\n returnTo,\n}: ProtectedRouteProps) {\n const { isAuthenticated, isLoading: isAuthLoading, login } = useAuth();\n const { role, isLoading: isUserLoading } = useUser();\n\n const isLoading = isAuthLoading || (isAuthenticated && isUserLoading);\n\n // Show loading state\n if (isLoading) {\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>;\n }\n\n // Not authenticated\n if (!isAuthenticated) {\n if (redirectToLogin) {\n login({ returnTo: returnTo || window.location.pathname });\n return <>{loadingComponent ?? <DefaultLoadingComponent />}</>;\n }\n return <>{unauthenticatedComponent ?? <DefaultUnauthenticatedComponent />}</>;\n }\n\n // Check role requirements\n if (roles) {\n const requiredRoles = Array.isArray(roles) ? roles : [roles];\n const hasRequiredRole = role !== null && role !== undefined && requiredRoles.includes(role);\n\n if (!hasRequiredRole) {\n return <>{unauthorizedComponent ?? <DefaultUnauthorizedComponent />}</>;\n }\n }\n\n // All checks passed\n return <>{children}</>;\n}\n\n// Default fallback components (minimal styling)\nfunction DefaultLoadingComponent() {\n return <div style={{ padding: '20px', textAlign: 'center' }}>Loading...</div>;\n}\n\nfunction DefaultUnauthenticatedComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n <p>Please log in to view this content.</p>\n </div>\n );\n}\n\nfunction DefaultUnauthorizedComponent() {\n return (\n <div style={{ padding: '20px', textAlign: 'center' }}>\n <p>You don't have permission to view this content.</p>\n </div>\n );\n}\n","import React from 'react'\nimport { useOrg } from '../hooks/useOrg'\nimport type { AxCloudModule } from '../../core/types'\n\ninterface ModuleGateProps {\n /**\n * Required module(s) to render children\n */\n module: AxCloudModule | AxCloudModule[]\n\n /**\n * Content to render when module is enabled\n */\n children: React.ReactNode\n\n /**\n * Content to render when module is NOT enabled\n */\n fallback?: React.ReactNode\n\n /**\n * Whether ALL modules are required (true) or ANY module (false)\n * @default false (any)\n */\n requireAll?: boolean\n}\n\n/**\n * ModuleGate - Conditionally render based on organization modules\n *\n * Only renders children if the organization has the required module(s) enabled.\n *\n * @example\n * ```tsx\n * // Single module\n * <ModuleGate module=\"training\">\n * <TrainingSection />\n * </ModuleGate>\n *\n * // With fallback\n * <ModuleGate module=\"ai\" fallback={<UpgradePrompt />}>\n * <AIChatWidget />\n * </ModuleGate>\n *\n * // Multiple modules (any)\n * <ModuleGate module={['training', 'documents']}>\n * <LearningCenter />\n * </ModuleGate>\n *\n * // Multiple modules (all required)\n * <ModuleGate module={['training', 'ai']} requireAll>\n * <AITrainingAssistant />\n * </ModuleGate>\n * ```\n */\nexport function ModuleGate({\n module,\n children,\n fallback = null,\n requireAll = false,\n}: ModuleGateProps) {\n const { hasModule, isLoading } = useOrg()\n\n // While loading org data, don't render anything\n if (isLoading) {\n return null\n }\n\n const requiredModules = Array.isArray(module) ? module : [module]\n\n const hasAccess = requireAll\n ? requiredModules.every(m => hasModule(m))\n : requiredModules.some(m => hasModule(m))\n\n if (!hasAccess) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n\n/**\n * useModuleAccess - Hook for programmatic module checks\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * const { hasModule, modules } = useModuleAccess()\n *\n * return (\n * <nav>\n * <Link to=\"/news\">News</Link>\n * {hasModule('training') && <Link to=\"/training\">Training</Link>}\n * {hasModule('ai') && <Link to=\"/chat\">AI Chat</Link>}\n * </nav>\n * )\n * }\n * ```\n */\nexport function useModuleAccess() {\n const { hasModule, modules, isLoading } = useOrg()\n\n return {\n hasModule,\n modules,\n isLoading,\n }\n}\n","/**\n * LinkedAccountsList Component\n *\n * Ready-to-use component for displaying and managing linked social accounts.\n * Can be used in customer frontends (SPF \"mina sidor\" etc.).\n *\n * Import the CSS file for default styling:\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n *\n * @example\n * ```tsx\n * import { LinkedAccountsList } from '@axcode/axcloud-sdk'\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n *\n * function MinProfil() {\n * return (\n * <div>\n * <h2>Kopplade konton</h2>\n * <LinkedAccountsList providers={['google', 'microsoft']} />\n * </div>\n * )\n * }\n * ```\n */\n\nimport React from 'react'\nimport { useLinkedAccounts, LinkedIdentity, AvailableProvider } from '../hooks/useLinkedAccounts'\n\nexport interface LinkedAccountsListProps {\n /** Which providers to show (default: all available) */\n providers?: ('google' | 'microsoft' | 'apple')[]\n /** Show connect buttons for unlinked providers */\n showConnectButtons?: boolean\n /** Custom class name for the container */\n className?: string\n /** Callback when an account is successfully unlinked */\n onUnlink?: (provider: string) => void\n /** Callback when link flow is initiated */\n onLinkInitiated?: (provider: string) => void\n /** Custom render for identity items */\n renderIdentity?: (identity: LinkedIdentity, onUnlink: () => void) => React.ReactNode\n /** Custom render for available provider items */\n renderAvailableProvider?: (provider: AvailableProvider, onLink: () => void) => React.ReactNode\n}\n\n// Default provider icons as inline SVG\n/**\n * Supported OAuth providers for account linking\n */\nconst SUPPORTED_OAUTH_PROVIDERS = ['google', 'microsoft', 'apple'] as const\ntype SupportedOAuthProvider = typeof SUPPORTED_OAUTH_PROVIDERS[number]\n\n/**\n * Type guard to validate if a provider string is a supported OAuth provider\n */\nfunction isSupportedOAuthProvider(provider: string): provider is SupportedOAuthProvider {\n return SUPPORTED_OAUTH_PROVIDERS.includes(provider as SupportedOAuthProvider)\n}\n\nconst ProviderIcons: Record<string, React.FC<{ className?: string }>> = {\n google: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n ),\n microsoft: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className}>\n <path fill=\"#F25022\" d=\"M1 1h10v10H1z\"/>\n <path fill=\"#00A4EF\" d=\"M1 13h10v10H1z\"/>\n <path fill=\"#7FBA00\" d=\"M13 1h10v10H13z\"/>\n <path fill=\"#FFB900\" d=\"M13 13h10v10H13z\"/>\n </svg>\n ),\n apple: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M18.71 19.5c-.83 1.24-1.71 2.45-3.05 2.47-1.34.03-1.77-.79-3.29-.79-1.53 0-2 .77-3.27.82-1.31.05-2.3-1.32-3.14-2.53C4.25 17 2.94 12.45 4.7 9.39c.87-1.52 2.43-2.48 4.12-2.51 1.28-.02 2.5.87 3.29.87.78 0 2.26-1.07 3.81-.91.65.03 2.47.26 3.64 1.98-.09.06-2.17 1.28-2.15 3.81.03 3.02 2.65 4.03 2.68 4.04-.03.07-.42 1.44-1.38 2.83M13 3.5c.73-.83 1.94-1.46 2.94-1.5.13 1.17-.34 2.35-1.04 3.19-.69.85-1.83 1.51-2.95 1.42-.15-1.15.41-2.35 1.05-3.11z\"/>\n </svg>\n ),\n email: ({ className }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/>\n <polyline points=\"22,6 12,13 2,6\"/>\n </svg>\n ),\n}\n\n/**\n * LinkedAccountsList - Ready-to-use component for managing linked accounts\n *\n * Uses CSS classes for styling. Import the CSS file for default styles:\n * import '@axcode/axcloud-sdk/styles/linked-accounts.css'\n */\nexport function LinkedAccountsList({\n providers,\n showConnectButtons = true,\n className,\n onUnlink,\n onLinkInitiated,\n renderIdentity,\n renderAvailableProvider,\n}: LinkedAccountsListProps) {\n const {\n identities,\n availableProviders,\n canUnlink,\n isLoading,\n error,\n linkAccount,\n unlinkAccount,\n } = useLinkedAccounts()\n\n // Filter providers if specified\n const filteredIdentities = providers\n ? identities.filter(i =>\n providers.some(p =>\n i.provider.toLowerCase().includes(p) ||\n i.provider_icon === p\n )\n )\n : identities\n\n const filteredAvailableProviders = providers\n ? availableProviders.filter(p =>\n providers.some(provider =>\n p.provider.toLowerCase().includes(provider) ||\n p.icon === provider\n )\n )\n : availableProviders\n\n const handleUnlink = (provider: string) => {\n unlinkAccount(provider)\n onUnlink?.(provider)\n }\n\n const handleLink = (provider: 'google' | 'microsoft' | 'apple') => {\n onLinkInitiated?.(provider)\n linkAccount(provider)\n }\n\n if (isLoading) {\n return (\n <div className={`axcloud-linked-accounts__loading ${className || ''}`}>\n Loading linked accounts...\n </div>\n )\n }\n\n if (error) {\n return (\n <div className={`axcloud-linked-accounts__error ${className || ''}`}>\n Failed to load linked accounts. Please try again.\n </div>\n )\n }\n\n const getIcon = (iconName: string, muted = false) => {\n const IconComponent = ProviderIcons[iconName] || ProviderIcons.email\n const iconClass = muted\n ? 'axcloud-linked-accounts__icon axcloud-linked-accounts__icon--muted'\n : 'axcloud-linked-accounts__icon'\n return <IconComponent className={iconClass} />\n }\n\n return (\n <div className={`axcloud-linked-accounts ${className || ''}`}>\n {/* Connected Accounts */}\n {filteredIdentities.map((identity) => {\n if (renderIdentity) {\n return renderIdentity(identity, () => handleUnlink(identity.provider))\n }\n\n return (\n <div key={`${identity.provider}-${identity.user_id}`} className=\"axcloud-linked-accounts__item\">\n <div className=\"axcloud-linked-accounts__info\">\n {getIcon(identity.provider_icon)}\n <div>\n <div className=\"axcloud-linked-accounts__name-row\">\n <span className=\"axcloud-linked-accounts__provider-name\">\n {identity.provider_display_name}\n </span>\n {identity.is_primary && (\n <span className=\"axcloud-linked-accounts__badge\">Primary</span>\n )}\n </div>\n {identity.profile_data?.email && (\n <div className=\"axcloud-linked-accounts__email\">\n {identity.profile_data.email}\n </div>\n )}\n </div>\n </div>\n <div className=\"axcloud-linked-accounts__actions\">\n <span className=\"axcloud-linked-accounts__connected\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n Connected\n </span>\n {canUnlink && !identity.is_primary && (\n <button\n onClick={() => handleUnlink(identity.provider)}\n className=\"axcloud-linked-accounts__button axcloud-linked-accounts__button--disconnect\"\n >\n Disconnect\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Available Providers */}\n {showConnectButtons &&\n filteredAvailableProviders.map((provider) => {\n if (renderAvailableProvider) {\n return renderAvailableProvider(provider, () => {\n if (isSupportedOAuthProvider(provider.provider)) {\n handleLink(provider.provider)\n }\n })\n }\n\n return (\n <div key={provider.provider} className=\"axcloud-linked-accounts__available\">\n <div className=\"axcloud-linked-accounts__info\">\n {getIcon(provider.icon, true)}\n <div>\n <span className=\"axcloud-linked-accounts__provider-name\">\n {provider.display_name}\n </span>\n <div className=\"axcloud-linked-accounts__email\">Not connected</div>\n </div>\n </div>\n <button\n onClick={() => {\n if (isSupportedOAuthProvider(provider.provider)) {\n handleLink(provider.provider)\n }\n }}\n className=\"axcloud-linked-accounts__button axcloud-linked-accounts__button--connect\"\n >\n Connect\n </button>\n </div>\n )\n })}\n </div>\n )\n}\n\nexport default LinkedAccountsList\n"]}
|