@letar/forms 1.1.0 → 1.2.0
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/CHANGELOG.md +308 -0
- package/README.md +9 -9
- package/README.ru.md +115 -30
- package/analytics.js +3 -0
- package/analytics.js.map +1 -0
- package/chunk-2PSXYC3I.js +1782 -0
- package/chunk-2PSXYC3I.js.map +1 -0
- package/chunk-5D6S6EGF.js +206 -0
- package/chunk-5D6S6EGF.js.map +1 -0
- package/{chunk-6QOPSQ3Z.js → chunk-6E7VJAJT.js} +3 -3
- package/{chunk-6QOPSQ3Z.js.map → chunk-6E7VJAJT.js.map} +1 -1
- package/chunk-CGXKRCSM.js +117 -0
- package/chunk-CGXKRCSM.js.map +1 -0
- package/{chunk-M2PNAAIR.js → chunk-DQUVUMCX.js} +30 -19
- package/chunk-DQUVUMCX.js.map +1 -0
- package/chunk-K3J4L26K.js +345 -0
- package/chunk-K3J4L26K.js.map +1 -0
- package/{chunk-PJETA6YN.js → chunk-MAYUFA5K.js} +5 -4
- package/chunk-MAYUFA5K.js.map +1 -0
- package/{chunk-4V6WBJ76.js → chunk-MVGXZNHP.js} +2 -2
- package/{chunk-4V6WBJ76.js.map → chunk-MVGXZNHP.js.map} +1 -1
- package/{chunk-XKKJKYWZ.js → chunk-MZDTJSF7.js} +3 -3
- package/{chunk-XKKJKYWZ.js.map → chunk-MZDTJSF7.js.map} +1 -1
- package/{chunk-KUNT5MSU.js → chunk-Q5EOF36Y.js} +3 -3
- package/chunk-Q5EOF36Y.js.map +1 -0
- package/{chunk-7FEQFDJ7.js → chunk-R2RTCKXY.js} +2 -2
- package/{chunk-7FEQFDJ7.js.map → chunk-R2RTCKXY.js.map} +1 -1
- package/{chunk-HWVOFWAT.js → chunk-XFWLD5EO.js} +225 -26
- package/chunk-XFWLD5EO.js.map +1 -0
- package/fields/boolean.js +3 -3
- package/fields/datetime.js +3 -3
- package/fields/number.js +3 -3
- package/fields/selection.js +3 -3
- package/fields/specialized.js +3 -3
- package/fields/text.js +3 -3
- package/hcaptcha-U4XIT3HS.js +64 -0
- package/hcaptcha-U4XIT3HS.js.map +1 -0
- package/i18n.js +1 -1
- package/index.js +3268 -51
- package/index.js.map +1 -1
- package/offline.js +1 -1
- package/package.json +33 -4
- package/recaptcha-PKAUAY2S.js +56 -0
- package/recaptcha-PKAUAY2S.js.map +1 -0
- package/server-errors.js +3 -0
- package/server-errors.js.map +1 -0
- package/turnstile-7FXTBSLW.js +36 -0
- package/turnstile-7FXTBSLW.js.map +1 -0
- package/validators/ru.js +73 -0
- package/validators/ru.js.map +1 -0
- package/chunk-GOELIS6T.js +0 -849
- package/chunk-GOELIS6T.js.map +0 -1
- package/chunk-HWVOFWAT.js.map +0 -1
- package/chunk-KUNT5MSU.js.map +0 -1
- package/chunk-M2PNAAIR.js.map +0 -1
- package/chunk-PJETA6YN.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/declarative/form-fields/specialized/providers/dadata.ts","../src/lib/declarative/form-fields/specialized/field-address.tsx","../src/lib/declarative/form-fields/specialized/field-color-picker.tsx","../src/lib/declarative/security/file-security.ts","../src/lib/declarative/form-fields/specialized/field-file-upload.tsx","../src/lib/declarative/form-fields/specialized/field-otp-input.tsx","../src/lib/declarative/form-fields/specialized/field-phone.tsx","../src/lib/declarative/form-fields/specialized/field-pin-input.tsx","../src/lib/declarative/form-fields/specialized/field-city.tsx","../src/lib/declarative/form-fields/specialized/field-signature.tsx","../src/lib/declarative/form-fields/specialized/credit-card/card-brand-icon.tsx","../src/lib/declarative/form-fields/specialized/credit-card/utils/detect-brand.ts","../src/lib/declarative/form-fields/specialized/credit-card/utils/format-expiry.ts","../src/lib/declarative/form-fields/specialized/credit-card/utils/format-number.ts","../src/lib/declarative/form-fields/specialized/credit-card/utils/luhn.ts","../src/lib/declarative/form-fields/specialized/credit-card/credit-card-field.tsx","../src/lib/declarative/form-fields/specialized/credit-card/credit-card-schema.ts"],"names":["jsxs","Field","jsx","HStack","useState","Box","Text","Input","useEffect","useCallback","Button","PinInput","useRef","Spinner","List","Group"],"mappings":";;;;;;;;;AAEA,IAAM,UAAA,GAAa,sEAAA;AAqBZ,SAAS,qBAAqB,MAAA,EAAuC;AAC1E,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,GAAU,UAAA,EAAW,GAAI,MAAA;AAExC,EAAA,OAAO;AAAA,IACL,MAAM,cAAA,CAAe,KAAA,EAAe,OAAA,EAA2D;AAE7F,MAAA,MAAM,IAAA,GAA4B;AAAA,QAChC,KAAA;AAAA,QACA,KAAA,EAAO,SAAS,KAAA,IAAS;AAAA,OAC3B;AAGA,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,IAAI,OAAA,CAAQ,OAAO,IAAA,EAAM,IAAA,CAAK,aAAa,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAK;AACxE,QAAA,IAAI,OAAA,CAAQ,OAAO,EAAA,EAAI,IAAA,CAAK,WAAW,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,EAAA,EAAG;AAAA,MACpE;AAGA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,IAAA,CAAK,SAAA,GAAY,CAAC,OAAA,CAAQ,OAAO,CAAA;AAAA,MACnC;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAS;AAAA,QACpC,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,MAAA,EAAQ,kBAAA;AAAA,UACR,aAAA,EAAe,SAAS,KAAK,CAAA;AAAA,SAC/B;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,OAC1B,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,IAAe,EAAC;AAEzC,MAAA,OAAO,WAAA,CAAY,GAAA;AAAA;AAAA,QAEjB,CAAC,CAAA,MAA+B;AAAA,UAC9B,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,MAAM,CAAA,CAAE;AAAA,SACV;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AC3DA,SAAS,kBAAA,CAAmB,cAAgC,KAAA,EAAwC;AAClG,EAAA,MAAM,cAAc,0BAAA,EAA2B;AAG/C,EAAA,IAAI,cAAc,OAAO,YAAA;AACzB,EAAA,IAAI,WAAA,EAAa,eAAA,EAAiB,OAAO,WAAA,CAAY,eAAA;AACrD,EAAA,IAAI,KAAA,EAAO,OAAO,oBAAA,CAAqB,EAAE,OAAO,CAAA;AAChD,EAAA,OAAO,IAAA;AACT;AA4CO,IAAM,eAAe,WAAA,CAAyE;AAAA,EACnG,WAAA,EAAa,cAAA;AAAA,EAEb,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,IAAA,MAAM,EAAE,UAAU,YAAA,EAAc,KAAA,EAAO,WAAW,CAAA,EAAG,UAAA,GAAa,GAAA,EAAK,SAAA,EAAU,GAAI,KAAA;AACrF,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,YAAA,EAAc,KAAK,CAAA;AAEvD,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,EAAE,CAAA;AAC/C,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAA8B,EAAE,CAAA;AACtE,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAS,EAAE,CAAA;AAC3D,IAAA,MAAM,YAAA,GAAe,OAA8B,IAAI,CAAA;AACvD,IAAA,MAAM,cAAA,GAAiB,OAAO,KAAK,CAAA;AAEnC,IAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,UAAA,EAAY,UAAU,CAAA;AAGzD,IAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,MACvB,OAAO,KAAA,KAAkB;AACvB,QAAA,IAAI,KAAA,CAAM,MAAA,GAAS,QAAA,IAAY,CAAC,QAAA,EAAU;AACxC,UAAA,cAAA,CAAe,EAAE,CAAA;AACjB,UAAA;AAAA,QACF;AAEA,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,cAAA,CAAe,KAAA,EAAO;AAAA,YACnD,KAAA,EAAO,EAAA;AAAA,YACP,OAAA,EAAS,YAAY,MAAA,CAAO,MAAA,CAAO,EAAC,EAAG,GAAG,SAAS,CAAA,GAAI,KAAA;AAAA,WACxD,CAAA;AACD,UAAA,cAAA,CAAe,OAAO,CAAA;AACtB,UAAA,SAAA,CAAU,IAAI,CAAA;AAAA,QAChB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,UAAA,cAAA,CAAe,EAAE,CAAA;AAAA,QACnB,CAAA,SAAE;AACA,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS;AAAA,KAChC;AAGA,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,gBAAA,CAAiB,cAAc,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,EAAE,CAAA;AACjB,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA,EAAG,CAAC,cAAA,EAAgB,gBAAgB,CAAC,CAAA;AAGrC,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,QAAA,IAAI,YAAA,CAAa,WAAW,CAAC,YAAA,CAAa,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAAG;AAChF,UAAA,SAAA,CAAU,KAAK,CAAA;AAAA,QACjB;AAAA,MACF,CAAA;AAEA,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,IAC3E,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,QAAA,EAAU,YAAA,EAAc,cAAA,EAAgB,UAAA,EAAW,KAAoB;AAC3G,IAAA,MAAM,EAAE,SAAA,GAAY,KAAA,EAAM,GAAI,cAAA;AAC9B,IAAA,MAAM;AAAA,MACJ,UAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF,GAAI,UAAA;AAEJ,IAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,KAAA;AAG/B,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA,IAAW,UAAA,EAAY;AACzC,MAAA,MAAM,YAAA,GAAe,OAAO,UAAA,KAAe,QAAA,GAAW,aAAa,UAAA,CAAW,KAAA;AAC9E,MAAA,IAAI,YAAA,IAAgB,iBAAiB,UAAA,EAAY;AAC/C,QAAA,aAAA,CAAc,YAAY,CAAA;AAAA,MAC5B;AACA,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B;AAGA,IAAA,MAAM,YAAA,GAAe,CAAC,UAAA,KAAkC;AACtD,MAAA,aAAA,CAAc,WAAW,KAAK,CAAA;AAC9B,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,cAAA,CAAe,EAAE,CAAA;AAEjB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,CAAM,YAAA,CAAa,WAAW,KAAK,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,MAAM,YAAA,GAA6B;AAAA,UACjC,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,MAAM,UAAA,CAAW;AAAA,SACnB;AACA,QAAA,KAAA,CAAM,aAAa,YAAY,CAAA;AAAA,MACjC;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2B;AAChD,MAAA,IAAI,CAAC,MAAA,IAAU,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACvC,QAAA;AAAA,MACF;AAEA,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,WAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,mBAAA,CAAoB,mBAAmB,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,gBAAA,GAAmB,IAAI,CAAC,CAAA;AACxF,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,mBAAA,CAAoB,mBAAmB,CAAA,GAAI,gBAAA,GAAmB,CAAA,GAAI,WAAA,CAAY,SAAS,CAAC,CAAA;AACxF,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,YAAA,YAAA,CAAa,WAAA,CAAY,gBAAgB,CAAC,CAAA;AAAA,UAC5C;AACA,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA;AAAA;AACJ,IACF,CAAA;AAEA,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA,CAAM,IAAA;AAAA,MAAN;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QAEnB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAO,QAAA,CAAS,KAAA,EAAO,SAAS,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AAAA,+BAC1F,GAAA,EAAA,EAAI,GAAA,EAAK,cAAc,QAAA,EAAS,UAAA,EAAW,OAAM,MAAA,EAChD,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,UAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAC5B,kBAAA,mBAAA,CAAoB,EAAE,CAAA;AAAA,gBACxB,CAAA;AAAA,gBACA,SAAS,MAAM;AACb,kBAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,oBAAA,SAAA,CAAU,IAAI,CAAA;AAAA,kBAChB;AAAA,gBACF,CAAA;AAAA,gBACA,QAAQ,KAAA,CAAM,UAAA;AAAA,gBACd,SAAA,EAAW,aAAA;AAAA,gBACX,WAAA,EAAa,SAAS,WAAA,IAAe,yBAAA;AAAA,gBACrC,iBAAA,EAAiB;AAAA;AAAA,aACnB;AAAA,YACC,SAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAI,QAAA,EAAS,YAAW,KAAA,EAAO,CAAA,EAAG,GAAA,EAAI,KAAA,EAAM,WAAU,kBAAA,EACrD,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,MAAK,CAAA,EACrB,CAAA;AAAA,YAED,MAAA,IAAU,WAAA,CAAY,MAAA,GAAS,CAAA,oBAC9B,GAAA;AAAA,cAAC,IAAA,CAAK,IAAA;AAAA,cAAL;AAAA,gBACC,QAAA,EAAS,UAAA;AAAA,gBACT,MAAA,EAAQ,EAAA;AAAA,gBACR,KAAA,EAAM,MAAA;AAAA,gBACN,EAAA,EAAG,UAAA;AAAA,gBACH,WAAA,EAAY,KAAA;AAAA,gBACZ,YAAA,EAAa,IAAA;AAAA,gBACb,MAAA,EAAO,IAAA;AAAA,gBACP,IAAA,EAAK,OAAA;AAAA,gBACL,SAAA,EAAU,MAAA;AAAA,gBACV,EAAA,EAAI,CAAA;AAAA,gBAEH,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,EAAY,KAAA,qBAC5B,GAAA;AAAA,kBAAC,IAAA,CAAK,IAAA;AAAA,kBAAL;AAAA,oBAEC,EAAA,EAAI,CAAA;AAAA,oBACJ,EAAA,EAAI,CAAA;AAAA,oBACJ,MAAA,EAAO,SAAA;AAAA,oBACP,EAAA,EAAI,gBAAA,KAAqB,KAAA,GAAQ,UAAA,GAAa,MAAA;AAAA,oBAC9C,MAAA,EAAQ,EAAE,EAAA,EAAI,UAAA,EAAW;AAAA,oBACzB,OAAA,EAAS,MAAM,YAAA,CAAa,UAAU,CAAA;AAAA,oBACtC,YAAA,EAAc,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,oBAE7C,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAS,IAAA,EAAM,qBAAW,KAAA,EAAM;AAAA,mBAAA;AAAA,kBATjC,WAAW,KAAA,GAAQ;AAAA,iBAW3B;AAAA;AAAA;AACH,WAAA,EAEJ,CAAA;AAAA,8BACC,UAAA,EAAA,EAAW,QAAA,EAAoB,YAAA,EAA4B,UAAA,EAAY,SAAS,UAAA,EAAY;AAAA;AAAA;AAAA,KAC/F;AAAA,EAEJ;AACF,CAAC;AC5PD,IAAM,eAAA,GAAkB;AAAA,EACtB,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAoCO,IAAM,mBAAmB,WAAA,CAA2C;AAAA,EACzE,WAAA,EAAa,kBAAA;AAAA,EAEb,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,cAAA,EAAe,KAAoB;AAC/F,IAAA,MAAM;AAAA,MACJ,QAAA,GAAW,eAAA;AAAA,MACX,IAAA,GAAO,IAAA;AAAA,MACP,QAAA,GAAW,IAAA;AAAA,MACX,cAAA,GAAiB,IAAA;AAAA,MACjB,WAAA,GAAc,IAAA;AAAA,MACd,SAAA,GAAY;AAAA,KACd,GAAI,cAAA;AAEJ,IAAA,MAAM,YAAA,GAAgB,KAAA,CAAM,KAAA,CAAM,KAAA,IAAoB,SAAA;AAGtD,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,WAAA,GAAc,WAAW,YAAY,CAAA;AAAA,IACvC,CAAA,CAAA,MAAQ;AACN,MAAA,WAAA,GAAc,WAAW,SAAS,CAAA;AAAA,IACpC;AAEA,IAAA,uBACEA,IAAAA;AAAA,MAACC,KAAAA,CAAM,IAAA;AAAA,MAAN;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QAEnB,QAAA,EAAA;AAAA,0BAAAD,IAAAA;AAAA,YAAC,WAAA,CAAY,IAAA;AAAA,YAAZ;AAAA,cACC,KAAA,EAAO,WAAA;AAAA,cACP,aAAA,EAAe,CAAC,OAAA,KAAY;AAE1B,gBAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,aAAa,CAAA;AAAA,cAC1C,CAAA;AAAA,cACA,UAAU,QAAA,CAAS,QAAA;AAAA,cACnB,UAAU,QAAA,CAAS,QAAA;AAAA,cACnB,IAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAE,GAAAA,CAAC,WAAA,CAAY,WAAA,EAAZ,EAAwB,MAAM,QAAA,EAAU,CAAA;AAAA,gBAExC,SAAS,KAAA,oBACRF,IAAAA,CAAC,WAAA,CAAY,OAAZ,EACE,QAAA,EAAA;AAAA,kBAAA,QAAA,CAAS,OAAA,mBACRA,IAAAA,CAAC,MAAA,EAAA,EAAO,KAAK,CAAA,EACX,QAAA,EAAA;AAAA,oCAAAE,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,CAAS,KAAA,EAAM,CAAA;AAAA,oCACtBA,GAAAA,CAAC,YAAA,EAAA,EAAc,GAAG,SAAS,OAAA,EAAS;AAAA,mBAAA,EACtC,IAEA,QAAA,CAAS,KAAA;AAAA,kBAEV,SAAS,QAAA,oBAAYA,GAAAA,CAACD,KAAAA,CAAM,mBAAN,EAAwB;AAAA,iBAAA,EACjD,CAAA;AAAA,gCAGFD,IAAAA,CAAC,WAAA,CAAY,OAAA,EAAZ,EACE,QAAA,EAAA;AAAA,kBAAA,SAAA,oBAAaE,GAAAA,CAAC,WAAA,CAAY,YAAA,EAAZ,EAAyB,SAAQ,KAAA,EAAM,CAAA;AAAA,kCACtDA,GAAAA,CAAC,WAAA,CAAY,OAAA,EAAZ,EAAoB;AAAA,iBAAA,EACvB,CAAA;AAAA,gCAEAA,GAAAA,CAAC,MAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,WAAA,CAAY,UAAA,EAAZ,EACC,QAAA,kBAAAF,IAAAA,CAAC,WAAA,CAAY,OAAA,EAAZ,EACE,QAAA,EAAA;AAAA,kBAAA,QAAA,oBAAYE,GAAAA,CAAC,WAAA,CAAY,IAAA,EAAZ,EAAiB,CAAA;AAAA,kBAAA,CAE7B,cAAA,IAAkB,WAAA,qBAClBF,IAAAA,CAAC,MAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,cAAA,oBAAkBE,IAAC,WAAA,CAAY,UAAA,EAAZ,EAAuB,IAAA,EAAK,IAAA,EAAK,SAAQ,SAAA,EAAU,CAAA;AAAA,oBACtE,WAAA,oBAAeA,GAAAA,CAAC,WAAA,CAAY,SAAZ,EAAoB;AAAA,mBAAA,EACvC,CAAA;AAAA,kBAGD,QAAA,CAAS,MAAA,GAAS,CAAA,oBACjBA,GAAAA,CAAC,WAAA,CAAY,WAAA,EAAZ,EACE,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,MAAA,qBACbA,GAAAA,CAAC,WAAA,CAAY,aAAA,EAAZ,EAAuC,KAAA,EAAO,MAAA,EAC7C,QAAA,kBAAAA,GAAAA,CAAC,YAAY,MAAA,EAAZ,EAAmB,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,CAAA,EAAA,EADnB,MAEhC,CACD,CAAA,EACH;AAAA,iBAAA,EAEJ,GACF,CAAA,EACF;AAAA;AAAA;AAAA,WACF;AAAA,0BAEAA,GAAAA,CAAC,UAAA,EAAA,EAAW,UAAoB,YAAA,EAA4B,UAAA,EAAY,SAAS,UAAA,EAAY;AAAA;AAAA;AAAA,KAC/F;AAAA,EAEJ;AACF,CAAC;;;AClKD,IAAM,eAAA,GAA4D;AAAA;AAAA,EAEhE,EAAE,OAAO,CAAC,GAAA,EAAM,KAAM,GAAI,CAAA,EAAG,MAAM,YAAA,EAAa;AAAA,EAChD,EAAE,OAAO,CAAC,GAAA,EAAM,IAAM,EAAA,EAAM,EAAI,CAAA,EAAG,IAAA,EAAM,WAAA,EAAY;AAAA,EACrD,EAAE,OAAO,CAAC,EAAA,EAAM,IAAM,EAAA,EAAM,EAAI,CAAA,EAAG,IAAA,EAAM,WAAA,EAAY;AAAA,EACrD,EAAE,OAAO,CAAC,EAAA,EAAM,IAAM,EAAA,EAAM,EAAI,CAAA,EAAG,IAAA,EAAM,YAAA,EAAa;AAAA;AAAA;AAAA,EAEtD,EAAE,OAAO,CAAC,EAAA,EAAM,IAAM,EAAA,EAAM,EAAI,CAAA,EAAG,IAAA,EAAM,iBAAA,EAAkB;AAAA;AAAA,EAE3D,EAAE,OAAO,CAAC,EAAA,EAAM,IAAM,CAAA,EAAM,CAAI,CAAA,EAAG,IAAA,EAAM,iBAAA;AAC3C,CAAA;AAmCO,SAAS,cAAc,IAAA,EAA+B;AAC3D,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AAErC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,mCAAmC,CAAA;AAC5D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAElC,EAAA,MAAM,WAAA,GAAsC;AAAA,IAC1C,CAAA,EAAG,CAAA;AAAA,IACH,EAAA,EAAI,IAAA;AAAA,IACJ,IAAI,IAAA,GAAO,IAAA;AAAA,IACX,EAAA,EAAI,OAAO,IAAA,GAAO;AAAA,GACpB;AAEA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,WAAA,CAAY,IAAI,CAAC,CAAA;AAC7C;AAMA,eAAsB,eAAe,IAAA,EAAoC;AACvE,EAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AAClD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAM,CAAA;AAEnC,EAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG;AAC7C,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,eAAsB,gBAAA,CACpB,MACA,YAAA,EAC2E;AAC3E,EAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,IAAI,CAAA;AAG9C,EAAA,MAAM,WAAA,GAAc,gBAAgB,IAAA,CAAK,IAAA;AAEzC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,YAAA,EAAc,QAAQ,+BAAA,EAAgC;AAAA,EAC/E;AAGA,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,CAAC,OAAA,KAAY;AAC/C,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACrC,MAAA,OAAO,WAAA,CAAY,UAAA,CAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,OAAA,KAAY,WAAA;AAAA,EACrB,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,YAAA;AAAA,MACA,QAAQ,CAAA,WAAA,EAAc,WAAW,8BAA8B,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACxF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,YAAA,EAAa;AACrC;AAMA,eAAsB,kBAAkB,IAAA,EAA2B;AAEjE,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,SAAS,eAAA,EAAiB;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY;AACpC,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAEpC,IAAA,GAAA,CAAI,SAAS,MAAM;AACjB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,YAAA;AACnB,MAAA,MAAA,CAAO,SAAS,GAAA,CAAI,aAAA;AAEpB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACvB,QAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,QAAA;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAGvB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,KAAS,WAAA,GAAc,WAAA,GAAc,YAAA;AAC7D,MAAA,MAAM,OAAA,GAAU,UAAA,KAAe,YAAA,GAAe,IAAA,GAAO,MAAA;AAErD,MAAA,MAAA,CAAO,MAAA;AAAA,QACL,CAAC,IAAA,KAAS;AACR,UAAA,IAAI,CAAC,IAAA,EAAM;AACT,YAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,YAAA;AAAA,UACF;AACA,UAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,CAAC,IAAI,GAAG,IAAA,CAAK,IAAA,EAAM,EAAE,IAAA,EAAM,YAAY,YAAA,EAAc,IAAA,CAAK,GAAA,EAAI,EAAG,CAAC,CAAA;AAAA,QACrF,CAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAEA,IAAA,GAAA,CAAI,UAAU,MAAM;AAClB,MAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACvB,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AAEA,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,EACZ,CAAC,CAAA;AACH;AAMO,SAAS,iBAAiB,IAAA,EAAkB;AAEjD,EAAA,MAAM,QAAA,GAAW,KAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,GAAA,MAAS,IAAA,CAAK,IAAA;AACxD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACxC,EAAA,MAAM,MAAM,OAAA,GAAU,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,GAAI,EAAA;AAGpD,EAAA,MAAM,IAAA,GAAO,OAAO,UAAA,EAAW;AAC/B,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,EAAG,GAAG,CAAA,CAAA;AAE9B,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,QAAA,EAAU,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,IAAA,CAAK,cAAc,CAAA;AACxF;AAMA,eAAsB,uBAAA,CAAwB,MAAY,MAAA,EAAyD;AAEjH,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAC7C,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,IAAA;AAAA,QACA,MAAA,EAAQ,aAAa,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,eAAA,EAAkB,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,OAClF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,YAAA,EAAc;AACvB,IAAA,MAAM,UAAA,GAAa,MAAM,gBAAA,CAAiB,IAAA,EAAM,OAAO,YAAY,CAAA;AACnE,IAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,WAAW,MAAA,EAAO;AAAA,IACzD;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,GAAgB,IAAA;AAGpB,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,aAAA,GAAgB,MAAM,kBAAkB,aAAa,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,aAAA,GAAgB,iBAAiB,aAAa,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,aAAA,EAAc;AAC5C;AAKA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;AC7KA,SAAS,aAAA,CAAc,EAAE,SAAA,EAAU,EAA4B;AAC7D,EAAA,MAAM,aAAa,oBAAA,EAAqB;AAExC,EAAA,IAAI,UAAA,CAAW,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEA,GAAAA,CAACC,MAAAA,EAAA,EAAO,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,GAAA,EAAI,EAAA,EAAG,GAAA,EAC5B,QAAA,EAAA,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,qBAC7BH,IAAAA,CAAC,UAAA,CAAW,IAAA,EAAX,EAAgC,IAAA,EAAY,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,MAAA,EAAO,GAAA,EAAI,UAAA,EACjE,QAAA,EAAA;AAAA,IAAA,SAAA,oBACCE,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EACf,QAAA,kBAAAA,GAAAA,CAAC,UAAA,CAAW,iBAAA,EAAX,EAA6B,OAAA,EAAO,IAAA,EACnC,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAK,KAAA,EAAM,OAAA,EAAQ,OAAA,EAAQ,YAAA,EAAa,KAAA,EAAM,OAAA,EAAQ,MAAA,EAChE,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAI,CAAA,EACP,CAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEFA,IAAC,UAAA,CAAW,WAAA,EAAX,EAAuB,IAAA,EAAK,SAAA,EAAU,SAAO,IAAA,EAC5C,QAAA,kBAAAA,IAAC,UAAA,CAAW,gBAAA,EAAX,EAA4B,OAAA,EAAQ,IAAA,EAAK,SAAQ,IAAA,EAAK,SAAA,EAAU,SAAQ,CAAA,EAC3E,CAAA;AAAA,oBACAA,IAAC,UAAA,CAAW,WAAA,EAAX,EAAuB,IAAA,EAAK,IAAA,EAAK,SAAO,IAAA,EACvC,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAK,QAAA,EAAS,OAAM,KAAA,EAAM,UAAA,EACzB,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,GACV,CAAA,EACF;AAAA,GAAA,EAAA,EAjBoB,IAAA,CAAK,IAkB3B,CACD,CAAA,EACH,CAAA;AAEJ;AAKA,SAAS,QAAA,CAAS,EAAE,QAAA,EAAU,SAAA,EAAU,EAAgD;AACtF,EAAA,MAAM,aAAa,oBAAA,EAAqB;AAExC,EAAA,IAAI,UAAA,CAAW,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEA,GAAAA,CAAC,UAAA,CAAW,SAAA,EAAX,EAAqB,IAAG,GAAA,EACtB,QAAA,EAAA,UAAA,CAAW,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,qBAC7BF,KAAC,UAAA,CAAW,IAAA,EAAX,EAAgC,IAAA,EAC/B,QAAA,EAAA;AAAA,oBAAAE,IAAC,UAAA,CAAW,WAAA,EAAX,EAAuB,OAAA,EAAO,MAC7B,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAS,MAAK,KAAA,EAAM,UAAA,EACxB,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAO,GACV,CAAA,EACF,CAAA;AAAA,IAEC,QAAA,mBACCF,IAAAA,CAAC,UAAA,CAAW,aAAX,EACC,QAAA,EAAA;AAAA,sBAAAE,GAAAA,CAAC,UAAA,CAAW,QAAA,EAAX,EAAoB,CAAA;AAAA,sBACrBA,GAAAA,CAAC,UAAA,CAAW,YAAA,EAAX,EAAwB;AAAA,KAAA,EAC3B,oBAEAA,GAAAA,CAAC,WAAW,QAAA,EAAX,EAAoB,MAAK,GAAA,EAAI,CAAA;AAAA,IAG/B,SAAA,oBACCA,GAAAA,CAAC,UAAA,CAAW,mBAAX,EAA6B,OAAA,EAAO,MACnC,QAAA,kBAAAA,GAAAA,CAAC,cAAW,OAAA,EAAQ,OAAA,EAAQ,OAAM,UAAA,EAAW,IAAA,EAAK,MAChD,QAAA,kBAAAA,GAAAA,CAAC,GAAA,EAAA,EAAI,CAAA,EACP,CAAA,EACF;AAAA,GAAA,EAAA,EArBkB,IAAA,CAAK,IAuB3B,CACD,CAAA,EACH,CAAA;AAEJ;AAiDO,IAAM,kBAAkB,WAAA,CAA0C;AAAA,EACvE,WAAA,EAAa,iBAAA;AAAA,EAEb,aAAA,EAAe,CAAC,cAAA,KAAmB;AACjC,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIE,SAAwB,IAAI,CAAA;AACtE,IAAA,OAAO,EAAE,eAAe,gBAAA,EAAiB;AAAA,EAC3C,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,QAAA,EAAU,YAAA,EAAc,cAAA,EAAgB,UAAA,EAAW,KAAoB;AAC3G,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA,GAAW,CAAA;AAAA,MACX,OAAA,GAAU,QAAA;AAAA,MACV,QAAA,GAAW,KAAA;AAAA,MACX,SAAA,GAAY,IAAA;AAAA,MACZ,aAAA,GAAgB,0BAAA;AAAA,MAChB,mBAAA;AAAA,MACA,UAAA,GAAa,aAAA;AAAA,MACb;AAAA,KACF,GAAI,cAAA;AACJ,IAAA,MAAM,EAAE,aAAA,EAAe,gBAAA,EAAiB,GAAI,UAAA;AAE5C,IAAA,MAAM,WAAA,GAAc,SAAS,WAAA,IAAe,gBAAA;AAG5C,IAAA,MAAM,mBAAmB,MAAA,GACrB,OAAO,MAAA,KAAW,QAAA,GAChB,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,IACrC,MAAA,GACF,MAAA;AAGJ,IAAA,MAAM,aAAA,GAAgB,gBAAA,EAAkB,IAAA,CAAK,CAAC,IAAA,KAAS,KAAK,UAAA,CAAW,QAAQ,CAAA,IAAK,IAAA,KAAS,SAAS,CAAA;AAEtG,IAAA,uBACEJ,IAAAA,CAACC,KAAAA,CAAM,IAAA,EAAN,EAAW,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,QAAA,EAAU,QAAA,CAAS,QAAA,EAC7E,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,SAAS,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AAAA,sBAE3FF,IAAAA;AAAA,QAAC,UAAA,CAAW,IAAA;AAAA,QAAX;AAAA,UACC,QAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA,EAAQ,gBAAA;AAAA,UACR,UAAU,QAAA,CAAS,QAAA;AAAA,UACnB,YAAA,EAAc,OAAO,OAAA,KAAY;AAC/B,YAAA,IAAI,CAAC,QAAA,IAAY,OAAA,CAAQ,aAAA,CAAc,WAAW,CAAA,EAAG;AACnD,cAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,cAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,aAAa,CAAA;AACxC,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,KAAM,uBAAA,CAAwB,CAAA,EAAG,QAAQ,CAAC,CAAC,CAAA;AAExG,YAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,KAAK,CAAA;AAC/C,YAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,cAAA,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAEzD,cAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AACnE,cAAA,KAAA,CAAM,aAAa,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,EAAE,CAAA;AAC1D,cAAA;AAAA,YACF;AAEA,YAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,YAAA,KAAA,CAAM,aAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,UAC/C,CAAA;AAAA,UACA,iBAAA,EAAiB,QAAA;AAAA,UAEjB,QAAA,EAAA;AAAA,4BAAAE,IAAC,UAAA,CAAW,WAAA,EAAX,EAAuB,MAAA,EAAQ,MAAM,UAAA,EAAY,CAAA;AAAA,YAEjD,OAAA,KAAY,QAAA,oBACXF,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAE,GAAAA,CAAC,UAAA,CAAW,OAAA,EAAX,EAAmB,OAAA,EAAO,IAAA,EACzB,QAAA,kBAAAF,IAAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAC7B,QAAA,EAAA;AAAA,gCAAAE,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,gBACT;AAAA,eAAA,EACH,CAAA,EACF,CAAA;AAAA,cACC,aAAA,mBACCA,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAsB,oBAErCA,GAAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAoB,SAAA,EAAsB;AAAA,aAAA,EAExD,CAAA;AAAA,YAGD,OAAA,KAAY,UAAA,oBACXF,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAA,IAAAA,CAAC,UAAA,CAAW,QAAA,EAAX,EACC,QAAA,EAAA;AAAA,gCAAAE,GAAAA,CAAC,QAAK,IAAA,EAAK,IAAA,EAAK,OAAM,UAAA,EACpB,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ,CAAA;AAAA,gCACAF,IAAAA,CAAC,UAAA,CAAW,eAAA,EAAX,EACC,QAAA,EAAA;AAAA,kCAAAE,GAAAA,CAACG,GAAAA,EAAA,EAAK,QAAA,EAAA,aAAA,EAAc,CAAA;AAAA,kBACnB,uCAAuBH,GAAAA,CAACI,MAAA,EAAK,KAAA,EAAM,YAAY,QAAA,EAAA,mBAAA,EAAoB;AAAA,iBAAA,EACtE;AAAA,eAAA,EACF,CAAA;AAAA,cACC,aAAA,mBACCJ,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAsB,oBAErCA,GAAAA,CAAC,QAAA,EAAA,EAAS,QAAA,EAAoB,SAAA,EAAsB;AAAA,aAAA,EAExD,CAAA;AAAA,YAGD,OAAA,KAAY,2BACXA,GAAAA,CAACK,OAAA,EAAM,OAAA,EAAO,MACZ,QAAA,kBAAAL,GAAAA,CAAC,WAAW,OAAA,EAAX,EACC,0BAAAA,GAAAA,CAAC,UAAA,CAAW,SAAX,EACE,QAAA,EAAA,CAAC,EAAE,aAAA,EAAc,KAAM;AACtB,cAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,gBAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,aAAA,CAAc,CAAC,EAAE,IAAA,EAAK,CAAA;AAAA,cACtC;AACA,cAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,gBAAA,uBAAOF,KAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,kBAAA,aAAA,CAAc,MAAA;AAAA,kBAAO;AAAA,iBAAA,EAAM,CAAA;AAAA,cAC3C;AACA,cAAA,uBAAOE,GAAAA,CAACI,IAAAA,EAAA,EAAK,KAAA,EAAM,aAAa,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,YAC9C,CAAA,EACF,GACF,CAAA,EACF;AAAA;AAAA;AAAA,OAEJ;AAAA,sBAEAJ,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,QAAA,IAAY,CAAC,CAAC,aAAA;AAAA,UACxB,cAAc,aAAA,IAAiB,YAAA;AAAA,UAC/B,YAAY,QAAA,CAAS;AAAA;AAAA;AACvB,KAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAC;AC7RM,IAAM,gBAAgB,WAAA,CAAuD;AAAA,EAClF,WAAA,EAAa,eAAA;AAAA,EAEb,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIE,SAAS,CAAC,CAAA;AAC5C,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,KAAK,CAAA;AAGpD,IAAAI,UAAU,MAAM;AACd,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,QAAA,YAAA,CAAa,CAAC,IAAA,KAAS,IAAA,GAAO,CAAC,CAAA;AAAA,MACjC,GAAG,GAAI,CAAA;AAEP,MAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,IAClC,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,IAAA,MAAM,YAAA,GAAeC,YAAY,YAAY;AAC3C,MAAA,IAAI,CAAC,KAAA,CAAM,QAAA,IAAY,SAAA,GAAY,CAAA,EAAG;AACpC,QAAA;AAAA,MACF;AAEA,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,QAAA,EAAS;AACrB,QAAA,YAAA,CAAa,KAAA,CAAM,iBAAiB,EAAE,CAAA;AAAA,MACxC,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AAAA,MACtB;AAAA,IACF,GAAG,CAAC,KAAA,CAAM,UAAU,SAAA,EAAW,KAAA,CAAM,aAAa,CAAC,CAAA;AAGnD,IAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,KAA4B;AACnD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACpC,MAAA,MAAM,OAAO,OAAA,GAAU,EAAA;AACvB,MAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,IACpD,CAAA;AAGA,IAAA,MAAM,cAAc,kBAAA,EAAmB;AAEvC,IAAA,OAAO,EAAE,SAAA,EAAW,WAAA,EAAa,YAAA,EAAc,iBAAiB,WAAA,EAAY;AAAA,EAC9E,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,QAAA,EAAU,YAAA,EAAc,cAAA,EAAgB,UAAA,EAAW,KAAoB;AAC3G,IAAA,MAAM,EAAE,MAAA,GAAS,CAAA,EAAG,UAAA,GAAa,KAAA,EAAO,OAAO,SAAA,EAAW,IAAA,GAAO,KAAA,EAAO,QAAA,EAAS,GAAI,cAAA;AACrF,IAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAa,YAAA,EAAc,eAAA,EAAiB,aAAY,GAAI,UAAA;AAE/E,IAAA,MAAM,KAAA,GAAS,KAAA,CAAM,KAAA,CAAM,KAAA,IAAoB,EAAA;AAE/C,IAAA,MAAM,mBAAA,GAAsB,CAAC,OAAA,KAAwD;AACnF,MAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,aAAa,CAAA;AAGxC,MAAA,IAAI,UAAA,IAAc,OAAA,CAAQ,aAAA,CAAc,MAAA,KAAW,MAAA,EAAQ;AACzD,QAAA,WAAA,CAAY,KAAK,YAAA,EAAa;AAAA,MAChC;AAAA,IACF,CAAA;AAEA,IAAA,uBACEP,GAAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAoB,QAAA,EAAoB,cAA4B,QAAA,EAChF,QAAA,kBAAAF,IAAAA,CAACK,GAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAL,IAAAA;AAAA,QAAC,QAAA,CAAS,IAAA;AAAA,QAAT;AAAA,UACC,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA;AAAA,UACrB,eAAA,EAAiB,mBAAA;AAAA,UACjB,eAAe,CAAC,OAAA,KAAY,KAAA,CAAM,YAAA,CAAa,QAAQ,aAAa,CAAA;AAAA,UACpE,KAAA,EAAO,MAAA;AAAA,UACP,IAAA;AAAA,UACA,IAAA;AAAA,UACA,GAAA,EAAG,IAAA;AAAA,UAEH,QAAA,EAAA;AAAA,4BAAAE,GAAAA,CAAC,QAAA,CAAS,OAAA,EAAT,EACC,0BAAAA,GAAAA,CAACC,MAAAA,EAAA,EAAO,GAAA,EAAK,GACV,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,qBAC9BD,GAAAA,CAAC,QAAA,CAAS,OAAT,EAA2B,KAAA,EAAc,iBAAA,EAAiB,KAAA,KAAU,IAAI,QAAA,GAAW,MAAA,EAAA,EAA/D,KAA0E,CAChG,GACH,CAAA,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,QAAA,CAAS,WAAA,EAAT,EAAqB;AAAA;AAAA;AAAA,OACxB;AAAA,MAEC,4BACCA,GAAAA,CAACC,QAAA,EAAO,EAAA,EAAI,GAAG,OAAA,EAAQ,QAAA,EACpB,QAAA,EAAA,SAAA,GAAY,CAAA,mBACXH,IAAAA,CAACM,IAAAA,EAAA,EAAK,QAAA,EAAS,IAAA,EAAK,OAAM,UAAA,EAAW,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,QAC1B,gBAAgB,SAAS;AAAA,OAAA,EACpC,oBAEAJ,GAAAA,CAACQ,MAAAA,EAAA,EAAO,SAAQ,OAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,cAAc,QAAA,EAAU,WAAA,EAAa,OAAA,EAAS,WAAA,EAAa,0BAEtG,CAAA,EAEJ;AAAA,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAC;AC5ID,IAAM,WAAA,GAAuD;AAAA,EAC3D,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAKA,IAAM,aAAA,GAA8C;AAAA,EAClD,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI,oBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AA8BO,IAAM,aAAa,WAAA,CAAsD;AAAA,EAC9E,WAAA,EAAa,YAAA;AAAA,EAEb,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,IAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,UAAA,GAAa,OAAM,GAAI,KAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAGhC,IAAA,MAAM,OAAA,GAAUD,WAAAA;AAAA,MACd,CAAC,OAAA,KAAqC;AACpC,QAAA,IAAI,WAAW,IAAA,EAAM;AACnB,UAAA,MAAM,YAAA,GAAe,SAAS,IAAA,EAAM;AAAA,YAClC,eAAA,EAAiB,IAAA;AAAA,YACjB,eAAA,EAAiB,IAAA;AAAA,YACjB;AAAA,WACD,CAAA;AACD,UAAA,YAAA,CAAa,OAAO,CAAA;AAAA,QACtB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,MAAM,UAAU;AAAA,KACnB;AAEA,IAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,EACnB,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,QAAA,EAAU,YAAA,EAAc,cAAA,EAAgB,UAAA,EAAW,KAAoB;AAC3G,IAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,QAAA,GAAW,OAAM,GAAI,cAAA;AAC7C,IAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,YAAY,OAAO,CAAA;AAEhC,IAAA,MAAM,KAAA,GAAS,KAAA,CAAM,KAAA,CAAM,KAAA,IAAoB,EAAA;AAC/C,IAAA,MAAM,mBAAA,GAAsB,SAAS,WAAA,IAAe,IAAA,EAAM,UAAS,CAAE,OAAA,CAAQ,MAAM,GAAG,CAAA;AAEtF,IAAA,uBACET,IAAAA;AAAA,MAACC,KAAAA,CAAM,IAAA;AAAA,MAAN;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QAEnB,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,SAAS,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AAAA,0BAC3FF,IAAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAQ,IAAA,EACZ,QAAA,EAAA;AAAA,YAAA,QAAA,oBACCE,GAAAA,CAACI,IAAAA,EAAA,EAAK,EAAA,EAAI,GAAG,OAAA,EAAQ,MAAA,EAAO,UAAA,EAAW,QAAA,EAAS,IAAG,UAAA,EAAW,WAAA,EAAY,KAAA,EAAM,gBAAA,EAAiB,KAC9F,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,4BAEFJ,GAAAA;AAAA,cAACK,KAAAA;AAAA,cAAA;AAAA,gBACC,KAAK,UAAA,CAAW,OAAA;AAAA,gBAChB,KAAA;AAAA,gBACA,UAAU,CAAC,CAAA,KAAM,MAAM,YAAA,CAAa,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAClD,QAAQ,KAAA,CAAM,UAAA;AAAA,gBACd,WAAA,EAAa,mBAAA;AAAA,gBACb,iBAAA,EAAiB,QAAA;AAAA,gBACjB,IAAA,EAAK,KAAA;AAAA,gBACL,SAAA,EAAU,KAAA;AAAA,gBACV,YAAA,EAAa;AAAA;AAAA;AACf,WAAA,EACF,CAAA;AAAA,0BACAL,GAAAA,CAAC,UAAA,EAAA,EAAW,UAAoB,YAAA,EAA4B,UAAA,EAAY,SAAS,UAAA,EAAY;AAAA;AAAA;AAAA,KAC/F;AAAA,EAEJ;AACF,CAAC;ACjFM,IAAM,gBAAgB,WAAA,CAAwC;AAAA,EACnE,WAAA,EAAa,eAAA;AAAA,EAEb,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,cAAA,EAAe,KAAoB;AAC/F,IAAA,MAAM;AAAA,MACJ,KAAA,GAAQ,CAAA;AAAA,MACR,IAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA,GAAO,SAAA;AAAA,MACP,IAAA,GAAO,IAAA;AAAA,MACP,OAAA,GAAU,SAAA;AAAA,MACV,QAAA;AAAA,MACA;AAAA,KACF,GAAI,cAAA;AAGJ,IAAA,MAAM,WAAA,GAAe,KAAA,CAAM,KAAA,CAAM,KAAA,IAAoB,EAAA;AACrD,IAAA,MAAM,aAAa,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,KAAK,CAAA;AAEvD,IAAA,OAAO,UAAA,CAAW,SAAS,KAAA,EAAO;AAChC,MAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA,IACpB;AAEA,IAAA,MAAM,iBAAA,GAAoB,CAAC,OAAA,KAAiC;AAE1D,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AACtC,MAAA,KAAA,CAAM,aAAa,QAAQ,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,mBAAA,GAAsB,CAAC,OAAA,KAAiC;AAC5D,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAC3C,MAAA,UAAA,GAAa,aAAa,CAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,uBACEA,GAAAA,CAAC,YAAA,EAAA,EAAa,UAAoB,QAAA,EAAoB,YAAA,EAA4B,UAChF,QAAA,kBAAAF,IAAAA;AAAA,MAACW,QAAAA,CAAS,IAAA;AAAA,MAAT;AAAA,QACC,KAAA,EAAO,UAAA;AAAA,QACP,aAAA,EAAe,iBAAA;AAAA,QACf,eAAA,EAAiB,mBAAA;AAAA,QACjB,aAAa,QAAA,CAAS,WAAA;AAAA,QACtB,IAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,OAAA,EAAS,QAAA;AAAA,QACT,KAAA;AAAA,QACA,QAAQ,KAAA,CAAM,UAAA;AAAA,QACd,iBAAA,EAAiB,QAAA;AAAA,QAEjB,QAAA,EAAA;AAAA,0BAAAT,GAAAA,CAACS,QAAAA,CAAS,WAAA,EAAT,EAAqB,CAAA;AAAA,0BACtBT,GAAAA,CAACS,QAAAA,CAAS,OAAA,EAAT,EACE,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,KAAA,qBACrCT,GAAAA,CAACS,QAAAA,CAAS,OAAT,EAA2B,KAAA,EAAA,EAAP,KAAqB,CAC3C,CAAA,EACH;AAAA;AAAA;AAAA,KACF,EACF,CAAA;AAAA,EAEJ;AACF,CAAC;AC3GD,SAAS,eAAA,CAAgB,cAAgC,KAAA,EAAwC;AAC/F,EAAA,MAAM,cAAc,0BAAA,EAA2B;AAG/C,EAAA,IAAI,cAAc,OAAO,YAAA;AACzB,EAAA,IAAI,WAAA,EAAa,eAAA,EAAiB,OAAO,WAAA,CAAY,eAAA;AACrD,EAAA,IAAI,KAAA,EAAO,OAAO,oBAAA,CAAqB,EAAE,OAAO,CAAA;AAGhD,EAAA,MAAM,SAAS,OAAO,MAAA,KAAW,WAAA,GAAc,OAAA,CAAQ,IAAI,0BAAA,GAA6B,EAAA;AACxF,EAAA,IAAI,QAAQ,OAAO,oBAAA,CAAqB,EAAE,KAAA,EAAO,QAAQ,CAAA;AAEzD,EAAA,OAAO,IAAA;AACT;AA0CO,IAAM,YAAY,WAAA,CAAoD;AAAA,EAC3E,WAAA,EAAa,WAAA;AAAA,EAEb,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,IAAA,MAAM,EAAE,UAAU,YAAA,EAAc,KAAA,EAAO,WAAW,CAAA,EAAG,UAAA,GAAa,KAAI,GAAI,KAAA;AAC1E,IAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,YAAA,EAAc,KAAK,CAAA;AAEpD,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIP,SAAS,EAAE,CAAA;AAC/C,IAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,CAA8B,EAAE,CAAA;AACtE,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1C,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3D,IAAA,MAAM,YAAA,GAAeQ,OAA8B,IAAI,CAAA;AACvD,IAAA,MAAM,cAAA,GAAiB,WAAA,CAAY,UAAA,EAAY,UAAU,CAAA;AAEzD,IAAA,MAAM,eAAA,GAAkBA,OAAO,KAAK,CAAA;AAEpC,IAAA,MAAM,cAAA,GAAiBA,OAAO,KAAK,CAAA;AAGnC,IAAA,MAAM,gBAAA,GAAmBH,WAAAA;AAAA,MACvB,OAAO,KAAA,KAAkB;AACvB,QAAA,IAAI,KAAA,CAAM,MAAA,GAAS,QAAA,IAAY,CAAC,QAAA,EAAU;AACxC,UAAA,cAAA,CAAe,EAAE,CAAA;AACjB,UAAA;AAAA,QACF;AAEA,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,cAAA,CAAe,KAAA,EAAO;AAAA,YACnD,KAAA,EAAO,CAAA;AAAA,YACP,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAI,YAAA;AAAa,WAC1C,CAAA;AACD,UAAA,cAAA,CAAe,OAAO,CAAA;AACtB,UAAA,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,QAC9B,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,UAAA,cAAA,CAAe,EAAE,CAAA;AAAA,QACnB,CAAA,SAAE;AACA,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,UAAU,QAAQ;AAAA,KACrB;AAGA,IAAAD,UAAU,MAAM;AACd,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA,eAAA,CAAgB,OAAA,GAAU,KAAA;AAC1B,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,gBAAA,CAAiB,cAAc,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,EAAE,CAAA;AACjB,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA,EAAG,CAAC,cAAA,EAAgB,gBAAgB,CAAC,CAAA;AAGrC,IAAAA,UAAU,MAAM;AACd,MAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,QAAA,IAAI,YAAA,CAAa,WAAW,CAAC,YAAA,CAAa,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAAG;AAChF,UAAA,SAAA,CAAU,KAAK,CAAA;AAAA,QACjB;AAAA,MACF,CAAA;AAEA,MAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,MAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,IAC3E,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,QAAA,EAAU,YAAA,EAAc,UAAA,EAAW,KAAoB;AAC3F,IAAA,MAAM;AAAA,MACJ,UAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF,GAAI,UAAA;AACJ,IAAA,MAAM,EAAE,eAAA,EAAiB,cAAA,EAAe,GAAI,UAAA;AAK5C,IAAA,MAAM,UAAA,GAAa,MAAM,KAAA,CAAM,KAAA;AAG/B,IAAA,IAAI,CAAC,cAAA,CAAe,OAAA,IAAW,UAAA,IAAc,eAAe,UAAA,EAAY;AACtE,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AACzB,MAAA,aAAA,CAAc,UAAU,CAAA;AAAA,IAC1B;AAGA,IAAA,MAAM,YAAA,GAAe,CAAC,UAAA,KAAkC;AAEtD,MAAA,MAAM,WAAY,UAAA,CAAW,IAAA,EAAM,QAAoB,UAAA,CAAW,IAAA,EAAM,cAAyB,UAAA,CAAW,KAAA;AAC5G,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,MAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,KAAA,CAAM,aAAa,QAAQ,CAAA;AAAA,IAC7B,CAAA;AAGA,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA2B;AAChD,MAAA,IAAI,CAAC,MAAA,IAAU,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACvC,QAAA;AAAA,MACF;AAEA,MAAA,QAAQ,EAAE,GAAA;AAAK,QACb,KAAK,WAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,mBAAA,CAAoB,mBAAmB,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,gBAAA,GAAmB,IAAI,CAAC,CAAA;AACxF,UAAA;AAAA,QACF,KAAK,SAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,mBAAA,CAAoB,mBAAmB,CAAA,GAAI,gBAAA,GAAmB,CAAA,GAAI,WAAA,CAAY,SAAS,CAAC,CAAA;AACxF,UAAA;AAAA,QACF,KAAK,OAAA;AACH,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,YAAA,YAAA,CAAa,WAAA,CAAY,gBAAgB,CAAC,CAAA;AAAA,UAC5C;AACA,UAAA;AAAA,QACF,KAAK,QAAA;AACH,UAAA,SAAA,CAAU,KAAK,CAAA;AACf,UAAA;AAAA;AACJ,IACF,CAAA;AAEA,IAAA,uBACER,IAAAA;AAAA,MAACC,KAAAA,CAAM,IAAA;AAAA,MAAN;AAAA,QACC,OAAA,EAAS,QAAA;AAAA,QACT,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QACnB,UAAU,QAAA,CAAS,QAAA;AAAA,QAEnB,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,SAAS,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AAAA,0BAC3FF,KAACK,GAAAA,EAAA,EAAI,KAAK,YAAA,EAAc,QAAA,EAAS,UAAA,EAAW,KAAA,EAAM,MAAA,EAChD,QAAA,EAAA;AAAA,4BAAAH,GAAAA;AAAA,cAACK,KAAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAO,UAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAC5B,kBAAA,mBAAA,CAAoB,EAAE,CAAA;AAEtB,kBAAA,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO;AACnB,oBAAA,KAAA,CAAM,aAAa,EAAE,CAAA;AAAA,kBACvB;AAAA,gBACF,CAAA;AAAA,gBACA,SAAS,MAAM;AACb,kBAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,oBAAA,SAAA,CAAU,IAAI,CAAA;AAAA,kBAChB;AAAA,gBACF,CAAA;AAAA,gBACA,QAAQ,MAAM;AAEZ,kBAAA,IAAI,UAAA,IAAc,UAAA,KAAgB,KAAA,CAAM,KAAA,CAAM,KAAA,EAAkB;AAC9D,oBAAA,KAAA,CAAM,aAAa,UAAU,CAAA;AAAA,kBAC/B;AACA,kBAAA,KAAA,CAAM,UAAA,EAAW;AAAA,gBACnB,CAAA;AAAA,gBACA,SAAA,EAAW,aAAA;AAAA,gBACX,WAAA,EAAa,SAAS,WAAA,IAAe,YAAA;AAAA,gBACrC,iBAAA,EAAiB;AAAA;AAAA,aACnB;AAAA,YACC,6BACCL,GAAAA,CAACG,KAAA,EAAI,QAAA,EAAS,YAAW,KAAA,EAAO,CAAA,EAAG,KAAI,KAAA,EAAM,SAAA,EAAU,oBACrD,QAAA,kBAAAH,GAAAA,CAACW,SAAA,EAAQ,IAAA,EAAK,MAAK,CAAA,EACrB,CAAA;AAAA,YAED,MAAA,IAAU,WAAA,CAAY,MAAA,GAAS,CAAA,oBAC9BX,GAAAA;AAAA,cAACY,IAAAA,CAAK,IAAA;AAAA,cAAL;AAAA,gBACC,QAAA,EAAS,UAAA;AAAA,gBACT,MAAA,EAAQ,EAAA;AAAA,gBACR,KAAA,EAAM,MAAA;AAAA,gBACN,EAAA,EAAG,UAAA;AAAA,gBACH,WAAA,EAAY,KAAA;AAAA,gBACZ,YAAA,EAAa,IAAA;AAAA,gBACb,MAAA,EAAO,IAAA;AAAA,gBACP,IAAA,EAAK,OAAA;AAAA,gBACL,SAAA,EAAU,MAAA;AAAA,gBACV,EAAA,EAAI,CAAA;AAAA,gBACJ,SAAA,EAAU,MAAA;AAAA,gBAET,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,EAAY,0BAC5BZ,GAAAA;AAAA,kBAACY,IAAAA,CAAK,IAAA;AAAA,kBAAL;AAAA,oBAEC,EAAA,EAAI,CAAA;AAAA,oBACJ,EAAA,EAAI,CAAA;AAAA,oBACJ,MAAA,EAAO,SAAA;AAAA,oBACP,EAAA,EAAI,gBAAA,KAAqB,KAAA,GAAQ,UAAA,GAAa,MAAA;AAAA,oBAC9C,MAAA,EAAQ,EAAE,EAAA,EAAI,UAAA,EAAW;AAAA,oBACzB,OAAA,EAAS,MAAM,YAAA,CAAa,UAAU,CAAA;AAAA,oBACtC,YAAA,EAAc,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,oBAE7C,0BAAAZ,GAAAA,CAACI,IAAAA,EAAA,EAAK,QAAA,EAAS,IAAA,EAAM,qBAAW,KAAA,EAAM;AAAA,mBAAA;AAAA,kBATjC,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,iBAWpC;AAAA;AAAA;AACH,WAAA,EAEJ,CAAA;AAAA,0BACAJ,GAAAA,CAAC,UAAA,EAAA,EAAW,UAAoB,YAAA,EAA4B,UAAA,EAAY,SAAS,UAAA,EAAY;AAAA;AAAA;AAAA,KAC/F;AAAA,EAEJ;AACF,CAAC;AC3OD,SAAS,SAAA,CAAU,GAAwC,MAAA,EAAqD;AAC9G,EAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,EAAA,IAAI,aAAa,CAAA,EAAG;AAClB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,IAAA,OAAO,EAAE,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,MAAM,CAAA,EAAG,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI;AAAA,EACrE;AACA,EAAA,OAAO,EAAE,CAAA,EAAI,CAAA,CAAuB,OAAA,GAAU,IAAA,CAAK,MAAM,CAAA,EAAI,CAAA,CAAuB,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI;AACzG;AA0BO,IAAM,iBAAiB,WAAA,CAAyD;AAAA,EACrF,WAAA,EAAa,gBAAA;AAAA,EAEb,aAAA,EAAe,CAAC,KAAA,KAAU;AACxB,IAAA,MAAM,SAAA,GAAYU,OAAiC,IAAI,CAAA;AACvD,IAAA,MAAM,YAAA,GAAeA,OAAO,KAAK,CAAA;AACjC,IAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIR,SAA2B,MAAM,CAAA;AACzD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC7C,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAE3C,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,OAAA;AACzC,IAAA,MAAM,WAAA,GAAc,MAAM,WAAA,IAAe,CAAA;AACzC,IAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,IAAmB,OAAA;AACjD,IAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,2CAAA;AAGrC,IAAA,MAAM,UAAA,GAAaK,YAAY,MAAM;AACnC,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,SAAA,GAAY,eAAA;AAChB,MAAA,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA,IAChD,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,IAAAD,UAAU,MAAM;AACd,MAAA,UAAA,EAAW;AAAA,IACb,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,IAAA,MAAM,YAAA,GAAeC,WAAAA;AAAA,MACnB,CAAC,CAAA,KAA2C;AAC1C,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,QAAA,IAAI,SAAA,IAAa,CAAA,EAAG,CAAA,CAAE,cAAA,EAAe;AAErC,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,QAAA,IAAI,CAAC,GAAA,EAAK;AAEV,QAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,QAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,SAAA,CAAU,GAAG,MAAM,CAAA;AAEpC,QAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,QAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,QAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,MACjB,CAAA;AAAA,MACA,CAAC,aAAa,WAAW;AAAA,KAC3B;AAGA,IAAA,MAAM,IAAA,GAAOA,WAAAA,CAAY,CAAC,CAAA,KAA2C;AACnE,MAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,IAAI,SAAA,IAAa,CAAA,EAAG,CAAA,CAAE,cAAA,EAAe;AAErC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAE,GAAI,SAAA,CAAU,GAAG,MAAM,CAAA;AACpC,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACb,CAAA,EAAG,EAAE,CAAA;AAGL,IAAA,MAAM,WAAA,GAAcA,YAAY,MAAc;AAC5C,MAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AAEpB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA,OAAO,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,IACrC,CAAA,EAAG,EAAE,CAAA;AAGL,IAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,MAAA,UAAA,EAAW;AACX,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,IAAA,MAAM,oBAAA,GAAuBA,WAAAA;AAAA,MAC3B,CAAC,IAAA,KAAyB;AACxB,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,QAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AAGjB,QAAA,GAAA,CAAI,SAAA,GAAY,eAAA;AAChB,QAAA,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAE9C,QAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,OAAO,EAAA;AAAA,QACT;AAGA,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,KAAK,EAAE,CAAA;AACjD,QAAA,GAAA,CAAI,IAAA,GAAO,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA;AACrC,QAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,QAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,QAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,QAAA,GAAA,CAAI,SAAS,IAAA,EAAM,MAAA,CAAO,QAAQ,CAAA,EAAG,MAAA,CAAO,SAAS,CAAC,CAAA;AAEtD,QAAA,UAAA,CAAW,KAAK,CAAA;AAChB,QAAA,OAAO,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,MACrC,CAAA;AAAA,MACA,CAAC,eAAA,EAAiB,WAAA,EAAa,SAAS;AAAA,KAC1C;AAEA,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,UAAU,QAAA,EAAU,YAAA,EAAc,cAAA,EAAgB,UAAA,EAAW,KAAoB;AACjG,IAAA,MAAM;AAAA,MACJ,KAAA,GAAQ,GAAA;AAAA,MACR,MAAA,GAAS,GAAA;AAAA,MACT,UAAA,GAAa,OAAA;AAAA,MACb,WAAA,GAAc,WAAA;AAAA,MACd,UAAA,GAAa,IAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ,GAAI,cAAA;AAEJ,IAAA,MAAM;AAAA,MACJ,SAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,GAAI,UAAA;AAEJ,IAAA,MAAM,aAAa,QAAA,CAAS,QAAA;AAE5B,IAAA,uBACET,IAAAA,CAACC,KAAAA,CAAM,IAAA,EAAN,EAAW,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,QAAA,EAAU,UAAA,EACpE,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,SAAS,QAAA,CAAS,OAAA,EAAS,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AAAA,sBAE3FF,IAAAA;AAAA,QAACK,GAAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAS,UAAA;AAAA,UACT,WAAA,EAAY,KAAA;AAAA,UACZ,WAAA,EAAa,WAAW,cAAA,GAAiB,QAAA;AAAA,UACzC,YAAA,EAAa,IAAA;AAAA,UACb,QAAA,EAAS,QAAA;AAAA,UACT,IAAA,EAAM,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,UACd,OAAA,EAAS,aAAa,GAAA,GAAM,CAAA;AAAA,UAC5B,aAAA,EAAe,aAAa,MAAA,GAAS,MAAA;AAAA,UAGpC,QAAA,EAAA;AAAA,YAAA,UAAA,oBACCH,GAAAA,CAACC,MAAAA,EAAA,EAAO,CAAA,EAAG,CAAA,EAAG,iBAAA,EAAkB,KAAA,EAAM,WAAA,EAAY,QAAA,EAAS,GAAA,EAAK,CAAA,EAC9D,QAAA,kBAAAH,IAAAA;AAAA,cAAC,YAAA,CAAa,IAAA;AAAA,cAAb;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,KAAA,EAAO,IAAA;AAAA,gBACP,aAAA,EAAe,CAAC,OAAA,KAAY;AAC1B,kBAAA,MAAM,UAAU,OAAA,CAAQ,KAAA;AACxB,kBAAA,OAAA,CAAQ,OAAO,CAAA;AAEf,kBAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,oBAAA,WAAA,EAAY;AACZ,oBAAA,KAAA,CAAM,aAAa,EAAE,CAAA;AAAA,kBACvB;AAAA,gBACF,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAA,IAAAA,CAAC,YAAA,CAAa,IAAA,EAAb,EAAkB,OAAM,MAAA,EACvB,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EACC,QAAA,EAAA;AAAA,sCAAAE,IAAC,KAAA,EAAA,EAAM,CAAA;AAAA,sBAAE;AAAA,qBAAA,EACX,CAAA;AAAA,oCACAA,GAAAA,CAAC,YAAA,CAAa,eAAA,EAAb,EAA6B;AAAA,mBAAA,EAChC,CAAA;AAAA,kCACAF,IAAAA,CAAC,YAAA,CAAa,IAAA,EAAb,EAAkB,OAAM,OAAA,EACvB,QAAA,EAAA;AAAA,oCAAAA,IAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EACC,QAAA,EAAA;AAAA,sCAAAE,IAAC,MAAA,EAAA,EAAO,CAAA;AAAA,sBAAE;AAAA,qBAAA,EACZ,CAAA;AAAA,oCACAA,GAAAA,CAAC,YAAA,CAAa,eAAA,EAAb,EAA6B;AAAA,mBAAA,EAChC;AAAA;AAAA;AAAA,aACF,EACF,CAAA;AAAA,YAID,IAAA,KAAS,OAAA,oBACRA,GAAAA,CAACG,GAAAA,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,iBAAA,EAAkB,KAAA,EAAM,WAAA,EAAY,QAAA,EAC7C,QAAA,kBAAAH,GAAAA;AAAA,cAACK,KAAAA;AAAA,cAAA;AAAA,gBACC,WAAA,EAAY,mBAAA;AAAA,gBACZ,KAAA,EAAO,SAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,MAAM,IAAA,GAAO,EAAE,MAAA,CAAO,KAAA;AACtB,kBAAA,YAAA,CAAa,IAAI,CAAA;AACjB,kBAAA,MAAM,OAAA,GAAU,qBAAqB,IAAI,CAAA;AACzC,kBAAA,KAAA,CAAM,YAAA,CAAa,WAAW,EAAE,CAAA;AAAA,gBAClC,CAAA;AAAA,gBACA,UAAA,EAAW,SAAA;AAAA,gBACX,QAAA,EAAS;AAAA;AAAA,aACX,EACF,CAAA;AAAA,4BAIFP,IAAAA,CAACK,GAAAA,EAAA,EAAI,UAAS,UAAA,EACZ,QAAA,EAAA;AAAA,8BAAAH,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,SAAA;AAAA,kBACL,KAAA;AAAA,kBACA,MAAA;AAAA,kBACA,KAAA,EAAO;AAAA,oBACL,OAAA,EAAS,OAAA;AAAA,oBACT,QAAA,EAAU,MAAA;AAAA,oBACV,MAAA,EAAQ,IAAA,KAAS,MAAA,GAAS,WAAA,GAAc,SAAA;AAAA,oBACxC,WAAA,EAAa;AAAA;AAAA,mBACf;AAAA,kBACA,IAAA,EAAK,KAAA;AAAA,kBACL,YAAA,EAAW,eAAA;AAAA,kBACX,QAAA,EAAU,CAAA;AAAA,kBACV,WAAA,EAAa,IAAA,KAAS,MAAA,GAAS,YAAA,GAAe,MAAA;AAAA,kBAC9C,WAAA,EAAa,IAAA,KAAS,MAAA,GAAS,IAAA,GAAO,MAAA;AAAA,kBACtC,SAAA,EAAW,IAAA,KAAS,MAAA,GAChB,MAAM;AACN,oBAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,oBAAA,IAAI,OAAA,EAAS,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA;AAAA,kBACzC,CAAA,GACE,MAAA;AAAA,kBACJ,YAAA,EAAc,IAAA,KAAS,MAAA,GACnB,MAAM;AACN,oBAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,oBAAA,IAAI,OAAA,EAAS,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA;AAAA,kBACzC,CAAA,GACE,MAAA;AAAA,kBACJ,YAAA,EAAc,IAAA,KAAS,MAAA,GAAS,YAAA,GAAe,MAAA;AAAA,kBAC/C,WAAA,EAAa,IAAA,KAAS,MAAA,GAAS,IAAA,GAAO,MAAA;AAAA,kBACtC,UAAA,EAAY,IAAA,KAAS,MAAA,GACjB,MAAM;AACN,oBAAA,MAAM,UAAU,WAAA,EAAY;AAC5B,oBAAA,IAAI,OAAA,EAAS,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA;AAAA,kBACzC,CAAA,GACE;AAAA;AAAA,eACN;AAAA,cAGC,OAAA,IAAW,IAAA,KAAS,MAAA,oBACnBA,GAAAA;AAAA,gBAACG,GAAAA;AAAA,gBAAA;AAAA,kBACC,QAAA,EAAS,UAAA;AAAA,kBACT,KAAA,EAAO,CAAA;AAAA,kBACP,OAAA,EAAQ,MAAA;AAAA,kBACR,UAAA,EAAW,QAAA;AAAA,kBACX,cAAA,EAAe,QAAA;AAAA,kBACf,aAAA,EAAc,MAAA;AAAA,kBACd,KAAA,EAAM,WAAA;AAAA,kBACN,QAAA,EAAS,IAAA;AAAA,kBAER,QAAA,EAAA;AAAA;AAAA;AACH,aAAA,EAEJ,CAAA;AAAA,YAGC,CAAC,OAAA,oBACAH,GAAAA,CAACC,QAAA,EAAO,CAAA,EAAG,CAAA,EAAG,cAAA,EAAe,KAAA,EAAM,WAAA,EAAY,QAAA,EAAS,cAAA,EAAe,YACrE,QAAA,kBAAAH,IAAAA;AAAA,cAACU,MAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ,OAAA;AAAA,gBACR,YAAA,EAAa,KAAA;AAAA,gBACb,SAAS,MAAM;AACb,kBAAA,WAAA,EAAY;AACZ,kBAAA,KAAA,CAAM,aAAa,EAAE,CAAA;AAAA,gBACvB,CAAA;AAAA,gBAEA,QAAA,EAAA;AAAA,kCAAAR,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,kBACT;AAAA;AAAA;AAAA,aACH,EACF;AAAA;AAAA;AAAA,OAEJ;AAAA,sBAEAA,GAAAA,CAAC,UAAA,EAAA,EAAW,UAAoB,YAAA,EAA4B,UAAA,EAAY,SAAS,UAAA,EAAY;AAAA,KAAA,EAC/F,CAAA;AAAA,EAEJ;AACF,CAAC;AChYD,IAAM,WAAA,GAA6E;AAAA,EACjF,IAAA,EAAM,CAAC,CAAA,qBACLA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,GAAI,IAAA,EAAM,SAAQ,WAAA,EAAY,IAAA,EAAK,WAAU,YAAA,EAAW,MAAA,EAC7E,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+qBAAA,EAAgrB,CAAA,EAC1rB,CAAA;AAAA,EAEF,YAAY,CAAC,CAAA,qBACXF,IAAAA,CAAC,SAAI,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,GAAI,MAAM,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,cAAW,YAAA,EAC1E,QAAA,EAAA;AAAA,oBAAAE,GAAAA,CAAC,YAAO,EAAA,EAAG,OAAA,EAAQ,IAAG,IAAA,EAAK,CAAA,EAAE,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,oBACpDA,GAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,QAAA,EAAS,IAAG,IAAA,EAAK,CAAA,EAAE,OAAA,EAAQ,IAAA,EAAK,SAAA,EAAU,CAAA;AAAA,oBACrDA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,2OAAA;AAAA,QACF,IAAA,EAAK;AAAA;AAAA;AACP,GAAA,EACF,CAAA;AAAA,EAEF,IAAA,EAAM,CAAC,CAAA,qBACLA,IAAC,KAAA,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,GAAI,IAAA,EAAM,SAAQ,WAAA,EAAY,IAAA,EAAK,WAAU,YAAA,EAAW,kBAAA,EAC7E,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,g9CAAA,EAAi9C,CAAA,EAC39C,CAAA;AAAA,EAEF,KAAK,CAAC,CAAA,qBACJF,IAAAA,CAAC,SAAI,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,GAAI,KAAK,OAAA,EAAQ,aAAA,EAAc,IAAA,EAAK,MAAA,EAAO,cAAW,oBAAA,EAC3E,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,oBAAe,EAAA,EAAG,OAAA,EAAQ,IAAG,KAAA,EAAM,EAAA,EAAG,KAAA,EAAM,aAAA,EAAc,gBAAA,EACzD,QAAA,EAAA;AAAA,sBAAAE,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBAC1BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,QAAO,GAAA,EAAI;AAAA,KAAA,EACvC,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,CAAA,EAAE,mPAAA;AAAA,QACF,IAAA,EAAK;AAAA;AAAA,KACP;AAAA,oBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8CAAA,EAA+C,MAAK,aAAA,EAAc;AAAA,GAAA,EAC5E;AAEJ,CAAA;AAGA,SAAS,eAAA,CAAgB,EAAE,IAAA,EAAK,EAAqB;AACnD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,IAAA,EAAM,OAAA,EAAQ,aAAY,IAAA,EAAK,SAAA,EAAU,cAAW,gCAAA,EACnF,QAAA,kBAAAA,IAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+GAA8G,CAAA,EACxH,CAAA;AAEJ;AAOO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,IAAA,GAAO,IAAG,EAAuB;AACtE,EAAA,MAAM,UAAA,GAAa,YAAY,KAAK,CAAA;AAEpC,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY,oBAAA;AAAA,QACZ,KAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACZ;AAAA,MAEC,uBAAa,UAAA,CAAW,IAAI,oBAAIA,GAAAA,CAAC,mBAAgB,IAAA,EAAY;AAAA;AAAA,GAChE;AAEJ;;;AChEA,IAAM,MAAA,GAA+D;AAAA,EACnE,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,IACpB,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,GACnB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,CAAA;AAAA,IACZ,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,GACnB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAE,CAAA;AAAA,IACZ,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC;AAAA,GAChB;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,IACxB,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,GACnB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,IACxB,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,GACnB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,IACxC,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,GACnB;AAAA,EACA,GAAA,EAAK;AAAA,IACH,KAAA,EAAO,KAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,IACxB,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,GACnB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,IAChB,SAAA,EAAW,CAAA;AAAA,IACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA;AAErB,CAAA;AAEA,IAAM,aAAA,GAA+B;AAAA,EACnC,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,SAAA;AAAA,EACN,OAAA,EAAS,CAAC,EAAE,CAAA;AAAA,EACZ,SAAA,EAAW,CAAA;AAAA,EACX,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AACnB,CAAA;AAQO,SAAS,YAAY,MAAA,EAA+B;AACzD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACvC,EAAA,IAAI,CAAC,QAAQ,OAAO,aAAA;AAEpB,EAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACpC,EAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AACpC,EAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAGpC,EAAA,IAAI,EAAA,IAAM,IAAA,IAAQ,EAAA,IAAM,IAAA,SAAa,MAAA,CAAO,GAAA;AAG5C,EAAA,IAAI,EAAA,KAAO,EAAA,IAAM,EAAA,KAAO,EAAA,SAAW,MAAA,CAAO,IAAA;AAG1C,EAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,SAAY,MAAA,CAAO,IAAA;AAGrC,EAAA,IAAK,EAAA,IAAM,MAAM,EAAA,IAAM,EAAA,IAAQ,MAAM,IAAA,IAAQ,EAAA,IAAM,IAAA,EAAO,OAAO,MAAA,CAAO,UAAA;AAGxE,EAAA,IAAI,EAAA,KAAO,IAAA,IAAS,EAAA,IAAM,MAAA,IAAU,EAAA,IAAM,MAAA,IAAY,EAAA,IAAM,EAAA,IAAM,EAAA,IAAM,EAAA,EAAK,OAAO,MAAA,CAAO,QAAA;AAG3F,EAAA,IAAI,EAAA,IAAM,IAAA,IAAQ,EAAA,IAAM,IAAA,SAAa,MAAA,CAAO,GAAA;AAG5C,EAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,MAAA,CAAO,QAAA;AAG7B,EAAA,IAAI,OAAO,EAAA,IAAO,EAAA,IAAM,MAAM,EAAA,IAAM,EAAA,SAAY,MAAA,CAAO,OAAA;AAEvD,EAAA,OAAO,aAAA;AACT;;;ACpHO,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACpC,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AAEpB,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACpD;AASO,SAAS,cAAc,MAAA,EAAyB;AACrD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,oBAAoB,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAE5B,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,EAAA,EAAI,OAAO,KAAA;AAGpC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,WAAA,EAAY,GAAI,GAAA;AACxC,EAAA,MAAM,YAAA,GAAe,GAAA,CAAI,QAAA,EAAS,GAAI,CAAA;AAEtC,EAAA,IAAI,IAAA,GAAO,aAAa,OAAO,KAAA;AAC/B,EAAA,IAAI,IAAA,KAAS,WAAA,IAAe,KAAA,GAAQ,YAAA,EAAc,OAAO,KAAA;AAEzD,EAAA,OAAO,IAAA;AACT;;;ACjCO,SAAS,iBAAiB,GAAA,EAAqB;AACpD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACpC,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AAEpB,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM,CAAA;AAChC,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AAEjB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,CAAA;AAEV,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,GAAA,IAAO,OAAO,MAAA,EAAQ;AAC1B,IAAA,KAAA,CAAM,KAAK,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,GAAA,GAAM,GAAG,CAAC,CAAA;AACvC,IAAA,GAAA,IAAO,GAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA,GAAM,OAAO,MAAA,EAAQ;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAKO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACpC;AAKO,SAAS,mBAAmB,GAAA,EAAqB;AACtD,EAAA,MAAM,KAAA,GAAQ,YAAY,GAAG,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,OAAO,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AACnC,EAAA,OAAO,SAAA,GAAY,MAAA;AACrB;;;AC1CO,SAAS,KAAK,UAAA,EAA6B;AAChD,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC3C,EAAA,IAAI,OAAO,MAAA,GAAS,EAAA,IAAM,MAAA,CAAO,MAAA,GAAS,IAAI,OAAO,KAAA;AAErD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,IAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAC5B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,IAAS,CAAA;AAAA,IAC1B;AACA,IAAA,GAAA,IAAO,KAAA;AACP,IAAA,QAAA,GAAW,CAAC,QAAA;AAAA,EACd;AAEA,EAAA,OAAO,MAAM,EAAA,KAAO,CAAA;AACtB;ACqCO,SAAS,eAAA,CAAgB;AAAA,EAC9B,IAAA,GAAO,MAAA;AAAA,EACP,KAAA,GAAQ,qEAAA;AAAA,EACR,MAAA;AAAA,EACA,aAAA,GAAgB,IAAA;AAAA,EAChB,MAAA,GAAS,QAAA;AAAA,EACT,QAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA,GAAoB,qBAAA;AAAA,EACpB,iBAAA,GAAoB,SAAA;AAAA,EACpB,cAAA,GAAiB;AACnB,CAAA,EAAyB;AACvB,EAAA,MAAM,UAAU,0BAAA,EAA2B;AAG3C,EAAA,MAAM,SAAA,GAAYU,OAAyB,IAAI,CAAA;AAC/C,EAAA,MAAM,MAAA,GAASA,OAAyB,IAAI,CAAA;AAG5C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIR,SAAS,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,SAAS,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAG3C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAsB,MAAM,CAAA;AACpE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAsB,MAAM,CAAA;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAsB,MAAM,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,EAAiB;AACvD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,QAAAA,EAAiB;AAGvD,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM,WAAA,CAAY,aAAa,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAG3E,EAAA,MAAM,cAAA,GAAiB,QAAQ,MAAM;AACnC,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,IAAA;AAC3C,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAG5B,EAAA,MAAM,kBAAA,GAAqBK,WAAAA;AAAA,IACzB,CAAC,CAAA,KAA2C;AAC1C,MAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAC1C,MAAA,MAAM,SAAA,GAAY,iBAAiB,GAAG,CAAA;AACtC,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,MAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,MAAA,cAAA,CAAe,MAAS,CAAA;AAExB,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,CAAc,CAAA,EAAG,IAAI,WAAW,GAAG,CAAA;AAAA,MAClD;AAGA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,UAAU,OAAO,CAAA;AAC5C,MAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAQ;AACxB,QAAA,SAAA,CAAU,SAAS,KAAA,EAAM;AAAA,MAC3B;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,IAAA,EAAM,SAAA,CAAU,OAAO;AAAA,GACnC;AAGA,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,MAAM,GAAA,GAAM,gBAAgB,aAAa,CAAA;AACzC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,IAAI,GAAA,CAAI,SAAS,EAAA,EAAI;AACnB,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,cAAA,CAAe,4HAAwB,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,CAAC,IAAA,CAAK,GAAG,CAAA,EAAG;AACrB,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,cAAA,CAAe,wIAA0B,CAAA;AAAA,IAC3C,CAAA,MAAA,IAAW,CAAC,cAAA,EAAgB;AAC1B,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,cAAA,CAAe,8KAAkC,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,cAAA,CAAe,MAAS,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,cAAc,CAAC,CAAA;AAGlC,EAAA,MAAM,kBAAA,GAAqBA,WAAAA;AAAA,IACzB,CAAC,CAAA,KAA2C;AAC1C,MAAA,IAAI,MAAM,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,OAAO,EAAE,CAAA;AAG1C,MAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,GAAG,IAAI,CAAA,EAAG;AACvC,QAAA,GAAA,GAAM,IAAI,GAAG,CAAA,CAAA;AAAA,MACf;AAEA,MAAA,MAAM,SAAA,GAAY,aAAa,GAAG,CAAA;AAClC,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,MAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,MAAA,cAAA,CAAe,MAAS,CAAA;AAExB,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,CAAc,CAAA,EAAG,IAAI,WAAW,SAAS,CAAA;AAAA,MACxD;AAGA,MAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,QAAA,MAAA,CAAO,SAAS,KAAA,EAAM;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAS,IAAI;AAAA,GAChB;AAGA,EAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,cAAA,CAAe,kDAAe,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,CAAC,aAAA,CAAc,aAAa,CAAA,EAAG;AACxC,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,cAAA,CAAe,6FAAkB,CAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,eAAA,CAAgB,OAAO,CAAA;AACvB,MAAA,cAAA,CAAe,MAAS,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,IACtB,CAAC,CAAA,KAA2C;AAC1C,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,SAAA,CAAU,SAAS,CAAA;AAC1E,MAAA,WAAA,CAAY,GAAG,CAAA;AACf,MAAA,YAAA,CAAa,MAAM,CAAA;AAEnB,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAA,CAAQ,IAAA,CAAK,aAAA,CAAc,CAAA,EAAG,IAAI,QAAQ,GAAG,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,IAAA,EAAM,SAAA,CAAU,SAAS;AAAA,GACrC;AAGA,EAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,IAAI,QAAA,CAAS,MAAA,GAAS,SAAA,CAAU,SAAA,EAAW;AACzC,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,SAAA,CAAU,SAAS,CAAC,CAAA;AAElC,EAAA,MAAM,WAAW,MAAA,KAAW,QAAA;AAG5B,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAwB;AAC5C,IAAA,IAAI,MAAA,KAAW,SAAS,OAAO,mDAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,SAAS,OAAO,iDAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,MAAA,KAAwB;AAC1C,IAAA,IAAI,MAAA,KAAW,SAAS,OAAO,QAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,uBACET,KAACC,KAAAA,CAAM,IAAA,EAAN,EAAW,OAAA,EAAS,YAAA,KAAiB,OAAA,IAAW,YAAA,KAAiB,OAAA,EAC/D,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASC,GAAAA,CAACD,KAAAA,CAAM,KAAA,EAAN,EAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBAE9BD,IAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,OAAA;AAAA,QACL,YAAA,EAAY,KAAA;AAAA,QACZ,SAAA,EAAW,WAAW,KAAA,GAAQ,QAAA;AAAA,QAC9B,GAAA,EAAK,WAAW,CAAA,GAAI,CAAA;AAAA,QACpB,KAAA,EAAO,WAAW,QAAA,GAAW,SAAA;AAAA,QAC7B,WAAA,EAAa,WAAW,KAAA,GAAQ,CAAA;AAAA,QAChC,WAAA,EAAa,WAAW,QAAA,GAAW,MAAA;AAAA,QACnC,YAAA,EAAc,WAAW,IAAA,GAAO,MAAA;AAAA,QAChC,QAAA,EAAU,WAAW,QAAA,GAAW,MAAA;AAAA,QAChC,cAAc,QAAA,GACV,EAAE,aAAa,kBAAA,EAAoB,SAAA,EAAW,mDAAkD,GAChG,MAAA;AAAA,QAGJ,QAAA,EAAA;AAAA,0BAAAA,IAAAA;AAAA,YAACe,KAAAA;AAAA,YAAA;AAAA,cACC,UAAU,CAAC,QAAA;AAAA,cACX,IAAA,EAAM,WAAW,GAAA,GAAM,MAAA;AAAA,cACvB,GAAA,EAAK,CAAA;AAAA,cAEJ,QAAA,EAAA;AAAA,gBAAA,aAAA,oBACCb,GAAAA;AAAA,kBAACG,GAAAA;AAAA,kBAAA;AAAA,oBACC,EAAA,EAAI,CAAA;AAAA,oBACJ,OAAA,EAAQ,MAAA;AAAA,oBACR,UAAA,EAAW,QAAA;AAAA,oBACX,gBAAA,EAAkB,WAAW,KAAA,GAAQ,CAAA;AAAA,oBACrC,WAAA,EAAY,QAAA;AAAA,oBAEZ,0BAAAH,GAAAA,CAAC,aAAA,EAAA,EAAc,OAAO,SAAA,CAAU,KAAA,EAAO,MAAM,EAAA,EAAI;AAAA;AAAA,iBACnD;AAAA,gCAEFF,IAAAA,CAACK,GAAAA,EAAA,EAAI,QAAA,EAAS,UAAA,EAAW,MAAM,CAAA,EAC7B,QAAA,EAAA;AAAA,kCAAAH,GAAAA;AAAA,oBAACK,KAAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO,aAAA;AAAA,sBACP,QAAA,EAAU,kBAAA;AAAA,sBACV,MAAA,EAAQ,gBAAA;AAAA,sBACR,WAAA,EAAa,iBAAA;AAAA,sBACb,SAAA,EAAU,SAAA;AAAA,sBACV,YAAA,EAAa,WAAA;AAAA,sBACb,IAAA,EAAK,YAAA;AAAA,sBACL,SAAA,EAAW,mBAAmB,aAAa,CAAA;AAAA,sBAC3C,QAAA;AAAA,sBACA,QAAA;AAAA,sBACA,YAAA,EAAW,+DAAA;AAAA,sBACX,QAAA,EAAS,MAAA;AAAA,sBACT,MAAA,EAAQ,WAAW,MAAA,GAAS,MAAA;AAAA,sBAC5B,aAAa,CAAC,QAAA,GAAW,aAAa,YAAY,CAAA,GAAI,SAAY,QAAA,GAAW,MAAA;AAAA,sBAC7E,KAAA,EAAO,CAAC,QAAA,GAAW,EAAE,QAAQ,YAAA,CAAa,YAAY,GAAE,GAAI,MAAA;AAAA,sBAC5D,MAAA,EAAQ,QAAA,GAAW,EAAE,SAAA,EAAW,QAAO,GAAI;AAAA;AAAA,mBAC7C;AAAA,kBACC,UAAA,CAAW,YAAY,CAAA,oBACtBL,GAAAA;AAAA,oBAACG,GAAAA;AAAA,oBAAA;AAAA,sBACC,QAAA,EAAS,UAAA;AAAA,sBACT,KAAA,EAAO,CAAA;AAAA,sBACP,GAAA,EAAI,KAAA;AAAA,sBACJ,SAAA,EAAU,kBAAA;AAAA,sBACV,KAAA,EAAM,WAAA;AAAA,sBACN,QAAA,EAAS,IAAA;AAAA,sBACT,UAAA,EAAW,MAAA;AAAA,sBAEV,qBAAW,YAAY;AAAA;AAAA;AAC1B,iBAAA,EAEJ;AAAA;AAAA;AAAA,WACF;AAAA,0BAGAL,IAAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAK,QAAA,GAAW,IAAI,CAAA,EAExB,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAACK,GAAAA,EAAA,EAAI,QAAA,EAAS,UAAA,EACZ,QAAA,EAAA;AAAA,8BAAAH,GAAAA;AAAA,gBAACK,KAAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,SAAA;AAAA,kBACL,KAAA,EAAO,aAAA;AAAA,kBACP,QAAA,EAAU,kBAAA;AAAA,kBACV,MAAA,EAAQ,gBAAA;AAAA,kBACR,WAAA,EAAa,iBAAA;AAAA,kBACb,SAAA,EAAU,SAAA;AAAA,kBACV,YAAA,EAAa,QAAA;AAAA,kBACb,IAAA,EAAK,QAAA;AAAA,kBACL,SAAA,EAAW,CAAA;AAAA,kBACX,QAAA;AAAA,kBACA,QAAA;AAAA,kBACA,YAAA,EAAW,2EAAA;AAAA,kBACX,KAAA,EAAO,WAAW,OAAA,GAAU,MAAA;AAAA,kBAC5B,QAAA,EAAS,MAAA;AAAA,kBACT,MAAA,EAAQ,WAAW,MAAA,GAAS,MAAA;AAAA,kBAC5B,UAAA,EAAY,WAAW,WAAA,GAAc,MAAA;AAAA,kBACrC,WAAA,EAAa,WAAW,QAAA,GAAW,MAAA;AAAA,kBACnC,YAAA,EAAc,WAAW,CAAA,GAAI,MAAA;AAAA,kBAC7B,KAAA,EAAO,CAAC,QAAA,GAAW,EAAE,QAAQ,YAAA,CAAa,YAAY,GAAE,GAAI,MAAA;AAAA,kBAC5D,MAAA,EAAQ,QAAA,GAAW,EAAE,SAAA,EAAW,QAAO,GAAI;AAAA;AAAA,eAC7C;AAAA,cACC,UAAA,CAAW,YAAY,CAAA,oBACtBL,GAAAA;AAAA,gBAACG,GAAAA;AAAA,gBAAA;AAAA,kBACC,QAAA,EAAS,UAAA;AAAA,kBACT,KAAA,EAAO,CAAA;AAAA,kBACP,GAAA,EAAI,KAAA;AAAA,kBACJ,SAAA,EAAU,kBAAA;AAAA,kBACV,KAAA,EAAM,WAAA;AAAA,kBACN,QAAA,EAAS,IAAA;AAAA,kBACT,UAAA,EAAW,MAAA;AAAA,kBAEV,qBAAW,YAAY;AAAA;AAAA;AAC1B,aAAA,EAEJ,CAAA;AAAA,4BAGAL,IAAAA,CAACK,GAAAA,EAAA,EAAI,UAAS,UAAA,EACZ,QAAA,EAAA;AAAA,8BAAAL,IAAAA,CAAC,OAAA,CAAQ,IAAA,EAAR,EACC,QAAA,EAAA;AAAA,gCAAAE,IAAC,OAAA,CAAQ,OAAA,EAAR,EAAgB,OAAA,EAAO,MACtB,QAAA,kBAAAA,GAAAA;AAAA,kBAACK,KAAAA;AAAA,kBAAA;AAAA,oBACC,GAAA,EAAK,MAAA;AAAA,oBACL,KAAA,EAAO,QAAA;AAAA,oBACP,QAAA,EAAU,eAAA;AAAA,oBACV,MAAA,EAAQ,aAAA;AAAA,oBACR,WAAA,EAAa,cAAA;AAAA,oBACb,SAAA,EAAU,SAAA;AAAA,oBACV,YAAA,EAAa,QAAA;AAAA,oBACb,IAAA,EAAK,KAAA;AAAA,oBACL,WAAW,SAAA,CAAU,SAAA;AAAA,oBACrB,QAAA;AAAA,oBACA,QAAA;AAAA,oBACA,YAAA,EAAY,CAAA,KAAA,EAAQ,SAAA,CAAU,SAAS,CAAA,gCAAA,CAAA;AAAA,oBACvC,KAAA,EAAO,WAAW,MAAA,GAAS,MAAA;AAAA,oBAC3B,QAAA,EAAS,MAAA;AAAA,oBACT,MAAA,EAAQ,WAAW,MAAA,GAAS,MAAA;AAAA,oBAC5B,UAAA,EAAY,WAAW,WAAA,GAAc,MAAA;AAAA,oBACrC,WAAA,EAAa,WAAW,QAAA,GAAW,MAAA;AAAA,oBACnC,YAAA,EAAc,WAAW,CAAA,GAAI,MAAA;AAAA,oBAC7B,KAAA,EAAO,CAAC,QAAA,GAAW,EAAE,QAAQ,YAAA,CAAa,SAAS,GAAE,GAAI,MAAA;AAAA,oBACzD,MAAA,EAAQ,QAAA,GAAW,EAAE,SAAA,EAAW,QAAO,GAAI;AAAA;AAAA,iBAC7C,EACF,CAAA;AAAA,gCACAL,IAAC,OAAA,CAAQ,UAAA,EAAR,EACC,QAAA,kBAAAA,GAAAA,CAAC,OAAA,CAAQ,OAAA,EAAR,EACC,QAAA,kBAAAA,IAACI,IAAAA,EAAA,EAAK,UAAS,IAAA,EACZ,QAAA,EAAA,SAAA,CAAU,UAAU,MAAA,GACjB,oKAAA,GACA,0KAAA,EACN,CAAA,EACF,CAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,cACC,UAAA,CAAW,SAAS,CAAA,oBACnBJ,GAAAA;AAAA,gBAACG,GAAAA;AAAA,gBAAA;AAAA,kBACC,QAAA,EAAS,UAAA;AAAA,kBACT,KAAA,EAAO,CAAA;AAAA,kBACP,GAAA,EAAI,KAAA;AAAA,kBACJ,SAAA,EAAU,kBAAA;AAAA,kBACV,KAAA,EAAM,WAAA;AAAA,kBACN,QAAA,EAAS,IAAA;AAAA,kBACT,UAAA,EAAW,MAAA;AAAA,kBAEV,qBAAW,SAAS;AAAA;AAAA;AACvB,aAAA,EAEJ;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,IAGC,+BAAeH,GAAAA,CAACD,KAAAA,CAAM,SAAA,EAAN,EAAiB,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,IAC7C,+BAAeC,GAAAA,CAACD,KAAAA,CAAM,SAAA,EAAN,EAAiB,QAAA,EAAA,WAAA,EAAY;AAAA,GAAA,EAChD,CAAA;AAEJ;AC3XO,SAAS,gBAAA,GAAmB;AACjC,EAAA,OAAO,EAAE,MAAA,CAAO;AAAA,IACd,QAAQ,CAAA,CACL,MAAA,GACA,GAAA,CAAI,EAAA,EAAI,wEAAiB,CAAA,CACzB,GAAA,CAAI,EAAA,EAAI,8EAAkB,EAC1B,MAAA,CAAO,CAAC,QAAQ,IAAA,CAAK,GAAG,GAAG,wIAA0B,CAAA;AAAA,IACxD,MAAA,EAAQ,CAAA,CACL,MAAA,EAAO,CACP,MAAM,gBAAA,EAAkB,4CAAc,CAAA,CACtC,MAAA,CAAO,CAAC,GAAA,KAAQ,aAAA,CAAc,GAAG,GAAG,6FAAkB,CAAA;AAAA,IACzD,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,6EAAiB,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,mFAAkB;AAAA,GACpE,CAAA;AACH","file":"chunk-2PSXYC3I.js","sourcesContent":["import type { AddressProvider, AddressSuggestion, SuggestionOptions } from './types'\n\nconst DADATA_URL = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address'\n\ninterface DaDataConfig {\n /** DaData API token */\n token: string\n /** Custom API base URL (default: DaData production) */\n baseUrl?: string\n}\n\n/**\n * Create a DaData address provider (Russia).\n *\n * @example\n * ```typescript\n * import { createDaDataProvider } from '@letar/forms'\n *\n * const dadata = createDaDataProvider({ token: process.env.DADATA_TOKEN })\n *\n * <Form.Field.Address name=\"address\" provider={dadata} />\n * ```\n */\nexport function createDaDataProvider(config: DaDataConfig): AddressProvider {\n const { token, baseUrl = DADATA_URL } = config\n\n return {\n async getSuggestions(query: string, options?: SuggestionOptions): Promise<AddressSuggestion[]> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const body: Record<string, any> = {\n query,\n count: options?.count ?? 10,\n }\n\n // DaData-specific: from_bound/to_bound for city-level restriction\n if (options?.bounds) {\n if (options.bounds.from) body.from_bound = { value: options.bounds.from }\n if (options.bounds.to) body.to_bound = { value: options.bounds.to }\n }\n\n // DaData-specific: locations filter\n if (options?.filters) {\n body.locations = [options.filters]\n }\n\n const response = await fetch(baseUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Token ${token}`,\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n return []\n }\n\n const data = await response.json()\n const suggestions = data.suggestions ?? []\n\n return suggestions.map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (s: any): AddressSuggestion => ({\n label: s.value,\n value: s.value,\n data: s.data,\n })\n )\n },\n }\n}\n","'use client'\n\nimport { Box, Field, Input, List, Spinner, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\nimport { useDeclarativeFormOptional } from '../../form-context'\nimport type { AddressFieldProps, AddressValue } from '../../types'\nimport { createField, FieldError, FieldLabel, useDebounce } from '../base'\nimport type { AddressProvider, AddressSuggestion } from './providers'\nimport { createDaDataProvider } from './providers'\n\n/**\n * Resolve address provider from props, context, or token fallback.\n */\nfunction useAddressProvider(propProvider?: AddressProvider, token?: string): AddressProvider | null {\n const formContext = useDeclarativeFormOptional()\n\n // Priority: prop > createForm context > token fallback\n if (propProvider) return propProvider\n if (formContext?.addressProvider) return formContext.addressProvider\n if (token) return createDaDataProvider({ token })\n return null\n}\n\n/**\n * State for address field\n */\ninterface AddressFieldState {\n inputValue: string\n setInputValue: (value: string) => void\n suggestions: AddressSuggestion[]\n setSuggestions: (suggestions: AddressSuggestion[]) => void\n isLoading: boolean\n setIsLoading: (loading: boolean) => void\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n highlightedIndex: number\n setHighlightedIndex: (index: number) => void\n containerRef: React.RefObject<HTMLDivElement | null>\n debouncedQuery: string\n fetchSuggestions: (query: string) => Promise<void>\n initializedRef: React.RefObject<boolean>\n}\n\n/**\n * Form.Field.Address — address input with autocomplete suggestions.\n *\n * Supports pluggable address providers. DaData (Russia) is built-in;\n * pass any `AddressProvider` for other geocoding services.\n *\n * @example With provider (recommended)\n * ```tsx\n * const dadata = createDaDataProvider({ token: '...' })\n * <Form.Field.Address name=\"address\" provider={dadata} />\n * ```\n *\n * @example With token (backward compatible, auto-creates DaData provider)\n * ```tsx\n * <Form.Field.Address name=\"address\" token=\"dadata-token\" />\n * ```\n *\n * @example Return only string value\n * ```tsx\n * <Form.Field.Address name=\"address\" provider={dadata} valueOnly />\n * ```\n */\nexport const FieldAddress = createField<AddressFieldProps, AddressValue | string, AddressFieldState>({\n displayName: 'FieldAddress',\n\n useFieldState: (props) => {\n const { provider: propProvider, token, minChars = 3, debounceMs = 300, locations } = props\n const provider = useAddressProvider(propProvider, token)\n\n const [inputValue, setInputValue] = useState('')\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [isOpen, setIsOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const initializedRef = useRef(false)\n\n const debouncedQuery = useDebounce(inputValue, debounceMs)\n\n // Fetch suggestions from provider\n const fetchSuggestions = useCallback(\n async (query: string) => {\n if (query.length < minChars || !provider) {\n setSuggestions([])\n return\n }\n\n setIsLoading(true)\n try {\n const results = await provider.getSuggestions(query, {\n count: 10,\n filters: locations ? Object.assign({}, ...locations) : undefined,\n })\n setSuggestions(results)\n setIsOpen(true)\n } catch (error) {\n console.error('Error loading address suggestions:', error)\n setSuggestions([])\n } finally {\n setIsLoading(false)\n }\n },\n [provider, minChars, locations]\n )\n\n // Load on debounced query change\n useEffect(() => {\n if (debouncedQuery) {\n fetchSuggestions(debouncedQuery)\n } else {\n setSuggestions([])\n setIsOpen(false)\n }\n }, [debouncedQuery, fetchSuggestions])\n\n // Close on click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n return {\n inputValue,\n setInputValue,\n suggestions,\n setSuggestions,\n isLoading,\n setIsLoading,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n containerRef,\n debouncedQuery,\n fetchSuggestions,\n initializedRef,\n }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const { valueOnly = false } = componentProps\n const {\n inputValue,\n setInputValue,\n suggestions,\n setSuggestions,\n isLoading,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n containerRef,\n initializedRef,\n } = fieldState\n\n const fieldValue = field.state.value as AddressValue | string | undefined\n\n // Initialize input value from field (only on first render)\n if (!initializedRef.current && fieldValue) {\n const displayValue = typeof fieldValue === 'string' ? fieldValue : fieldValue.value\n if (displayValue && displayValue !== inputValue) {\n setInputValue(displayValue)\n }\n initializedRef.current = true\n }\n\n // Handler for suggestion selection\n const handleSelect = (suggestion: AddressSuggestion) => {\n setInputValue(suggestion.value)\n setIsOpen(false)\n setSuggestions([])\n\n if (valueOnly) {\n field.handleChange(suggestion.value)\n } else {\n const addressValue: AddressValue = {\n value: suggestion.value,\n data: suggestion.data,\n }\n field.handleChange(addressValue)\n }\n }\n\n // Keyboard navigation handler\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isOpen || suggestions.length === 0) {\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex(highlightedIndex < suggestions.length - 1 ? highlightedIndex + 1 : 0)\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex(highlightedIndex > 0 ? highlightedIndex - 1 : suggestions.length - 1)\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0) {\n handleSelect(suggestions[highlightedIndex])\n }\n break\n case 'Escape':\n setIsOpen(false)\n break\n }\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <Box ref={containerRef} position=\"relative\" width=\"100%\">\n <Input\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n setHighlightedIndex(-1)\n }}\n onFocus={() => {\n if (suggestions.length > 0) {\n setIsOpen(true)\n }\n }}\n onBlur={field.handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={resolved.placeholder ?? 'Start typing address...'}\n data-field-name={fullPath}\n />\n {isLoading && (\n <Box position=\"absolute\" right={3} top=\"50%\" transform=\"translateY(-50%)\">\n <Spinner size=\"sm\" />\n </Box>\n )}\n {isOpen && suggestions.length > 0 && (\n <List.Root\n position=\"absolute\"\n zIndex={10}\n width=\"100%\"\n bg=\"bg.panel\"\n borderWidth=\"1px\"\n borderRadius=\"md\"\n shadow=\"md\"\n maxH=\"200px\"\n overflowY=\"auto\"\n mt={1}\n >\n {suggestions.map((suggestion, index) => (\n <List.Item\n key={suggestion.value + index}\n px={3}\n py={2}\n cursor=\"pointer\"\n bg={highlightedIndex === index ? 'bg.muted' : undefined}\n _hover={{ bg: 'bg.muted' }}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n <Text fontSize=\"sm\">{suggestion.label}</Text>\n </List.Item>\n ))}\n </List.Root>\n )}\n </Box>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { ColorPicker, Field, HStack, parseColor, Portal } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps, FieldTooltipMeta } from '../../types'\nimport { createField, FieldError } from '../base'\nimport { FieldTooltip } from '../base/field-tooltip'\n\n/**\n * Props for ColorPicker field\n */\nexport interface ColorPickerFieldProps extends Omit<BaseFieldProps, 'placeholder'> {\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n /** Color palette for quick selection */\n swatches?: string[]\n /** Size (by default: md) */\n size?: '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n /** Show area picker (saturation/brightness) (by default: true) */\n showArea?: boolean\n /** Show eyedropper button (by default: true) */\n showEyeDropper?: boolean\n /** Show hue/alpha sliders (by default: true) */\n showSliders?: boolean\n /** Show hex input (by default: true) */\n showInput?: boolean\n}\n\n/**\n * Default palette\n */\nconst defaultSwatches = [\n '#000000',\n '#4A5568',\n '#F56565',\n '#ED64A6',\n '#9F7AEA',\n '#6B46C1',\n '#4299E1',\n '#0BC5EA',\n '#38B2AC',\n '#48BB78',\n '#ECC94B',\n '#DD6B20',\n]\n\n/**\n * Form.Field.ColorPicker - Color selection with picker\n *\n * Renders color picker with optional palette, area picker,\n * sliders and hex input.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.ColorPicker\n * name=\"color\"\n * label=\"Select color\"\n * />\n * ```\n *\n * @example With custom palette\n * ```tsx\n * <Form.Field.ColorPicker\n * name=\"brandColor\"\n * label=\"Brand color\"\n * swatches={['#FF0000', '#00FF00', '#0000FF']}\n * />\n * ```\n *\n * @example Minimal (palette only)\n * ```tsx\n * <Form.Field.ColorPicker\n * name=\"accent\"\n * showArea={false}\n * showSliders={false}\n * showInput={false}\n * swatches={['#FF0000', '#00FF00', '#0000FF', '#FFFF00']}\n * />\n * ```\n */\nexport const FieldColorPicker = createField<ColorPickerFieldProps, string>({\n displayName: 'FieldColorPicker',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n swatches = defaultSwatches,\n size = 'md',\n showArea = true,\n showEyeDropper = true,\n showSliders = true,\n showInput = true,\n } = componentProps\n\n const currentValue = (field.state.value as string) || '#000000'\n\n // Parse color safely\n let parsedColor\n try {\n parsedColor = parseColor(currentValue)\n } catch {\n parsedColor = parseColor('#000000')\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <ColorPicker.Root\n value={parsedColor}\n onValueChange={(details) => {\n // Use valueAsString which is already in correct format\n field.handleChange(details.valueAsString)\n }}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n size={size}\n >\n <ColorPicker.HiddenInput name={fullPath} />\n\n {resolved.label && (\n <ColorPicker.Label>\n {resolved.tooltip ? (\n <HStack gap={1}>\n <span>{resolved.label}</span>\n <FieldTooltip {...resolved.tooltip} />\n </HStack>\n ) : (\n resolved.label\n )}\n {resolved.required && <Field.RequiredIndicator />}\n </ColorPicker.Label>\n )}\n\n <ColorPicker.Control>\n {showInput && <ColorPicker.ChannelInput channel=\"hex\" />}\n <ColorPicker.Trigger />\n </ColorPicker.Control>\n\n <Portal>\n <ColorPicker.Positioner>\n <ColorPicker.Content>\n {showArea && <ColorPicker.Area />}\n\n {(showEyeDropper || showSliders) && (\n <HStack>\n {showEyeDropper && <ColorPicker.EyeDropper size=\"xs\" variant=\"outline\" />}\n {showSliders && <ColorPicker.Sliders />}\n </HStack>\n )}\n\n {swatches.length > 0 && (\n <ColorPicker.SwatchGroup>\n {swatches.map((swatch) => (\n <ColorPicker.SwatchTrigger key={swatch} value={swatch}>\n <ColorPicker.Swatch value={swatch} boxSize=\"4.5\" />\n </ColorPicker.SwatchTrigger>\n ))}\n </ColorPicker.SwatchGroup>\n )}\n </ColorPicker.Content>\n </ColorPicker.Positioner>\n </Portal>\n </ColorPicker.Root>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","/**\n * Утилиты безопасности файлов.\n *\n * - Проверка MIME-типа по magic bytes (не по расширению)\n * - Удаление EXIF-метаданных через Canvas API\n * - Санитизация имени файла (защита от path traversal)\n */\n\n// Сигнатуры файлов (magic bytes)\nconst MIME_SIGNATURES: Array<{ bytes: number[]; mime: string }> = [\n // Изображения\n { bytes: [0xff, 0xd8, 0xff], mime: 'image/jpeg' },\n { bytes: [0x89, 0x50, 0x4e, 0x47], mime: 'image/png' },\n { bytes: [0x47, 0x49, 0x46, 0x38], mime: 'image/gif' },\n { bytes: [0x52, 0x49, 0x46, 0x46], mime: 'image/webp' }, // RIFF (WebP контейнер)\n // Документы\n { bytes: [0x25, 0x50, 0x44, 0x46], mime: 'application/pdf' },\n // Архивы\n { bytes: [0x50, 0x4b, 0x03, 0x04], mime: 'application/zip' },\n]\n\n/**\n * Конфигурация безопасности файлов\n */\nexport interface FileSecurityConfig {\n /** Максимальный размер файла (строка: '10MB', '500KB' или число в байтах) */\n maxSize?: string | number\n /** Разрешённые MIME-типы (проверяются по magic bytes, не по расширению) */\n allowedTypes?: string[]\n /** Удалить EXIF-метаданные из изображений (Canvas re-encode) */\n stripMetadata?: boolean\n /** Переименовать файл (UUID, защита от path traversal) */\n renameFile?: boolean\n}\n\n/**\n * Результат проверки безопасности файла\n */\nexport interface FileSecurityResult {\n /** Файл прошёл проверку */\n valid: boolean\n /** Обработанный файл (может быть изменён: EXIF удалён, имя заменено) */\n file: File\n /** Причина отклонения */\n reason?: string\n}\n\n/**\n * Парсит строку размера файла в байты.\n *\n * @example parseFileSize('10MB') // 10485760\n * @example parseFileSize('500KB') // 512000\n * @example parseFileSize(1024) // 1024\n */\nexport function parseFileSize(size: string | number): number {\n if (typeof size === 'number') return size\n\n const match = size.match(/^(\\d+(?:\\.\\d+)?)\\s*(B|KB|MB|GB)$/i)\n if (!match) {\n throw new Error(`Invalid file size format: \"${size}\". Use \"10MB\", \"500KB\", etc.`)\n }\n\n const value = Number.parseFloat(match[1])\n const unit = match[2].toUpperCase()\n\n const multipliers: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n }\n\n return Math.floor(value * multipliers[unit])\n}\n\n/**\n * Определяет MIME-тип файла по magic bytes (первые 8 байт).\n * Возвращает null если сигнатура не распознана.\n */\nexport async function detectMimeType(file: File): Promise<string | null> {\n const buffer = await file.slice(0, 8).arrayBuffer()\n const bytes = new Uint8Array(buffer)\n\n for (const sig of MIME_SIGNATURES) {\n if (sig.bytes.every((b, i) => bytes[i] === b)) {\n return sig.mime\n }\n }\n\n return null\n}\n\n/**\n * Проверяет MIME-тип файла по magic bytes.\n * Если тип не определён — проверяет по file.type (fallback на расширение).\n */\nexport async function validateMimeType(\n file: File,\n allowedTypes: string[]\n): Promise<{ valid: boolean; detectedMime: string | null; reason?: string }> {\n const detectedMime = await detectMimeType(file)\n\n // Используем определённый MIME или file.type как fallback\n const mimeToCheck = detectedMime ?? file.type\n\n if (!mimeToCheck) {\n return { valid: false, detectedMime, reason: 'Unable to determine file type' }\n }\n\n // Проверяем с учётом wildcard (image/*)\n const isAllowed = allowedTypes.some((allowed) => {\n if (allowed.endsWith('/*')) {\n const category = allowed.split('/')[0]\n return mimeToCheck.startsWith(`${category}/`)\n }\n return allowed === mimeToCheck\n })\n\n if (!isAllowed) {\n return {\n valid: false,\n detectedMime,\n reason: `File type \"${mimeToCheck}\" is not allowed. Allowed: ${allowedTypes.join(', ')}`,\n }\n }\n\n return { valid: true, detectedMime }\n}\n\n/**\n * Удаляет EXIF-метаданные из изображения через Canvas re-encode.\n * Для не-изображений возвращает файл без изменений.\n */\nexport async function stripExifMetadata(file: File): Promise<File> {\n // Пропускаем не-изображения\n if (!file.type.startsWith('image/')) {\n return file\n }\n\n // SVG не содержит EXIF\n if (file.type === 'image/svg+xml') {\n return file\n }\n\n return new Promise<File>((resolve) => {\n const img = new Image()\n const url = URL.createObjectURL(file)\n\n img.onload = () => {\n const canvas = document.createElement('canvas')\n canvas.width = img.naturalWidth\n canvas.height = img.naturalHeight\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n URL.revokeObjectURL(url)\n resolve(file) // Fallback — возвращаем как есть\n return\n }\n\n ctx.drawImage(img, 0, 0)\n URL.revokeObjectURL(url)\n\n // Определяем формат вывода\n const outputType = file.type === 'image/png' ? 'image/png' : 'image/jpeg'\n const quality = outputType === 'image/jpeg' ? 0.92 : undefined\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n resolve(file)\n return\n }\n resolve(new File([blob], file.name, { type: outputType, lastModified: Date.now() }))\n },\n outputType,\n quality\n )\n }\n\n img.onerror = () => {\n URL.revokeObjectURL(url)\n resolve(file) // Fallback\n }\n\n img.src = url\n })\n}\n\n/**\n * Санитизирует имя файла — заменяет на UUID, сохраняя расширение.\n * Защита от path traversal (../../etc/passwd).\n */\nexport function sanitizeFileName(file: File): File {\n // Извлекаем только базовое имя без пути (защита от path traversal)\n const baseName = file.name.split(/[/\\\\]/).pop() ?? file.name\n const lastDot = baseName.lastIndexOf('.')\n const ext = lastDot > 0 ? baseName.slice(lastDot) : ''\n\n // Генерируем UUID-подобное имя\n const uuid = crypto.randomUUID()\n const safeName = `${uuid}${ext}`\n\n return new File([file], safeName, { type: file.type, lastModified: file.lastModified })\n}\n\n/**\n * Применяет все проверки безопасности к файлу.\n * Возвращает обработанный файл или причину отклонения.\n */\nexport async function processFileWithSecurity(file: File, config: FileSecurityConfig): Promise<FileSecurityResult> {\n // 1. Проверка размера\n if (config.maxSize) {\n const maxBytes = parseFileSize(config.maxSize)\n if (file.size > maxBytes) {\n return {\n valid: false,\n file,\n reason: `File size ${formatSize(file.size)} exceeds limit ${formatSize(maxBytes)}`,\n }\n }\n }\n\n // 2. Проверка MIME-типа\n if (config.allowedTypes) {\n const mimeResult = await validateMimeType(file, config.allowedTypes)\n if (!mimeResult.valid) {\n return { valid: false, file, reason: mimeResult.reason }\n }\n }\n\n let processedFile = file\n\n // 3. Удаление EXIF\n if (config.stripMetadata) {\n processedFile = await stripExifMetadata(processedFile)\n }\n\n // 4. Переименование\n if (config.renameFile) {\n processedFile = sanitizeFileName(processedFile)\n }\n\n return { valid: true, file: processedFile }\n}\n\n/**\n * Форматирует размер файла для отображения в сообщениях об ошибках.\n */\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n","'use client'\n\nimport {\n Box,\n Button,\n Field,\n FileUpload,\n Float,\n HStack,\n Icon,\n IconButton,\n Input,\n Text,\n useFileUploadContext,\n} from '@chakra-ui/react'\nimport { type ReactElement, type ReactNode, useState } from 'react'\nimport { LuFile, LuUpload, LuX } from 'react-icons/lu'\nimport type { FileSecurityConfig } from '../../security/file-security'\nimport { processFileWithSecurity } from '../../security/file-security'\nimport type { FieldTooltipMeta } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Props for FileUpload field\n */\nexport interface FileUploadFieldProps {\n /** Field name */\n name?: string\n /** Field label */\n label?: string\n /** Helper text below the field */\n helperText?: string\n /** Required field */\n required?: boolean\n /** Disabled field */\n disabled?: boolean\n /** Tooltip for field label */\n tooltip?: FieldTooltipMeta\n\n /**\n * Accepted file types\n * @example \"image/*\"\n * @example [\"image/png\", \"image/jpeg\"]\n * @example \".pdf,.doc,.docx\"\n */\n accept?: string | string[]\n /** Maximum file size in bytes */\n maxFileSize?: number\n /** Maximum number of files (by default: 1) */\n maxFiles?: number\n /**\n * Display variant\n * - 'button': Simple trigger button\n * - 'dropzone': Drag & drop zone\n * - 'input': Input-like appearance\n */\n variant?: 'button' | 'dropzone' | 'input'\n /** Show file sizes in list */\n showSize?: boolean\n /** Allow removing files from list */\n clearable?: boolean\n /** Dropzone label text */\n dropzoneLabel?: ReactNode\n /** Dropzone description */\n dropzoneDescription?: ReactNode\n /** Button text (for 'button' variant) */\n buttonText?: ReactNode\n /**\n * Security configuration for file validation.\n * - maxSize: max file size ('10MB', '500KB')\n * - allowedTypes: MIME types checked via magic bytes\n * - stripMetadata: remove EXIF from images\n * - renameFile: replace filename with UUID\n */\n security?: FileSecurityConfig\n}\n\n/**\n * File list with image previews\n */\nfunction FileImageList({ clearable }: { clearable?: boolean }) {\n const fileUpload = useFileUploadContext()\n\n if (fileUpload.acceptedFiles.length === 0) {\n return null\n }\n\n return (\n <HStack wrap=\"wrap\" gap=\"3\" mt=\"2\">\n {fileUpload.acceptedFiles.map((file) => (\n <FileUpload.Item key={file.name} file={file} p=\"2\" width=\"auto\" pos=\"relative\">\n {clearable && (\n <Float placement=\"top-end\">\n <FileUpload.ItemDeleteTrigger asChild>\n <IconButton size=\"2xs\" variant=\"solid\" colorPalette=\"red\" rounded=\"full\">\n <LuX />\n </IconButton>\n </FileUpload.ItemDeleteTrigger>\n </Float>\n )}\n <FileUpload.ItemPreview type=\"image/*\" asChild>\n <FileUpload.ItemPreviewImage boxSize=\"16\" rounded=\"md\" objectFit=\"cover\" />\n </FileUpload.ItemPreview>\n <FileUpload.ItemPreview type=\".*\" asChild>\n <Icon fontSize=\"4xl\" color=\"fg.muted\">\n <LuFile />\n </Icon>\n </FileUpload.ItemPreview>\n </FileUpload.Item>\n ))}\n </HStack>\n )\n}\n\n/**\n * Standard file list (non-images)\n */\nfunction FileList({ showSize, clearable }: { showSize?: boolean; clearable?: boolean }) {\n const fileUpload = useFileUploadContext()\n\n if (fileUpload.acceptedFiles.length === 0) {\n return null\n }\n\n return (\n <FileUpload.ItemGroup mt=\"2\">\n {fileUpload.acceptedFiles.map((file) => (\n <FileUpload.Item key={file.name} file={file}>\n <FileUpload.ItemPreview asChild>\n <Icon fontSize=\"lg\" color=\"fg.muted\">\n <LuFile />\n </Icon>\n </FileUpload.ItemPreview>\n\n {showSize ? (\n <FileUpload.ItemContent>\n <FileUpload.ItemName />\n <FileUpload.ItemSizeText />\n </FileUpload.ItemContent>\n ) : (\n <FileUpload.ItemName flex=\"1\" />\n )}\n\n {clearable && (\n <FileUpload.ItemDeleteTrigger asChild>\n <IconButton variant=\"ghost\" color=\"fg.muted\" size=\"xs\">\n <LuX />\n </IconButton>\n </FileUpload.ItemDeleteTrigger>\n )}\n </FileUpload.Item>\n ))}\n </FileUpload.ItemGroup>\n )\n}\n\n/**\n * Form.Field.FileUpload - File upload field with multiple variants\n *\n * Supports uploading single or multiple files with drag & drop,\n * file preview and automatic form integration.\n *\n * @example Button variant (by default)\n * ```tsx\n * <Form.Field.FileUpload name=\"avatar\" label=\"Avatar\" accept=\"image/*\" />\n * ```\n *\n * @example Dropzone variant\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"documents\"\n * label=\"Documents\"\n * variant=\"dropzone\"\n * maxFiles={5}\n * accept=\".pdf,.doc,.docx\"\n * dropzoneLabel=\"Drop files here\"\n * dropzoneDescription=\"PDF, DOC up to 10MB\"\n * />\n * ```\n *\n * @example Input variant\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"file\"\n * label=\"Select file\"\n * variant=\"input\"\n * placeholder=\"Select file...\"\n * />\n * ```\n *\n * @example Multiple images with preview\n * ```tsx\n * <Form.Field.FileUpload\n * name=\"gallery\"\n * label=\"Gallery\"\n * variant=\"dropzone\"\n * accept=\"image/*\"\n * maxFiles={10}\n * showSize\n * clearable\n * />\n * ```\n */\nexport const FieldFileUpload = createField<FileUploadFieldProps, File[]>({\n displayName: 'FieldFileUpload',\n\n useFieldState: (componentProps) => {\n const [securityError, setSecurityError] = useState<string | null>(null)\n return { securityError, setSecurityError }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const {\n accept,\n maxFileSize,\n maxFiles = 1,\n variant = 'button',\n showSize = false,\n clearable = true,\n dropzoneLabel = 'Drag and drop files here',\n dropzoneDescription,\n buttonText = 'Upload file',\n security,\n } = componentProps\n const { securityError, setSecurityError } = fieldState\n\n const placeholder = resolved.placeholder ?? 'Select file(s)'\n\n // Normalize accept to array for Chakra\n const normalizedAccept = accept\n ? typeof accept === 'string'\n ? accept.split(',').map((s) => s.trim())\n : accept\n : undefined\n\n // Check if working with images for preview\n const isImageUpload = normalizedAccept?.some((type) => type.startsWith('image/') || type === 'image/*')\n\n return (\n <Field.Root invalid={hasError} required={resolved.required} disabled={resolved.disabled}>\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n\n <FileUpload.Root\n maxFiles={maxFiles}\n maxFileSize={maxFileSize}\n accept={normalizedAccept}\n disabled={resolved.disabled}\n onFileChange={async (details) => {\n if (!security || details.acceptedFiles.length === 0) {\n setSecurityError(null)\n field.handleChange(details.acceptedFiles)\n return\n }\n\n // Применяем security-проверки к каждому файлу\n const results = await Promise.all(details.acceptedFiles.map((f) => processFileWithSecurity(f, security)))\n\n const rejected = results.filter((r) => !r.valid)\n if (rejected.length > 0) {\n setSecurityError(rejected.map((r) => r.reason).join('; '))\n // Пропускаем только валидные файлы\n const validFiles = results.filter((r) => r.valid).map((r) => r.file)\n field.handleChange(validFiles.length > 0 ? validFiles : [])\n return\n }\n\n setSecurityError(null)\n field.handleChange(results.map((r) => r.file))\n }}\n data-field-name={fullPath}\n >\n <FileUpload.HiddenInput onBlur={field.handleBlur} />\n\n {variant === 'button' && (\n <>\n <FileUpload.Trigger asChild>\n <Button variant=\"outline\" size=\"sm\">\n <LuUpload />\n {buttonText}\n </Button>\n </FileUpload.Trigger>\n {isImageUpload ? (\n <FileImageList clearable={clearable} />\n ) : (\n <FileList showSize={showSize} clearable={clearable} />\n )}\n </>\n )}\n\n {variant === 'dropzone' && (\n <>\n <FileUpload.Dropzone>\n <Icon size=\"md\" color=\"fg.muted\">\n <LuUpload />\n </Icon>\n <FileUpload.DropzoneContent>\n <Box>{dropzoneLabel}</Box>\n {dropzoneDescription && <Text color=\"fg.muted\">{dropzoneDescription}</Text>}\n </FileUpload.DropzoneContent>\n </FileUpload.Dropzone>\n {isImageUpload ? (\n <FileImageList clearable={clearable} />\n ) : (\n <FileList showSize={showSize} clearable={clearable} />\n )}\n </>\n )}\n\n {variant === 'input' && (\n <Input asChild>\n <FileUpload.Trigger>\n <FileUpload.Context>\n {({ acceptedFiles }) => {\n if (acceptedFiles.length === 1) {\n return <span>{acceptedFiles[0].name}</span>\n }\n if (acceptedFiles.length > 1) {\n return <span>{acceptedFiles.length} files</span>\n }\n return <Text color=\"fg.subtle\">{placeholder}</Text>\n }}\n </FileUpload.Context>\n </FileUpload.Trigger>\n </Input>\n )}\n </FileUpload.Root>\n\n <FieldError\n hasError={hasError || !!securityError}\n errorMessage={securityError ?? errorMessage}\n helperText={resolved.helperText}\n />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Box, Button, HStack, PinInput, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useState } from 'react'\nimport { useDeclarativeForm } from '../../form-context'\nimport type { DeclarativeFormContextValue, OTPInputFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * State for OTP field with timer\n */\ninterface OTPFieldState {\n /** Seconds counter until retry is available */\n countdown: number\n /** Whether resend is in progress */\n isResending: boolean\n /** Resend handler */\n handleResend: () => Promise<void>\n /** Formatted countdown (MM:SS) */\n formatCountdown: (seconds: number) => string\n /** Context declarative form for auto-submit */\n formContext: DeclarativeFormContextValue\n}\n\n/**\n * Form.Field.OTPInput - OTP input field with resend timer\n *\n * Renders a PIN input for OTP verification with optional resend functionality.\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.OTPInput name=\"code\" label=\"Confirmation Code\" />\n * ```\n *\n * @example With resend\n * ```tsx\n * <Form.Field.OTPInput\n * name=\"code\"\n * length={6}\n * resendTimeout={60}\n * onResend={async () => { await sendCode() }}\n * autoSubmit\n * />\n * ```\n *\n * @example Alphanumeric input\n * ```tsx\n * <Form.Field.OTPInput name=\"code\" type=\"alphanumeric\" />\n * ```\n */\nexport const FieldOTPInput = createField<OTPInputFieldProps, string, OTPFieldState>({\n displayName: 'FieldOTPInput',\n\n useFieldState: (props) => {\n const [countdown, setCountdown] = useState(0)\n const [isResending, setIsResending] = useState(false)\n\n // Countdown timer effect\n useEffect(() => {\n if (countdown <= 0) {\n return\n }\n\n const timer = setInterval(() => {\n setCountdown((prev) => prev - 1)\n }, 1000)\n\n return () => clearInterval(timer)\n }, [countdown])\n\n const handleResend = useCallback(async () => {\n if (!props.onResend || countdown > 0) {\n return\n }\n\n setIsResending(true)\n try {\n await props.onResend()\n setCountdown(props.resendTimeout ?? 60)\n } finally {\n setIsResending(false)\n }\n }, [props.onResend, countdown, props.resendTimeout])\n\n // Format countdown as MM:SS\n const formatCountdown = (seconds: number): string => {\n const mins = Math.floor(seconds / 60)\n const secs = seconds % 60\n return `${mins}:${secs.toString().padStart(2, '0')}`\n }\n\n // Form context for auto-submit (hook called at top level)\n const formContext = useDeclarativeForm()\n\n return { countdown, isResending, handleResend, formatCountdown, formContext }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const { length = 6, autoSubmit = false, type = 'numeric', mask = false, onResend } = componentProps\n const { countdown, isResending, handleResend, formatCountdown, formContext } = fieldState\n\n const value = (field.state.value as string) ?? ''\n\n const handleValueComplete = (details: { value: string[]; valueAsString: string }) => {\n field.handleChange(details.valueAsString)\n\n // Auto-submit when filled\n if (autoSubmit && details.valueAsString.length === length) {\n formContext.form.handleSubmit()\n }\n }\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <Box>\n <PinInput.Root\n value={value.split('')}\n onValueComplete={handleValueComplete}\n onValueChange={(details) => field.handleChange(details.valueAsString)}\n count={length}\n type={type}\n mask={mask}\n otp\n >\n <PinInput.Control>\n <HStack gap={2}>\n {Array.from({ length }).map((_, index) => (\n <PinInput.Input key={index} index={index} data-field-name={index === 0 ? fullPath : undefined} />\n ))}\n </HStack>\n </PinInput.Control>\n <PinInput.HiddenInput />\n </PinInput.Root>\n\n {onResend && (\n <HStack mt={3} justify=\"center\">\n {countdown > 0 ? (\n <Text fontSize=\"sm\" color=\"fg.muted\">\n Redo in {formatCountdown(countdown)}\n </Text>\n ) : (\n <Button variant=\"ghost\" size=\"sm\" onClick={handleResend} disabled={isResending} loading={isResending}>\n Submit again\n </Button>\n )}\n </HStack>\n )}\n </Box>\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Field, Group, Input, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback } from 'react'\nimport { withMask } from 'use-mask-input'\nimport type { PhoneCountry, PhoneFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Phone masks by country\n */\nconst PHONE_MASKS: Record<PhoneCountry, string | string[]> = {\n RU: '+7 (999) 999-99-99',\n US: '+1 (999) 999-9999',\n UK: '+44 9999 999999',\n DE: '+49 999 99999999',\n FR: '+33 9 99 99 99 99',\n IT: '+39 999 999 9999',\n ES: '+34 999 99 99 99',\n CN: '+86 999 9999 9999',\n JP: '+81 99 9999 9999',\n KR: '+82 99 9999 9999',\n BY: '+375 (99) 999-99-99',\n KZ: '+7 (999) 999-99-99',\n UA: '+380 (99) 999-99-99',\n}\n\n/**\n * Country flags\n */\nconst COUNTRY_FLAGS: Record<PhoneCountry, string> = {\n RU: '🇷🇺',\n US: '🇺🇸',\n UK: '🇬🇧',\n DE: '🇩🇪',\n FR: '🇫🇷',\n IT: '🇮🇹',\n ES: '🇪🇸',\n CN: '🇨🇳',\n JP: '🇯🇵',\n KR: '🇰🇷',\n BY: '🇧🇾',\n KZ: '🇰🇿',\n UA: '🇺🇦',\n}\n\n/**\n * State for phone field\n */\ninterface PhoneFieldState {\n /** Ref callback for applying mask */\n maskRef: (element: HTMLInputElement | null) => void\n}\n\n/**\n * Form.Field.Phone - Phone input with country mask\n *\n * Renders phone field with automatic mask based on country.\n *\n * @example Russian phone (by default)\n * ```tsx\n * <Form.Field.Phone name=\"phone\" label=\"Phone\" />\n * ```\n *\n * @example US phone with flag\n * ```tsx\n * <Form.Field.Phone name=\"phone\" country=\"US\" showFlag />\n * ```\n *\n * @example Return value without mask\n * ```tsx\n * <Form.Field.Phone name=\"phone\" autoUnmask />\n * ```\n */\nexport const FieldPhone = createField<PhoneFieldProps, string, PhoneFieldState>({\n displayName: 'FieldPhone',\n\n useFieldState: (props) => {\n const { country = 'RU', autoUnmask = false } = props\n const mask = PHONE_MASKS[country]\n\n // Create ref callback for applying mask\n const maskRef = useCallback(\n (element: HTMLInputElement | null) => {\n if (element && mask) {\n const maskCallback = withMask(mask, {\n showMaskOnFocus: true,\n clearIncomplete: true,\n autoUnmask,\n })\n maskCallback(element)\n }\n },\n [mask, autoUnmask]\n )\n\n return { maskRef }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const { country = 'RU', showFlag = false } = componentProps\n const flag = COUNTRY_FLAGS[country]\n const mask = PHONE_MASKS[country]\n\n const value = (field.state.value as string) ?? ''\n const resolvedPlaceholder = resolved.placeholder ?? mask?.toString().replace(/9/g, '_')\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <Group attached>\n {showFlag && (\n <Text px={3} display=\"flex\" alignItems=\"center\" bg=\"bg.muted\" borderWidth=\"1px\" borderRightWidth=\"0\">\n {flag}\n </Text>\n )}\n <Input\n ref={fieldState.maskRef}\n value={value}\n onChange={(e) => field.handleChange(e.target.value)}\n onBlur={field.handleBlur}\n placeholder={resolvedPlaceholder}\n data-field-name={fullPath}\n type=\"tel\"\n inputMode=\"tel\"\n autoComplete=\"tel\"\n />\n </Group>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { PinInput } from '@chakra-ui/react'\nimport type { ReactElement } from 'react'\nimport type { BaseFieldProps } from '../../types'\nimport { createField, FieldWrapper } from '../base'\n\n/**\n * Props for PinInput field\n */\nexport interface PinInputFieldProps extends BaseFieldProps {\n /** Number of input boxes (default: 4) */\n count?: number\n /** Mask as password */\n mask?: boolean\n /** Enable OTP autofill */\n otp?: boolean\n /** Type input: numeric, alphanumeric, alphabetic (by default: numeric) */\n type?: 'numeric' | 'alphanumeric' | 'alphabetic'\n /** Size: 2xs, xs, sm, md, lg, xl, 2xl (by default: md) */\n size?: '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n /** Variant: outline, subtle, flushed (default: outline) */\n variant?: 'outline' | 'subtle' | 'flushed'\n /** Attach inputs together (no gap) */\n attached?: boolean\n /** Callback when all fields are filled */\n onComplete?: (value: string) => void\n}\n\n/**\n * Form.Field.PinInput - PIN/OTP code input field\n *\n * Renders a series of single-character inputs for PIN codes, OTP etc.\n * Form value is stored as a string (e.g., \"1234\").\n *\n * @example Basic usage\n * ```tsx\n * <Form.Field.PinInput name=\"pin\" label=\"Enter PIN\" />\n * ```\n *\n * @example OTP with 6 digits\n * ```tsx\n * <Form.Field.PinInput\n * name=\"otp\"\n * label=\"Confirmation Code\"\n * count={6}\n * otp\n * onComplete={(code) => verifyCode(code)}\n * />\n * ```\n *\n * @example Masked as password\n * ```tsx\n * <Form.Field.PinInput name=\"secret\" mask count={6} />\n * ```\n */\nexport const FieldPinInput = createField<PinInputFieldProps, string>({\n displayName: 'FieldPinInput',\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, componentProps }): ReactElement => {\n const {\n count = 4,\n mask,\n otp,\n type = 'numeric',\n size = 'md',\n variant = 'outline',\n attached,\n onComplete,\n } = componentProps\n\n // Convert string to array for PinInput\n const stringValue = (field.state.value as string) ?? ''\n const arrayValue = stringValue.split('').slice(0, count)\n // Pad with empty strings up to count\n while (arrayValue.length < count) {\n arrayValue.push('')\n }\n\n const handleValueChange = (details: { value: string[] }) => {\n // Convert array back to string\n const newValue = details.value.join('')\n field.handleChange(newValue)\n }\n\n const handleValueComplete = (details: { value: string[] }) => {\n const completeValue = details.value.join('')\n onComplete?.(completeValue)\n }\n\n return (\n <FieldWrapper resolved={resolved} hasError={hasError} errorMessage={errorMessage} fullPath={fullPath}>\n <PinInput.Root\n value={arrayValue}\n onValueChange={handleValueChange}\n onValueComplete={handleValueComplete}\n placeholder={resolved.placeholder}\n mask={mask}\n otp={otp}\n type={type}\n size={size}\n variant={variant}\n attached={attached}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n invalid={hasError}\n count={count}\n onBlur={field.handleBlur}\n data-field-name={fullPath}\n >\n <PinInput.HiddenInput />\n <PinInput.Control>\n {Array.from({ length: count }).map((_, index) => (\n <PinInput.Input key={index} index={index} />\n ))}\n </PinInput.Control>\n </PinInput.Root>\n </FieldWrapper>\n )\n },\n})\n","'use client'\n\nimport { Box, Field, Input, List, Spinner, Text } from '@chakra-ui/react'\nimport { type ReactElement, useCallback, useEffect, useRef, useState } from 'react'\nimport { useDeclarativeFormOptional } from '../../form-context'\nimport type { CityFieldProps } from '../../types'\nimport { createField, FieldError, FieldLabel, useDebounce } from '../base'\nimport type { AddressProvider, AddressSuggestion } from './providers'\nimport { createDaDataProvider } from './providers'\n\n/**\n * Resolve address provider from props, context, token, or env fallback.\n */\nfunction useCityProvider(propProvider?: AddressProvider, token?: string): AddressProvider | null {\n const formContext = useDeclarativeFormOptional()\n\n // Priority: prop > createForm context > token > env\n if (propProvider) return propProvider\n if (formContext?.addressProvider) return formContext.addressProvider\n if (token) return createDaDataProvider({ token })\n\n // Backward compatible: try env variable\n const envKey = typeof window !== 'undefined' ? process.env.NEXT_PUBLIC_DADATA_API_KEY : ''\n if (envKey) return createDaDataProvider({ token: envKey })\n\n return null\n}\n\n/**\n * City field state\n */\ninterface CityFieldState {\n inputValue: string\n setInputValue: (value: string) => void\n suggestions: AddressSuggestion[]\n setSuggestions: (suggestions: AddressSuggestion[]) => void\n isLoading: boolean\n setIsLoading: (loading: boolean) => void\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n highlightedIndex: number\n setHighlightedIndex: (index: number) => void\n containerRef: React.RefObject<HTMLDivElement | null>\n debouncedQuery: string\n}\n\n/**\n * Form.Field.City — city selection with autocomplete suggestions.\n *\n * Supports pluggable address providers. DaData (Russia) is built-in;\n * pass any `AddressProvider` for other geocoding services.\n * Uses bounds to restrict suggestions to city/settlement level.\n *\n * @example With provider (recommended)\n * ```tsx\n * <Form.Field.City name=\"city\" label=\"City\" provider={dadata} />\n * ```\n *\n * @example With token (backward compatible)\n * ```tsx\n * <Form.Field.City name=\"city\" token=\"your-token\" />\n * ```\n *\n * @example Auto-detect from env (NEXT_PUBLIC_DADATA_API_KEY)\n * ```tsx\n * <Form.Field.City name=\"city\" label=\"City\" />\n * ```\n */\nexport const FieldCity = createField<CityFieldProps, string, CityFieldState>({\n displayName: 'FieldCity',\n\n useFieldState: (props) => {\n const { provider: propProvider, token, minChars = 2, debounceMs = 300 } = props\n const provider = useCityProvider(propProvider, token)\n\n const [inputValue, setInputValue] = useState('')\n const [suggestions, setSuggestions] = useState<AddressSuggestion[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [isOpen, setIsOpen] = useState(false)\n const [highlightedIndex, setHighlightedIndex] = useState(-1)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const debouncedQuery = useDebounce(inputValue, debounceMs)\n // Flag: just selected city, skip next fetch\n const justSelectedRef = useRef(false)\n // Flag: inputValue already initialized from field value\n const initializedRef = useRef(false)\n\n // Fetch city suggestions from provider\n const fetchSuggestions = useCallback(\n async (query: string) => {\n if (query.length < minChars || !provider) {\n setSuggestions([])\n return\n }\n\n setIsLoading(true)\n try {\n const results = await provider.getSuggestions(query, {\n count: 7,\n bounds: { from: 'city', to: 'settlement' },\n })\n setSuggestions(results)\n setIsOpen(results.length > 0)\n } catch (error) {\n console.error('Error loading city suggestions:', error)\n setSuggestions([])\n } finally {\n setIsLoading(false)\n }\n },\n [provider, minChars]\n )\n\n // Load on debounced query change\n useEffect(() => {\n if (justSelectedRef.current) {\n justSelectedRef.current = false\n return\n }\n\n if (debouncedQuery) {\n fetchSuggestions(debouncedQuery)\n } else {\n setSuggestions([])\n setIsOpen(false)\n }\n }, [debouncedQuery, fetchSuggestions])\n\n // Close on click outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [])\n\n return {\n inputValue,\n setInputValue,\n suggestions,\n setSuggestions,\n isLoading,\n setIsLoading,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n containerRef,\n debouncedQuery,\n justSelectedRef,\n initializedRef,\n } as CityFieldState & { justSelectedRef: React.RefObject<boolean>; initializedRef: React.RefObject<boolean> }\n },\n\n render: ({ field, fullPath, resolved, hasError, errorMessage, fieldState }): ReactElement => {\n const {\n inputValue,\n setInputValue,\n suggestions,\n setSuggestions,\n isLoading,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n containerRef,\n } = fieldState\n const { justSelectedRef, initializedRef } = fieldState as CityFieldState & {\n justSelectedRef: React.RefObject<boolean>\n initializedRef: React.RefObject<boolean>\n }\n\n const fieldValue = field.state.value as string | undefined\n\n // Initialize input value from field (once, without useEffect)\n if (!initializedRef.current && fieldValue && fieldValue !== inputValue) {\n initializedRef.current = true\n setInputValue(fieldValue)\n }\n\n // Handler for city selection\n const handleSelect = (suggestion: AddressSuggestion) => {\n // Extract city name from provider data, fallback to suggestion value\n const cityName = (suggestion.data?.city as string) || (suggestion.data?.settlement as string) || suggestion.value\n justSelectedRef.current = true\n setInputValue(cityName)\n setIsOpen(false)\n setSuggestions([])\n field.handleChange(cityName)\n }\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (!isOpen || suggestions.length === 0) {\n return\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n setHighlightedIndex(highlightedIndex < suggestions.length - 1 ? highlightedIndex + 1 : 0)\n break\n case 'ArrowUp':\n e.preventDefault()\n setHighlightedIndex(highlightedIndex > 0 ? highlightedIndex - 1 : suggestions.length - 1)\n break\n case 'Enter':\n e.preventDefault()\n if (highlightedIndex >= 0) {\n handleSelect(suggestions[highlightedIndex])\n }\n break\n case 'Escape':\n setIsOpen(false)\n break\n }\n }\n\n return (\n <Field.Root\n invalid={hasError}\n required={resolved.required}\n disabled={resolved.disabled}\n readOnly={resolved.readOnly}\n >\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n <Box ref={containerRef} position=\"relative\" width=\"100%\">\n <Input\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n setHighlightedIndex(-1)\n // If user erases text, update form value\n if (!e.target.value) {\n field.handleChange('')\n }\n }}\n onFocus={() => {\n if (suggestions.length > 0) {\n setIsOpen(true)\n }\n }}\n onBlur={() => {\n // If user typed without selecting from suggestions — save as is\n if (inputValue && inputValue !== (field.state.value as string)) {\n field.handleChange(inputValue)\n }\n field.handleBlur()\n }}\n onKeyDown={handleKeyDown}\n placeholder={resolved.placeholder ?? 'Enter city'}\n data-field-name={fullPath}\n />\n {isLoading && (\n <Box position=\"absolute\" right={3} top=\"50%\" transform=\"translateY(-50%)\">\n <Spinner size=\"sm\" />\n </Box>\n )}\n {isOpen && suggestions.length > 0 && (\n <List.Root\n position=\"absolute\"\n zIndex={10}\n width=\"100%\"\n bg=\"bg.panel\"\n borderWidth=\"1px\"\n borderRadius=\"md\"\n shadow=\"md\"\n maxH=\"250px\"\n overflowY=\"auto\"\n mt={1}\n listStyle=\"none\"\n >\n {suggestions.map((suggestion, index) => (\n <List.Item\n key={`${suggestion.value}-${index}`}\n px={3}\n py={2}\n cursor=\"pointer\"\n bg={highlightedIndex === index ? 'bg.muted' : undefined}\n _hover={{ bg: 'bg.muted' }}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n <Text fontSize=\"sm\">{suggestion.label}</Text>\n </List.Item>\n ))}\n </List.Root>\n )}\n </Box>\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport { Box, Button, Field, HStack, Input, SegmentGroup } from '@chakra-ui/react'\nimport { type ReactElement, type RefObject, useCallback, useEffect, useRef, useState } from 'react'\nimport { LuEraser, LuPen, LuType } from 'react-icons/lu'\nimport type { FieldTooltipMeta } from '../../types'\nimport { createField, FieldError, FieldLabel } from '../base'\n\n/**\n * Props для поля цифровой подписи\n */\nexport interface SignatureFieldProps {\n /** Имя поля */\n name?: string\n /** Лейбл */\n label?: string\n /** Подсказка */\n helperText?: string\n /** Обязательное */\n required?: boolean\n /** Отключено */\n disabled?: boolean\n /** Tooltip */\n tooltip?: FieldTooltipMeta\n\n /** Ширина canvas (по умолчанию: 400) */\n width?: number\n /** Высота canvas (по умолчанию: 150) */\n height?: number\n /** Цвет линии (по умолчанию: черный) */\n strokeColor?: string\n /** Толщина линии (по умолчанию: 2) */\n strokeWidth?: number\n /** Фон canvas (по умолчанию: белый) */\n backgroundColor?: string\n /** Текст кнопки очистки (по умолчанию: 'Clear') */\n clearLabel?: string\n /** Placeholder поверх пустого canvas */\n placeholder?: string\n /** Разрешить typed mode (по умолчанию: true) */\n allowTyped?: boolean\n /** Шрифт для typed mode (по умолчанию: cursive) */\n typedFont?: string\n}\n\ninterface SignatureState {\n canvasRef: RefObject<HTMLCanvasElement | null>\n mode: 'draw' | 'typed'\n setMode: (mode: 'draw' | 'typed') => void\n typedText: string\n setTypedText: (text: string) => void\n isEmpty: boolean\n startDrawing: (e: React.MouseEvent | React.TouchEvent) => void\n draw: (e: React.MouseEvent | React.TouchEvent) => void\n stopDrawing: () => string\n clearCanvas: () => void\n renderTypedSignature: (text: string) => string\n}\n\n/**\n * Получить координаты из mouse или touch event\n */\nfunction getCoords(e: React.MouseEvent | React.TouchEvent, canvas: HTMLCanvasElement): { x: number; y: number } {\n const rect = canvas.getBoundingClientRect()\n if ('touches' in e) {\n const touch = e.touches[0]\n return { x: touch.clientX - rect.left, y: touch.clientY - rect.top }\n }\n return { x: (e as React.MouseEvent).clientX - rect.left, y: (e as React.MouseEvent).clientY - rect.top }\n}\n\n/**\n * Form.Field.Signature — поле цифровой подписи.\n *\n * Canvas-рисование мышью и пальцем + typed mode (ввод текста курсивом).\n * Значение: data URI строка (image/png base64).\n *\n * @example Draw mode\n * ```tsx\n * <Form.Field.Signature name=\"signature\" label=\"Your Signature\" />\n * ```\n *\n * @example С настройками\n * ```tsx\n * <Form.Field.Signature\n * name=\"signature\"\n * width={500}\n * height={200}\n * strokeColor=\"#1a365d\"\n * strokeWidth={3}\n * clearLabel=\"Очистить\"\n * placeholder=\"Подпишите здесь\"\n * />\n * ```\n */\nexport const FieldSignature = createField<SignatureFieldProps, string, SignatureState>({\n displayName: 'FieldSignature',\n\n useFieldState: (props) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null)\n const isDrawingRef = useRef(false)\n const [mode, setMode] = useState<'draw' | 'typed'>('draw')\n const [typedText, setTypedText] = useState('')\n const [isEmpty, setIsEmpty] = useState(true)\n\n const strokeColor = props.strokeColor ?? 'black'\n const strokeWidth = props.strokeWidth ?? 2\n const backgroundColor = props.backgroundColor ?? 'white'\n const typedFont = props.typedFont ?? \"'Segoe Script', 'Dancing Script', cursive\"\n\n // Инициализация canvas фоном\n const initCanvas = useCallback(() => {\n const canvas = canvasRef.current\n if (!canvas) return\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.fillStyle = backgroundColor\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n }, [backgroundColor])\n\n // Инициализация при монтировании\n useEffect(() => {\n initCanvas()\n }, [initCanvas])\n\n // Начать рисование\n const startDrawing = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n const canvas = canvasRef.current\n if (!canvas) return\n\n // Предотвращаем scroll на touch\n if ('touches' in e) e.preventDefault()\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n isDrawingRef.current = true\n const { x, y } = getCoords(e, canvas)\n\n ctx.strokeStyle = strokeColor\n ctx.lineWidth = strokeWidth\n ctx.lineCap = 'round'\n ctx.lineJoin = 'round'\n ctx.beginPath()\n ctx.moveTo(x, y)\n },\n [strokeColor, strokeWidth],\n )\n\n // Рисовать\n const draw = useCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isDrawingRef.current) return\n const canvas = canvasRef.current\n if (!canvas) return\n\n if ('touches' in e) e.preventDefault()\n\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n\n const { x, y } = getCoords(e, canvas)\n ctx.lineTo(x, y)\n ctx.stroke()\n }, [])\n\n // Остановить рисование, вернуть data URI\n const stopDrawing = useCallback((): string => {\n isDrawingRef.current = false\n const canvas = canvasRef.current\n if (!canvas) return ''\n\n setIsEmpty(false)\n return canvas.toDataURL('image/png')\n }, [])\n\n // Очистить canvas\n const clearCanvas = useCallback(() => {\n initCanvas()\n setIsEmpty(true)\n setTypedText('')\n }, [initCanvas])\n\n // Отрисовать typed подпись на canvas\n const renderTypedSignature = useCallback(\n (text: string): string => {\n const canvas = canvasRef.current\n if (!canvas) return ''\n const ctx = canvas.getContext('2d')\n if (!ctx) return ''\n\n // Очистить и нарисовать текст курсивом\n ctx.fillStyle = backgroundColor\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n\n if (!text.trim()) {\n setIsEmpty(true)\n return ''\n }\n\n // Адаптивный размер шрифта\n const fontSize = Math.min(canvas.height * 0.4, 48)\n ctx.font = `${fontSize}px ${typedFont}`\n ctx.fillStyle = strokeColor\n ctx.textAlign = 'center'\n ctx.textBaseline = 'middle'\n ctx.fillText(text, canvas.width / 2, canvas.height / 2)\n\n setIsEmpty(false)\n return canvas.toDataURL('image/png')\n },\n [backgroundColor, strokeColor, typedFont],\n )\n\n return {\n canvasRef,\n mode,\n setMode,\n typedText,\n setTypedText,\n isEmpty,\n startDrawing,\n draw,\n stopDrawing,\n clearCanvas,\n renderTypedSignature,\n }\n },\n\n render: ({ field, resolved, hasError, errorMessage, componentProps, fieldState }): ReactElement => {\n const {\n width = 400,\n height = 150,\n clearLabel = 'Clear',\n placeholder = 'Sign here',\n allowTyped = true,\n disabled: _disabled,\n } = componentProps\n\n const {\n canvasRef,\n mode,\n setMode,\n typedText,\n setTypedText,\n isEmpty,\n startDrawing,\n draw,\n stopDrawing,\n clearCanvas,\n renderTypedSignature,\n } = fieldState\n\n const isDisabled = resolved.disabled\n\n return (\n <Field.Root invalid={hasError} required={resolved.required} disabled={isDisabled}>\n <FieldLabel label={resolved.label} tooltip={resolved.tooltip} required={resolved.required} />\n\n <Box\n position=\"relative\"\n borderWidth=\"1px\"\n borderColor={hasError ? 'border.error' : 'border'}\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxW={`${width}px`}\n opacity={isDisabled ? 0.5 : 1}\n pointerEvents={isDisabled ? 'none' : 'auto'}\n >\n {/* Переключатель режимов */}\n {allowTyped && (\n <HStack p={2} borderBottomWidth=\"1px\" borderColor=\"border\" gap={2}>\n <SegmentGroup.Root\n size=\"xs\"\n value={mode}\n onValueChange={(details) => {\n const newMode = details.value as 'draw' | 'typed'\n setMode(newMode)\n // При переключении на draw — очистить canvas\n if (newMode === 'draw') {\n clearCanvas()\n field.handleChange('')\n }\n }}\n >\n <SegmentGroup.Item value=\"draw\">\n <SegmentGroup.ItemText>\n <LuPen /> Draw\n </SegmentGroup.ItemText>\n <SegmentGroup.ItemHiddenInput />\n </SegmentGroup.Item>\n <SegmentGroup.Item value=\"typed\">\n <SegmentGroup.ItemText>\n <LuType /> Type\n </SegmentGroup.ItemText>\n <SegmentGroup.ItemHiddenInput />\n </SegmentGroup.Item>\n </SegmentGroup.Root>\n </HStack>\n )}\n\n {/* Typed mode — текстовый ввод */}\n {mode === 'typed' && (\n <Box p={2} borderBottomWidth=\"1px\" borderColor=\"border\">\n <Input\n placeholder=\"Type your name...\"\n value={typedText}\n onChange={(e) => {\n const text = e.target.value\n setTypedText(text)\n const dataUrl = renderTypedSignature(text)\n field.handleChange(dataUrl || '')\n }}\n fontFamily=\"cursive\"\n fontSize=\"lg\"\n />\n </Box>\n )}\n\n {/* Canvas */}\n <Box position=\"relative\">\n <canvas\n ref={canvasRef}\n width={width}\n height={height}\n style={{\n display: 'block',\n maxWidth: '100%',\n cursor: mode === 'draw' ? 'crosshair' : 'default',\n touchAction: 'none', // Отключить scroll при рисовании\n }}\n role=\"img\"\n aria-label=\"Signature pad\"\n tabIndex={0}\n onMouseDown={mode === 'draw' ? startDrawing : undefined}\n onMouseMove={mode === 'draw' ? draw : undefined}\n onMouseUp={mode === 'draw'\n ? () => {\n const dataUrl = stopDrawing()\n if (dataUrl) field.handleChange(dataUrl)\n }\n : undefined}\n onMouseLeave={mode === 'draw'\n ? () => {\n const dataUrl = stopDrawing()\n if (dataUrl) field.handleChange(dataUrl)\n }\n : undefined}\n onTouchStart={mode === 'draw' ? startDrawing : undefined}\n onTouchMove={mode === 'draw' ? draw : undefined}\n onTouchEnd={mode === 'draw'\n ? () => {\n const dataUrl = stopDrawing()\n if (dataUrl) field.handleChange(dataUrl)\n }\n : undefined}\n />\n\n {/* Placeholder */}\n {isEmpty && mode === 'draw' && (\n <Box\n position=\"absolute\"\n inset={0}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n pointerEvents=\"none\"\n color=\"fg.subtle\"\n fontSize=\"sm\"\n >\n {placeholder}\n </Box>\n )}\n </Box>\n\n {/* Кнопка очистки */}\n {!isEmpty && (\n <HStack p={2} borderTopWidth=\"1px\" borderColor=\"border\" justifyContent=\"flex-end\">\n <Button\n size=\"xs\"\n variant=\"ghost\"\n colorPalette=\"red\"\n onClick={() => {\n clearCanvas()\n field.handleChange('')\n }}\n >\n <LuEraser />\n {clearLabel}\n </Button>\n </HStack>\n )}\n </Box>\n\n <FieldError hasError={hasError} errorMessage={errorMessage} helperText={resolved.helperText} />\n </Field.Root>\n )\n },\n})\n","'use client'\n\nimport type { CardBrand } from './utils/detect-brand'\n\ninterface CardBrandIconProps {\n brand: CardBrand\n size?: number\n}\n\n/**\n * SVG иконки брендов карт (Simple Icons, CC0 лицензия).\n * Inline SVG для мгновенного отображения без сетевых запросов.\n * Transition анимация 200ms при смене бренда обеспечивается родительским компонентом.\n */\nconst BRAND_ICONS: Partial<Record<CardBrand, (s: number) => React.ReactElement>> = {\n visa: (s) => (\n <svg width={s} height={s * 0.64} viewBox=\"0 0 24 24\" fill=\"#1A1F71\" aria-label=\"Visa\">\n <path d=\"M9.112 8.262L5.97 15.758H3.92L2.374 9.775c-.094-.368-.175-.503-.461-.658C1.447 8.864.677 8.627 0 8.479l.046-.217h3.3a.904.904 0 01.894.764l.817 4.338 2.018-5.102zm8.033 5.049c.008-1.979-2.736-2.088-2.717-2.972.006-.269.262-.555.822-.628a3.66 3.66 0 011.913.336l.34-1.59a5.207 5.207 0 00-1.814-.333c-1.917 0-3.266 1.02-3.278 2.479-.012 1.079.963 1.68 1.698 2.04.756.367 1.01.603 1.006.931-.005.504-.602.725-1.16.734-.975.015-1.54-.263-1.992-.473l-.351 1.642c.453.208 1.289.39 2.156.398 2.037 0 3.37-1.006 3.377-2.564m5.061 2.447H24l-1.565-7.496h-1.656a.883.883 0 00-.826.55l-2.909 6.946h2.036l.405-1.12h2.488zm-2.163-2.656l1.02-2.815.588 2.815zm-8.16-4.84l-1.603 7.496H8.34l1.605-7.496z\" />\n </svg>\n ),\n mastercard: (s) => (\n <svg width={s} height={s * 0.64} viewBox=\"0 0 24 24\" fill=\"none\" aria-label=\"Mastercard\">\n <circle cx=\"7.416\" cy=\"12\" r=\"7.416\" fill=\"#EB001B\" />\n <circle cx=\"16.584\" cy=\"12\" r=\"7.416\" fill=\"#F79E1B\" />\n <path\n d=\"M12 6.174a7.4 7.4 0 00-.28.231C10.156 7.764 9.169 9.765 9.169 12c0 2.236.987 4.236 2.551 5.595.09.08.185.158.28.232.096-.074.189-.152.28-.232C13.844 16.236 14.831 14.236 14.831 12c0-2.235-.987-4.236-2.551-5.595a7.4 7.4 0 00-.28-.231z\"\n fill=\"#FF5F00\"\n />\n </svg>\n ),\n amex: (s) => (\n <svg width={s} height={s * 0.64} viewBox=\"0 0 24 24\" fill=\"#2E77BC\" aria-label=\"American Express\">\n <path d=\"M16.015 14.378c0-.32-.135-.496-.344-.622-.21-.12-.464-.135-.81-.135h-1.543v2.82h.675v-1.027h.72c.24 0 .39.024.478.125.12.13.104.38.104.55v.35h.66v-.555c-.002-.25-.017-.376-.108-.516-.06-.08-.18-.18-.33-.234.18-.072.48-.297.48-.747zm-.87.407c-.09.053-.195.058-.33.058h-.81v-.63h.824c.12 0 .24 0 .33.05.098.048.156.147.15.255 0 .12-.045.215-.134.27zM20.297 15.837H19v.6h1.304c.676 0 1.05-.278 1.05-.884 0-.28-.066-.448-.187-.582-.153-.133-.392-.193-.73-.207l-.376-.015c-.104 0-.18 0-.255-.03-.09-.03-.15-.105-.15-.21 0-.09.017-.166.09-.21.083-.046.177-.066.272-.06h1.23v-.602h-1.35c-.704 0-.958.437-.958.84 0 .9.776.855 1.407.87.104 0 .18.015.225.06.046.03.082.106.082.18 0 .077-.035.15-.08.18-.06.053-.15.07-.277.07zM0 0v10.096L.81 8.22h1.75l.225.464V8.22h2.043l.45 1.02.437-1.013h6.502c.295 0 .56.057.756.236v-.23h1.787v.23c.307-.17.686-.23 1.12-.23h2.606l.24.466v-.466h1.918l.254.465v-.466h1.858v3.948H20.87l-.36-.6v.585h-2.353l-.256-.63h-.583l-.27.614h-1.213c-.48 0-.84-.104-1.08-.24v.24h-2.89v-.884c0-.12-.03-.12-.105-.135h-.105v1.036H6.067v-.48l-.21.48H4.69l-.202-.48v.465H2.235l-.256-.624H1.4l-.256.624H0V24h23.786v-7.108c-.27.135-.613.18-.973.18H21.09v-.255c-.21.165-.57.255-.914.255H14.71v-.9c0-.12-.018-.12-.12-.12h-.075v1.022h-1.8v-1.066c-.298.136-.643.15-.928.136h-.214v.915h-2.18l-.54-.617-.57.6H4.742v-3.93h3.61l.518.602.554-.6h2.412c.28 0 .74.03.942.225v-.24h2.177c.202 0 .644.045.903.225v-.24h3.265v.24c.163-.164.508-.24.803-.24h1.89v.24c.194-.15.464-.24.84-.24h1.176V0H0z\" />\n </svg>\n ),\n mir: (s) => (\n <svg width={s} height={s * 0.3} viewBox=\"0 0 400 120\" fill=\"none\" aria-label=\"МИР\">\n <linearGradient id=\"mir-g\" x1=\"370\" x2=\"290\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#1F5CD7\" />\n <stop stopColor=\"#02AEFF\" offset=\"1\" />\n </linearGradient>\n <path\n d=\"m31 13h33c3 0 12-1 16 13 3 9 7 23 13 44h2c6-22 11-37 13-44 4-14 14-13 18-13h31v96h-32v-57h-2l-17 57h-24l-17-57h-3v57h-31m139-96h32v57h3l21-47c4-9 13-10 13-10h30v96h-32v-57h-2l-21 47c-4 9-14 10-14 10h-30m142-29v29h-30v-50h98c-4 12-18 21-34 21\"\n fill=\"#0F754E\"\n />\n <path d=\"m382 53c4-18-8-40-34-40h-68c2 21 20 40 39 40\" fill=\"url(#mir-g)\" />\n </svg>\n ),\n}\n\n/** Заглушка для неизвестного бренда — generic card icon */\nfunction GenericCardIcon({ size }: { size: number }) {\n return (\n <svg width={size} height={size * 0.64} viewBox=\"0 0 24 24\" fill=\"#a0aec0\" aria-label=\"Карта\">\n <path d=\"M22 4H2c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h20c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H2V10h20v8zm0-12H2V6h20v2z\" />\n </svg>\n )\n}\n\n/**\n * Иконка бренда карты.\n * Рендерит inline SVG (CC0 лицензия, Simple Icons + Wikimedia).\n * Transition анимация при смене бренда через CSS opacity.\n */\nexport function CardBrandIcon({ brand, size = 32 }: CardBrandIconProps) {\n const renderIcon = BRAND_ICONS[brand]\n\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'opacity 200ms ease',\n width: size,\n minWidth: size,\n }}\n >\n {renderIcon ? renderIcon(size) : <GenericCardIcon size={size} />}\n </span>\n )\n}\n","/** Поддерживаемые бренды карт */\nexport type CardBrand = 'visa' | 'mastercard' | 'amex' | 'mir' | 'unionpay' | 'maestro' | 'jcb' | 'discover' | 'unknown'\n\n/** Информация о бренде карты */\nexport interface CardBrandInfo {\n brand: CardBrand\n /** Отображаемое название */\n name: string\n /** Длина номера */\n lengths: number[]\n /** Длина CVC */\n cvcLength: number\n /** Паттерн форматирования (массив размеров групп) */\n gaps: number[]\n}\n\n/** Информация о каждом бренде */\nconst BRANDS: Record<Exclude<CardBrand, 'unknown'>, CardBrandInfo> = {\n visa: {\n brand: 'visa',\n name: 'Visa',\n lengths: [16, 18, 19],\n cvcLength: 3,\n gaps: [4, 4, 4, 4],\n },\n mastercard: {\n brand: 'mastercard',\n name: 'Mastercard',\n lengths: [16],\n cvcLength: 3,\n gaps: [4, 4, 4, 4],\n },\n amex: {\n brand: 'amex',\n name: 'American Express',\n lengths: [15],\n cvcLength: 4,\n gaps: [4, 6, 5],\n },\n mir: {\n brand: 'mir',\n name: 'МИР',\n lengths: [16, 17, 18, 19],\n cvcLength: 3,\n gaps: [4, 4, 4, 4],\n },\n unionpay: {\n brand: 'unionpay',\n name: 'UnionPay',\n lengths: [16, 17, 18, 19],\n cvcLength: 3,\n gaps: [4, 4, 4, 4],\n },\n maestro: {\n brand: 'maestro',\n name: 'Maestro',\n lengths: [12, 13, 14, 15, 16, 17, 18, 19],\n cvcLength: 3,\n gaps: [4, 4, 4, 4],\n },\n jcb: {\n brand: 'jcb',\n name: 'JCB',\n lengths: [16, 17, 18, 19],\n cvcLength: 3,\n gaps: [4, 4, 4, 4],\n },\n discover: {\n brand: 'discover',\n name: 'Discover',\n lengths: [16, 19],\n cvcLength: 3,\n gaps: [4, 4, 4, 4],\n },\n}\n\nconst UNKNOWN_BRAND: CardBrandInfo = {\n brand: 'unknown',\n name: 'Unknown',\n lengths: [16],\n cvcLength: 3,\n gaps: [4, 4, 4, 4],\n}\n\n/**\n * Определяет бренд карты по первым цифрам номера (BIN/IIN).\n *\n * @param number - Номер карты (частичный или полный)\n * @returns Информация о бренде\n */\nexport function detectBrand(number: string): CardBrandInfo {\n const digits = number.replace(/\\D/g, '')\n if (!digits) return UNKNOWN_BRAND\n\n const n2 = Number(digits.slice(0, 2))\n const n4 = Number(digits.slice(0, 4))\n const n6 = Number(digits.slice(0, 6))\n\n // МИР: 2200-2204\n if (n4 >= 2200 && n4 <= 2204) return BRANDS.mir\n\n // Amex: 34, 37\n if (n2 === 34 || n2 === 37) return BRANDS.amex\n\n // Visa: начинается с 4\n if (digits[0] === '4') return BRANDS.visa\n\n // Mastercard: 51-55, 2221-2720\n if ((n2 >= 51 && n2 <= 55) || (n4 >= 2221 && n4 <= 2720)) return BRANDS.mastercard\n\n // Discover: 6011, 622126-622925, 644-649, 65\n if (n4 === 6011 || (n6 >= 622126 && n6 <= 622925) || (n2 >= 64 && n2 <= 65)) return BRANDS.discover\n\n // JCB: 3528-3589\n if (n4 >= 3528 && n4 <= 3589) return BRANDS.jcb\n\n // UnionPay: 62 (не пересекается с Discover выше)\n if (n2 === 62) return BRANDS.unionpay\n\n // Maestro: 50, 56-69\n if (n2 === 50 || (n2 >= 56 && n2 <= 69)) return BRANDS.maestro\n\n return UNKNOWN_BRAND\n}\n\n/** Получить информацию о бренде по имени */\nexport function getBrandInfo(brand: CardBrand): CardBrandInfo {\n if (brand === 'unknown') return UNKNOWN_BRAND\n return BRANDS[brand] ?? UNKNOWN_BRAND\n}\n","/**\n * Форматирует ввод срока действия карты в формат MM/YY.\n * Автоматически вставляет слэш после двух цифр месяца.\n *\n * @param raw - Сырой ввод пользователя\n * @returns Отформатированная строка MM/YY\n */\nexport function formatExpiry(raw: string): string {\n const digits = raw.replace(/\\D/g, '')\n if (!digits) return ''\n\n if (digits.length <= 2) {\n return digits\n }\n\n return `${digits.slice(0, 2)}/${digits.slice(2, 4)}`\n}\n\n/**\n * Валидирует срок действия карты.\n * Проверяет формат MM/YY и что карта не просрочена.\n *\n * @param expiry - Строка в формате MM/YY\n * @returns true если срок валиден и карта не просрочена\n */\nexport function isExpiryValid(expiry: string): boolean {\n const match = expiry.match(/^(\\d{2})\\/(\\d{2})$/)\n if (!match) return false\n\n const month = Number(match[1])\n const year = Number(match[2])\n\n if (month < 1 || month > 12) return false\n\n // Проверяем что карта не просрочена\n const now = new Date()\n const currentYear = now.getFullYear() % 100 // Двузначный год\n const currentMonth = now.getMonth() + 1\n\n if (year < currentYear) return false\n if (year === currentYear && month < currentMonth) return false\n\n return true\n}\n","import { detectBrand } from './detect-brand'\n\n/**\n * Форматирует номер карты с пробелами по группам бренда.\n * Visa/MC: 4444 4444 4444 4444\n * Amex: 4444 444444 44444\n *\n * @param raw - Сырые цифры номера\n * @returns Отформатированная строка\n */\nexport function formatCardNumber(raw: string): string {\n const digits = raw.replace(/\\D/g, '')\n if (!digits) return ''\n\n const brand = detectBrand(digits)\n const { gaps } = brand\n\n const parts: string[] = []\n let pos = 0\n\n for (const gap of gaps) {\n if (pos >= digits.length) break\n parts.push(digits.slice(pos, pos + gap))\n pos += gap\n }\n\n // Оставшиеся цифры (если длина > суммы gaps)\n if (pos < digits.length) {\n parts.push(digits.slice(pos))\n }\n\n return parts.join(' ')\n}\n\n/**\n * Удаляет форматирование, оставляя только цифры.\n */\nexport function stripCardNumber(formatted: string): string {\n return formatted.replace(/\\D/g, '')\n}\n\n/**\n * Максимальная длина отформатированного номера (с пробелами).\n */\nexport function maxFormattedLength(raw: string): number {\n const brand = detectBrand(raw)\n const maxDigits = Math.max(...brand.lengths)\n const spaces = brand.gaps.length - 1\n return maxDigits + spaces\n}\n","/**\n * Алгоритм Луна (Luhn) для валидации номера банковской карты.\n * Ловит ~90% опечаток.\n *\n * @param cardNumber - Номер карты (с или без пробелов/дефисов)\n * @returns true если номер проходит проверку Луна\n */\nexport function luhn(cardNumber: string): boolean {\n const digits = cardNumber.replace(/\\D/g, '')\n if (digits.length < 12 || digits.length > 19) return false\n\n let sum = 0\n let isDouble = false\n\n for (let i = digits.length - 1; i >= 0; i--) {\n let digit = Number(digits[i])\n if (isDouble) {\n digit *= 2\n if (digit > 9) digit -= 9\n }\n sum += digit\n isDouble = !isDouble\n }\n\n return sum % 10 === 0\n}\n","'use client'\n\nimport { Box, Field, Flex, Group, Input, Text, Tooltip } from '@chakra-ui/react'\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport { useDeclarativeFormOptional } from '../../../form-context'\nimport { CardBrandIcon } from './card-brand-icon'\nimport type { CardBrand } from './utils/detect-brand'\nimport { detectBrand } from './utils/detect-brand'\nimport { formatExpiry, isExpiryValid } from './utils/format-expiry'\nimport { formatCardNumber, maxFormattedLength, stripCardNumber } from './utils/format-number'\nimport { luhn } from './utils/luhn'\n\n/** Раскладка компонента */\nexport type CreditCardLayout = 'inline' | 'stacked'\n\n/** Пропсы компонента Form.Field.CreditCard */\nexport interface CreditCardFieldProps {\n /** Имя поля (группы) в форме */\n name?: string\n /** Метка поля */\n label?: string\n /** Ограничить допустимые бренды */\n brands?: CardBrand[]\n /** Показывать иконку бренда (по умолчанию: true) */\n showBrandIcon?: boolean\n /** Раскладка: inline (в ряд) или stacked (стопкой) */\n layout?: CreditCardLayout\n /** Отключить поле */\n disabled?: boolean\n /** Только чтение */\n readOnly?: boolean\n /** Placeholder для номера */\n numberPlaceholder?: string\n /** Placeholder для срока */\n expiryPlaceholder?: string\n /** Placeholder для CVC */\n cvcPlaceholder?: string\n}\n\n/** Статус валидации поля */\ntype FieldStatus = 'idle' | 'valid' | 'error'\n\n/**\n * Compound компонент для ввода данных банковской карты.\n *\n * UX паттерны (Baymard Institute + Stripe):\n * - Иконка бренда внутри поля номера слева с transition 200ms\n * - Авто-форматирование с пробелами при вводе (4-4-4-4 / 4-6-5)\n * - Smart expiry: ввод «4» → «04/», авто-слэш\n * - Валидация Luhn на blur, не ждать submit\n * - CVC tooltip с подсказкой где найти код\n * - inputMode=\"numeric\" для мобильного keypad\n * - 16px font minimum (предотвращает iOS zoom)\n * - Responsive: inline на desktop, stacked на mobile\n *\n * ⚠️ PCI DSS: Для реальных платежей используйте Stripe Elements.\n *\n * @example\n * ```tsx\n * <Form.Field.CreditCard name=\"card\" label=\"Данные карты\" />\n * ```\n */\nexport function CreditCardField({\n name = 'card',\n label = 'Данные карты',\n brands,\n showBrandIcon = true,\n layout = 'inline',\n disabled,\n readOnly,\n numberPlaceholder = '0000 0000 0000 0000',\n expiryPlaceholder = 'MM / YY',\n cvcPlaceholder = 'CVC',\n}: CreditCardFieldProps) {\n const formCtx = useDeclarativeFormOptional()\n\n // Refs для автоматического перехода между полями\n const expiryRef = useRef<HTMLInputElement>(null)\n const cvcRef = useRef<HTMLInputElement>(null)\n\n // Локальное состояние полей\n const [numberDisplay, setNumberDisplay] = useState('')\n const [expiryDisplay, setExpiryDisplay] = useState('')\n const [cvcValue, setCvcValue] = useState('')\n\n // Статусы валидации (для отображения ✓ / ошибки)\n const [numberStatus, setNumberStatus] = useState<FieldStatus>('idle')\n const [expiryStatus, setExpiryStatus] = useState<FieldStatus>('idle')\n const [cvcStatus, setCvcStatus] = useState<FieldStatus>('idle')\n const [numberError, setNumberError] = useState<string>()\n const [expiryError, setExpiryError] = useState<string>()\n\n // Определяем бренд по номеру\n const brandInfo = useMemo(() => detectBrand(numberDisplay), [numberDisplay])\n\n // Проверяем допустимость бренда\n const isBrandAllowed = useMemo(() => {\n if (!brands || brands.length === 0) return true\n return brands.includes(brandInfo.brand)\n }, [brands, brandInfo.brand])\n\n // --- Обработчик номера карты ---\n const handleNumberChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = stripCardNumber(e.target.value)\n const formatted = formatCardNumber(raw)\n setNumberDisplay(formatted)\n setNumberStatus('idle')\n setNumberError(undefined)\n\n if (formCtx?.form) {\n formCtx.form.setFieldValue(`${name}.number`, raw)\n }\n\n // Автопереход к expiry когда номер полный\n const maxLen = Math.max(...brandInfo.lengths)\n if (raw.length >= maxLen) {\n expiryRef.current?.focus()\n }\n },\n [formCtx, name, brandInfo.lengths],\n )\n\n // Валидация номера на blur (Baymard: 53% сайтов ошибаются тут)\n const handleNumberBlur = useCallback(() => {\n const raw = stripCardNumber(numberDisplay)\n if (!raw) return\n\n if (raw.length < 12) {\n setNumberStatus('error')\n setNumberError('Номер слишком короткий')\n } else if (!luhn(raw)) {\n setNumberStatus('error')\n setNumberError('Некорректный номер карты')\n } else if (!isBrandAllowed) {\n setNumberStatus('error')\n setNumberError('Этот тип карты не поддерживается')\n } else {\n setNumberStatus('valid')\n setNumberError(undefined)\n }\n }, [numberDisplay, isBrandAllowed])\n\n // --- Smart Expiry ---\n const handleExpiryChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n let raw = e.target.value.replace(/\\D/g, '')\n\n // Smart month: ввод 2-9 → автоматически 02-09\n if (raw.length === 1 && Number(raw) > 1) {\n raw = `0${raw}`\n }\n\n const formatted = formatExpiry(raw)\n setExpiryDisplay(formatted)\n setExpiryStatus('idle')\n setExpiryError(undefined)\n\n if (formCtx?.form) {\n formCtx.form.setFieldValue(`${name}.expiry`, formatted)\n }\n\n // Автопереход к CVC когда expiry полный (MM/YY = 5 символов)\n if (formatted.length === 5) {\n cvcRef.current?.focus()\n }\n },\n [formCtx, name],\n )\n\n // Валидация expiry на blur\n const handleExpiryBlur = useCallback(() => {\n if (!expiryDisplay) return\n\n if (expiryDisplay.length < 5) {\n setExpiryStatus('error')\n setExpiryError('Введите MM/YY')\n } else if (!isExpiryValid(expiryDisplay)) {\n setExpiryStatus('error')\n setExpiryError('Карта просрочена')\n } else {\n setExpiryStatus('valid')\n setExpiryError(undefined)\n }\n }, [expiryDisplay])\n\n // --- CVC ---\n const handleCvcChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value.replace(/\\D/g, '').slice(0, brandInfo.cvcLength)\n setCvcValue(raw)\n setCvcStatus('idle')\n\n if (formCtx?.form) {\n formCtx.form.setFieldValue(`${name}.cvc`, raw)\n }\n },\n [formCtx, name, brandInfo.cvcLength],\n )\n\n // Валидация CVC на blur\n const handleCvcBlur = useCallback(() => {\n if (!cvcValue) return\n\n if (cvcValue.length < brandInfo.cvcLength) {\n setCvcStatus('error')\n } else {\n setCvcStatus('valid')\n }\n }, [cvcValue, brandInfo.cvcLength])\n\n const isInline = layout === 'inline'\n\n // Стили для статуса валидации (зелёная ✓ или красная рамка)\n const statusBorder = (status: FieldStatus) => {\n if (status === 'valid') return '1px solid var(--chakra-colors-green-500, #38a169)'\n if (status === 'error') return '1px solid var(--chakra-colors-red-500, #e53e3e)'\n return undefined\n }\n\n const statusIcon = (status: FieldStatus) => {\n if (status === 'valid') return '✓'\n return null\n }\n\n return (\n <Field.Root invalid={numberStatus === 'error' || expiryStatus === 'error'}>\n {label && <Field.Label>{label}</Field.Label>}\n\n <Flex\n role=\"group\"\n aria-label={label}\n direction={isInline ? 'row' : 'column'}\n gap={isInline ? 0 : 3}\n align={isInline ? 'center' : 'stretch'}\n borderWidth={isInline ? '1px' : 0}\n borderColor={isInline ? 'border' : undefined}\n borderRadius={isInline ? 'md' : undefined}\n overflow={isInline ? 'hidden' : undefined}\n _focusWithin={isInline\n ? { borderColor: 'colorPalette.500', boxShadow: '0 0 0 1px var(--chakra-colors-colorPalette-500)' }\n : undefined}\n >\n {/* Иконка бренда + Номер карты */}\n <Group\n attached={!isInline}\n flex={isInline ? '1' : undefined}\n gap={0}\n >\n {showBrandIcon && (\n <Box\n px={2}\n display=\"flex\"\n alignItems=\"center\"\n borderRightWidth={isInline ? '1px' : 0}\n borderColor=\"border\"\n >\n <CardBrandIcon brand={brandInfo.brand} size={28} />\n </Box>\n )}\n <Box position=\"relative\" flex={1}>\n <Input\n value={numberDisplay}\n onChange={handleNumberChange}\n onBlur={handleNumberBlur}\n placeholder={numberPlaceholder}\n inputMode=\"numeric\"\n autoComplete=\"cc-number\"\n name=\"cardnumber\"\n maxLength={maxFormattedLength(numberDisplay)}\n disabled={disabled}\n readOnly={readOnly}\n aria-label=\"Номер карты\"\n fontSize=\"16px\"\n border={isInline ? 'none' : undefined}\n borderColor={!isInline ? statusBorder(numberStatus) ? undefined : 'border' : undefined}\n style={!isInline ? { border: statusBorder(numberStatus) } : undefined}\n _focus={isInline ? { boxShadow: 'none' } : undefined}\n />\n {statusIcon(numberStatus) && (\n <Box\n position=\"absolute\"\n right={2}\n top=\"50%\"\n transform=\"translateY(-50%)\"\n color=\"green.500\"\n fontSize=\"sm\"\n fontWeight=\"bold\"\n >\n {statusIcon(numberStatus)}\n </Box>\n )}\n </Box>\n </Group>\n\n {/* Строка: Срок + CVC (рядом в обоих layout) */}\n <Flex gap={isInline ? 0 : 2}>\n {/* Срок действия */}\n <Box position=\"relative\">\n <Input\n ref={expiryRef}\n value={expiryDisplay}\n onChange={handleExpiryChange}\n onBlur={handleExpiryBlur}\n placeholder={expiryPlaceholder}\n inputMode=\"numeric\"\n autoComplete=\"cc-exp\"\n name=\"cc-exp\"\n maxLength={5}\n disabled={disabled}\n readOnly={readOnly}\n aria-label=\"Срок действия\"\n width={isInline ? '100px' : undefined}\n fontSize=\"16px\"\n border={isInline ? 'none' : undefined}\n borderLeft={isInline ? '1px solid' : undefined}\n borderColor={isInline ? 'border' : undefined}\n borderRadius={isInline ? 0 : undefined}\n style={!isInline ? { border: statusBorder(expiryStatus) } : undefined}\n _focus={isInline ? { boxShadow: 'none' } : undefined}\n />\n {statusIcon(expiryStatus) && (\n <Box\n position=\"absolute\"\n right={2}\n top=\"50%\"\n transform=\"translateY(-50%)\"\n color=\"green.500\"\n fontSize=\"sm\"\n fontWeight=\"bold\"\n >\n {statusIcon(expiryStatus)}\n </Box>\n )}\n </Box>\n\n {/* CVC с tooltip */}\n <Box position=\"relative\">\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Input\n ref={cvcRef}\n value={cvcValue}\n onChange={handleCvcChange}\n onBlur={handleCvcBlur}\n placeholder={cvcPlaceholder}\n inputMode=\"numeric\"\n autoComplete=\"cc-csc\"\n name=\"cvc\"\n maxLength={brandInfo.cvcLength}\n disabled={disabled}\n readOnly={readOnly}\n aria-label={`CVC (${brandInfo.cvcLength} цифры)`}\n width={isInline ? '80px' : undefined}\n fontSize=\"16px\"\n border={isInline ? 'none' : undefined}\n borderLeft={isInline ? '1px solid' : undefined}\n borderColor={isInline ? 'border' : undefined}\n borderRadius={isInline ? 0 : undefined}\n style={!isInline ? { border: statusBorder(cvcStatus) } : undefined}\n _focus={isInline ? { boxShadow: 'none' } : undefined}\n />\n </Tooltip.Trigger>\n <Tooltip.Positioner>\n <Tooltip.Content>\n <Text fontSize=\"xs\">\n {brandInfo.brand === 'amex'\n ? '4 цифры на лицевой стороне карты'\n : '3 цифры на обратной стороне карты'}\n </Text>\n </Tooltip.Content>\n </Tooltip.Positioner>\n </Tooltip.Root>\n {statusIcon(cvcStatus) && (\n <Box\n position=\"absolute\"\n right={2}\n top=\"50%\"\n transform=\"translateY(-50%)\"\n color=\"green.500\"\n fontSize=\"sm\"\n fontWeight=\"bold\"\n >\n {statusIcon(cvcStatus)}\n </Box>\n )}\n </Box>\n </Flex>\n </Flex>\n\n {/* Ошибки (inline под полями — никогда не очищаем данные!) */}\n {numberError && <Field.ErrorText>{numberError}</Field.ErrorText>}\n {expiryError && <Field.ErrorText>{expiryError}</Field.ErrorText>}\n </Field.Root>\n )\n}\n","import { z } from 'zod/v4'\nimport { isExpiryValid } from './utils/format-expiry'\nimport { luhn } from './utils/luhn'\n\n/**\n * Готовая Zod-схема для данных банковской карты.\n *\n * @example\n * ```typescript\n * import { creditCardSchema } from '@lena/form-components'\n *\n * const PaymentSchema = z.object({\n * card: creditCardSchema(),\n * })\n * ```\n */\nexport function creditCardSchema() {\n return z.object({\n number: z\n .string()\n .min(12, 'Минимум 12 цифр')\n .max(19, 'Максимум 19 цифр')\n .refine((val) => luhn(val), 'Некорректный номер карты'),\n expiry: z\n .string()\n .regex(/^\\d{2}\\/\\d{2}$/, 'Формат MM/YY')\n .refine((val) => isExpiryValid(val), 'Карта просрочена'),\n cvc: z.string().min(3, 'Минимум 3 цифры').max(4, 'Максимум 4 цифры'),\n })\n}\n"]}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// src/lib/server-errors/parsers.ts
|
|
2
|
+
function isPrismaError(error) {
|
|
3
|
+
return typeof error === "object" && error !== null && "code" in error && typeof error.code === "string" && error.code.startsWith("P");
|
|
4
|
+
}
|
|
5
|
+
function isZodFlatError(error) {
|
|
6
|
+
return typeof error === "object" && error !== null && "fieldErrors" in error && typeof error.fieldErrors === "object";
|
|
7
|
+
}
|
|
8
|
+
function isZenStackError(error) {
|
|
9
|
+
return typeof error === "object" && error !== null && "reason" in error && typeof error.reason === "string";
|
|
10
|
+
}
|
|
11
|
+
function isActionResultError(error) {
|
|
12
|
+
return typeof error === "object" && error !== null && "success" in error && error.success === false && "error" in error;
|
|
13
|
+
}
|
|
14
|
+
var PRISMA_MESSAGES = {
|
|
15
|
+
ru: {
|
|
16
|
+
P2002: (fields) => fields.length === 1 ? `${fields[0]} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442` : `\u041A\u043E\u043C\u0431\u0438\u043D\u0430\u0446\u0438\u044F ${fields.join(" + ")} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442`,
|
|
17
|
+
P2003: (field) => field ? `\u0421\u0432\u044F\u0437\u0430\u043D\u043D\u0430\u044F \u0437\u0430\u043F\u0438\u0441\u044C "${field}" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430` : "\u0421\u0432\u044F\u0437\u0430\u043D\u043D\u0430\u044F \u0437\u0430\u043F\u0438\u0441\u044C \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430",
|
|
18
|
+
P2025: () => "\u0417\u0430\u043F\u0438\u0441\u044C \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430",
|
|
19
|
+
P2014: () => "\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u2014 \u0435\u0441\u0442\u044C \u0441\u0432\u044F\u0437\u0430\u043D\u043D\u044B\u0435 \u0437\u0430\u043F\u0438\u0441\u0438",
|
|
20
|
+
default: () => "\u041E\u0448\u0438\u0431\u043A\u0430 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445"
|
|
21
|
+
},
|
|
22
|
+
en: {
|
|
23
|
+
P2002: (fields) => fields.length === 1 ? `${fields[0]} already exists` : `Combination of ${fields.join(" + ")} already exists`,
|
|
24
|
+
P2003: (field) => field ? `Related record "${field}" not found` : "Related record not found",
|
|
25
|
+
P2025: () => "Record not found",
|
|
26
|
+
P2014: () => "Cannot delete \u2014 has related records",
|
|
27
|
+
default: () => "Database error"
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
function parsePrismaError(error, fieldMap, locale = "ru") {
|
|
31
|
+
if (!isPrismaError(error)) return null;
|
|
32
|
+
const msgs = PRISMA_MESSAGES[locale];
|
|
33
|
+
const result = { fieldErrors: [], formErrors: [] };
|
|
34
|
+
switch (error.code) {
|
|
35
|
+
case "P2002": {
|
|
36
|
+
const targets = error.meta?.target ?? [];
|
|
37
|
+
const constraintKey = targets.join("_");
|
|
38
|
+
const mapped = fieldMap?.[constraintKey] ?? (targets.length === 1 ? fieldMap?.[targets[0]] : void 0);
|
|
39
|
+
if (mapped) {
|
|
40
|
+
result.fieldErrors.push({ field: mapped.field, message: mapped.message });
|
|
41
|
+
} else if (targets.length > 0) {
|
|
42
|
+
result.fieldErrors.push({
|
|
43
|
+
field: targets[0],
|
|
44
|
+
message: msgs.P2002(targets)
|
|
45
|
+
});
|
|
46
|
+
} else {
|
|
47
|
+
result.formErrors.push(msgs.P2002([]));
|
|
48
|
+
}
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case "P2003": {
|
|
52
|
+
const field = error.meta?.field_name;
|
|
53
|
+
const mapped = field ? fieldMap?.[field] : void 0;
|
|
54
|
+
if (mapped) {
|
|
55
|
+
result.fieldErrors.push({ field: mapped.field, message: mapped.message });
|
|
56
|
+
} else if (field) {
|
|
57
|
+
result.fieldErrors.push({ field, message: msgs.P2003(field) });
|
|
58
|
+
} else {
|
|
59
|
+
result.formErrors.push(msgs.P2003());
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "P2025":
|
|
64
|
+
result.formErrors.push(msgs.P2025());
|
|
65
|
+
break;
|
|
66
|
+
case "P2014":
|
|
67
|
+
result.formErrors.push(msgs.P2014());
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
result.formErrors.push(msgs.default());
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
function parseZenStackError(error, fieldMap, locale = "ru") {
|
|
75
|
+
if (!isZenStackError(error)) return null;
|
|
76
|
+
const result = { fieldErrors: [], formErrors: [] };
|
|
77
|
+
switch (error.reason) {
|
|
78
|
+
case "rejected-by-policy": {
|
|
79
|
+
const message = locale === "ru" ? error.rejectedByPolicyReason === "cannot-read-back" ? "\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0430, \u043D\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0438\u0437-\u0437\u0430 \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u0439 \u0434\u043E\u0441\u0442\u0443\u043F\u0430" : "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u0434\u043B\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0439 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438" : error.rejectedByPolicyReason === "cannot-read-back" ? "Operation succeeded but result is not accessible due to permissions" : "Access denied for this operation";
|
|
80
|
+
result.formErrors.push(message);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case "db-query-error": {
|
|
84
|
+
if (error.code) {
|
|
85
|
+
const prismaLike = {
|
|
86
|
+
code: error.code,
|
|
87
|
+
message: error.dbErrorMessage ?? error.message ?? "",
|
|
88
|
+
meta: error.meta
|
|
89
|
+
};
|
|
90
|
+
const prismaResult = parsePrismaError(prismaLike, fieldMap, locale);
|
|
91
|
+
if (prismaResult) return prismaResult;
|
|
92
|
+
}
|
|
93
|
+
result.formErrors.push(error.message ?? (locale === "ru" ? "\u041E\u0448\u0438\u0431\u043A\u0430 \u0431\u0430\u0437\u044B \u0434\u0430\u043D\u043D\u044B\u0445" : "Database error"));
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case "not-found":
|
|
97
|
+
result.formErrors.push(locale === "ru" ? "\u0417\u0430\u043F\u0438\u0441\u044C \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430" : "Record not found");
|
|
98
|
+
break;
|
|
99
|
+
default:
|
|
100
|
+
result.formErrors.push(error.message ?? (locale === "ru" ? "\u041D\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430" : "Unknown error"));
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
function parseZodFlatError(error) {
|
|
105
|
+
if (!isZodFlatError(error)) return null;
|
|
106
|
+
const result = { fieldErrors: [], formErrors: [] };
|
|
107
|
+
if (Array.isArray(error.formErrors)) {
|
|
108
|
+
result.formErrors.push(...error.formErrors);
|
|
109
|
+
}
|
|
110
|
+
for (const [field, messages] of Object.entries(error.fieldErrors)) {
|
|
111
|
+
if (Array.isArray(messages)) {
|
|
112
|
+
for (const message of messages) {
|
|
113
|
+
if (typeof message === "string") {
|
|
114
|
+
result.fieldErrors.push({ field, message });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
function parseActionResultError(error) {
|
|
122
|
+
if (!isActionResultError(error)) return null;
|
|
123
|
+
const result = { fieldErrors: [], formErrors: [] };
|
|
124
|
+
if (typeof error.error === "string") {
|
|
125
|
+
result.formErrors.push(error.error);
|
|
126
|
+
} else if (typeof error.error === "object") {
|
|
127
|
+
const zodResult = parseZodFlatError(error.error);
|
|
128
|
+
if (zodResult) return zodResult;
|
|
129
|
+
}
|
|
130
|
+
if (error.message && !result.formErrors.includes(error.message)) {
|
|
131
|
+
result.formErrors.push(error.message);
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
function parseErrorObject(error, fieldMap, locale = "ru") {
|
|
136
|
+
if (!(error instanceof Error)) return null;
|
|
137
|
+
const info = error.info;
|
|
138
|
+
if (info) {
|
|
139
|
+
const zenResult = parseZenStackError(info, fieldMap, locale);
|
|
140
|
+
if (zenResult) return zenResult;
|
|
141
|
+
}
|
|
142
|
+
const cause = error.cause;
|
|
143
|
+
if (cause) {
|
|
144
|
+
const prismaResult = parsePrismaError(cause, fieldMap, locale);
|
|
145
|
+
if (prismaResult) return prismaResult;
|
|
146
|
+
}
|
|
147
|
+
return { fieldErrors: [], formErrors: [error.message] };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// src/lib/server-errors/map-server-errors.ts
|
|
151
|
+
function mapServerErrors(error, config) {
|
|
152
|
+
const { fieldMap, format = "auto", defaultMessage, locale = "ru" } = config ?? {};
|
|
153
|
+
const fallback = {
|
|
154
|
+
fieldErrors: [],
|
|
155
|
+
formErrors: [defaultMessage ?? (locale === "ru" ? "\u041F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430" : "An error occurred")]
|
|
156
|
+
};
|
|
157
|
+
if (error == null) return fallback;
|
|
158
|
+
if (typeof error === "string") {
|
|
159
|
+
return { fieldErrors: [], formErrors: [error] };
|
|
160
|
+
}
|
|
161
|
+
if (format !== "auto") {
|
|
162
|
+
const result = parseByFormat(error, format, fieldMap, locale);
|
|
163
|
+
return result ?? fallback;
|
|
164
|
+
}
|
|
165
|
+
const parsers = [
|
|
166
|
+
() => parsePrismaError(error, fieldMap, locale),
|
|
167
|
+
() => parseZenStackError(error, fieldMap, locale),
|
|
168
|
+
() => parseZodFlatError(error),
|
|
169
|
+
() => parseActionResultError(error),
|
|
170
|
+
() => parseErrorObject(error, fieldMap, locale)
|
|
171
|
+
];
|
|
172
|
+
for (const parse of parsers) {
|
|
173
|
+
const result = parse();
|
|
174
|
+
if (result) return result;
|
|
175
|
+
}
|
|
176
|
+
return fallback;
|
|
177
|
+
}
|
|
178
|
+
function parseByFormat(error, format, fieldMap, locale = "ru") {
|
|
179
|
+
switch (format) {
|
|
180
|
+
case "prisma":
|
|
181
|
+
return parsePrismaError(error, fieldMap, locale);
|
|
182
|
+
case "zenstack":
|
|
183
|
+
return parseZenStackError(error, fieldMap, locale);
|
|
184
|
+
case "zod":
|
|
185
|
+
return parseZodFlatError(error);
|
|
186
|
+
case "action-result":
|
|
187
|
+
return parseActionResultError(error);
|
|
188
|
+
default:
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function applyServerErrors(form, mapped) {
|
|
193
|
+
for (const { field, message } of mapped.fieldErrors) {
|
|
194
|
+
form.setFieldMeta(field, (prev) => ({
|
|
195
|
+
...prev,
|
|
196
|
+
errors: [...prev.errors, message]
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
if (mapped.formErrors.length > 0) {
|
|
200
|
+
form.setErrorMap({ onSubmit: mapped.formErrors.join(". ") });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export { applyServerErrors, mapServerErrors, parseActionResultError, parseErrorObject, parsePrismaError, parseZenStackError, parseZodFlatError };
|
|
205
|
+
//# sourceMappingURL=chunk-5D6S6EGF.js.map
|
|
206
|
+
//# sourceMappingURL=chunk-5D6S6EGF.js.map
|