@dsai-io/tools 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/icons/core/optimizer.ts","../src/version.ts","../src/config/schema.ts","../src/config/defaults.ts","../src/config/resolver.ts","../src/config/loader.ts","../src/config/env.ts","../src/config/migrate.ts","../src/tokens/types.ts","../src/tokens/validate.ts","../src/tokens/validate-figma.ts","../src/tokens/transform.ts","../src/tokens/sync.ts","../src/tokens/postprocess.ts","../src/tokens/build.ts","../src/tokens/clean.ts","../src/tokens/merge.ts","../src/tokens/merge/scanner.ts","../src/tokens/merge/merger.ts","../src/tokens/merge/bundler.ts","../src/tokens/output/resolver.ts","../src/tokens/style-dictionary/types.ts","../src/tokens/style-dictionary/formats/css-dark-mode.ts","../src/tokens/style-dictionary/formats/css-variables.ts","../src/tokens/style-dictionary/formats/typescript.ts","../src/tokens/style-dictionary/formats/index.ts","../src/tokens/style-dictionary/groups/css.ts","../src/tokens/style-dictionary/groups/js.ts","../src/tokens/style-dictionary/groups/scss.ts","../src/tokens/style-dictionary/groups/index.ts","../src/tokens/style-dictionary/preprocessors/fix-references.ts","../src/tokens/style-dictionary/preprocessors/index.ts","../src/tokens/style-dictionary/transforms/dimension.ts","../src/tokens/style-dictionary/transforms/font-weight.ts","../src/tokens/style-dictionary/transforms/line-height.ts","../src/tokens/style-dictionary/transforms/name.ts","../src/tokens/style-dictionary/transforms/index.ts","../src/tokens/style-dictionary/config.ts","../src/icons/core/scanner.ts","../src/icons/utils/naming.ts","../src/icons/core/parser.ts","../src/icons/core/index.ts","../src/icons/generators/react.ts","../src/icons/generators/svg-sprite.ts","../src/icons/index.ts","../src/utils/index.ts"],"names":["defaultSVGOConfig","z","version","path","cosmiconfig","cosmiconfigSync","readFileSync","existsSync","readdirSync","join","statSync","relative","basename","extname","countTokens","DEFAULT_COLLECTIONS","dirname","mkdirSync","detectModes","writeFileSync","execSync","resolve","rmSync","isToken","path3","fs","fs2","path4","path5","fs3","path6","fs4","DEFAULT_BASE_FONT_SIZE","skipOptimization","fileURLToPath","pc","deepMerge"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAAA,yBAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAoDA,eAAsB,WAAA,CACpB,MAAA,EACA,GAAA,EACA,MAAA,GAAqBA,yBAAA,EACE;AAEvB,EAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAGhC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAWA,yBAAA,CAAkB,WAAW,EAAC;AAGhE,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACtC,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,GAAI,EAAE,MAAA,GAAS,EAAE,QAAQ,CAAA,CAAE,MAAA,KAAW;AAAC,GACzC,CAAE,CAAA;AAGF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS;AAAA,IACxC,SAAA,EAAW,OAAO,SAAA,IAAa,IAAA;AAAA,IAC/B,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,mBAAmB,MAAA,CAAO,IAAA;AAChC,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,UAAA,CAAW,gBAAA,EAAkB,OAAO,CAAA;AACjE,EAAA,MAAM,aAAA,GACJ,IAAI,YAAA,GAAe,CAAA,GAAA,CAAM,IAAI,YAAA,GAAe,aAAA,IAAiB,GAAA,CAAI,YAAA,GAAgB,GAAA,GAAM,CAAA;AAGzF,EAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,KAAA,CAAM,8BAA8B,CAAA;AAC/E,EAAA,MAAM,eAAe,iBAAA,GAAoB,CAAC,CAAA,EAAG,IAAA,MAAU,MAAA,CAAO,YAAA;AAG9D,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,CAAM,2BAA2B,CAAA;AACvE,EAAA,MAAM,OAAA,GAAU,YAAA,GAAe,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA;AAE5C,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,YAAA;AAAA,IACA,WAAA,EAAa,gBAAA;AAAA,IACb,OAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AAUA,eAAsB,gBAAA,CACpB,WAAA,EACA,QAAA,EACA,MAAA,GAAqBA,yBAAA,EACI;AACzB,EAAA,MAAM,UAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,IAAA,MAAM,GAAA,GAAM,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,OAAO,QAAQ,CAAA;AAC/D,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC7D;AACA,IAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,MAAA,EAAQ,KAAK,MAAM,CAAA;AACvD,IAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,OAAA;AACT;AAWO,SAAS,gBAAA,CAAiB,QAAmB,GAAA,EAA+B;AACjF,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,eAAe,GAAA,CAAI,YAAA;AAAA,IACnB,aAAA,EAAe;AAAA,GACjB;AACF;AA7HaA;AAfb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAeO,IAAMA,yBAAA,GAAgC;AAAA,MAC3C,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,QACP,EAAE,MAAM,gBAAA,EAAiB;AAAA,QACzB,EAAE,MAAM,aAAA,EAAc;AAAA,QACtB,EAAE,MAAM,kBAAA,EAAmB;AAAA,QAC3B,EAAE,MAAM,oBAAA,EAAqB;AAAA,QAC7B,EAAE,MAAM,qBAAA,EAAsB;AAAA,QAC9B;AAAA,UACE,IAAA,EAAM,aAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,KAAA,EAAO,CAAC,OAAA,EAAS,OAAA,EAAS,aAAa,aAAa;AAAA;AACtD,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,2BAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,UAAA,EAAY,CAAC,EAAE,aAAA,EAAe,QAAO,EAAG,EAAE,SAAA,EAAW,OAAA,EAAS;AAAA;AAChE,SACF;AAAA,QACA;AAAA,UACE,IAAA,EAAM,WAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,UAAA,EAAY;AAAA;AACd;AACF;AACF,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvCO,IAAM,OAAA,GAAU;ACgBhB,IAAM,cAAA,GAAiBC,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,SAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC;AAKrF,IAAM,kBAAA,GAAqBA,KAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAK,CAAC;AAK3F,IAAM,eAAA,GAAkBA,MAAE,IAAA,CAAK,CAAC,SAAS,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,SAAS,CAAC;AAK/E,IAAM,cAAA,GAAiBA,MAAE,IAAA,CAAK,CAAC,WAAW,WAAA,EAAa,SAAA,EAAW,MAAM,CAAC;AAUzE,IAAM,oBAAoBA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,8BAA8B;AAM1E,IAAM,iBAAiBA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,2BAA2B;AAMpE,IAAM,aAAA,GAAgBA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAA;AAAA,EACtC,CAAC,GAAA,KAAQ;AACP,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,MAAMC,QAAAA,GAAU,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAC5B,IAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,IAAA,MAAM,YAAA,GAAeA,QAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AACtC,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,GAAG,CAAA,IAAK,MAAM,CAAA,EAAG;AACrC,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AACvD,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAAA,EACA,EAAE,SAAS,iCAAA;AACb;AAUO,IAAM,qBAAA,GAAwBD,MAAE,MAAA,CAAO;AAAA,EAC5C,MAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,4BAA4B,CAAA;AAAA,EACpD,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,IAAA,EAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,WAAA,EAAa,MAAM,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EACvE,WAAWA,KAAA,CAAE,QAAA,EAAS,CAAE,IAAA,CAAKA,MAAE,GAAA,EAAI,EAAGA,KAAA,CAAE,GAAA,EAAK,CAAA,CAAE,OAAA,CAAQA,MAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,EACzE,MAAA,EAAQA,KAAA,CAAE,QAAA,EAAS,CAAE,KAAKA,KAAA,CAAE,GAAA,EAAK,CAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EACjE,OAAA,EAASA,KAAA,CAAE,QAAA,EAAS,CAAE,KAAKA,KAAA,CAAE,GAAA,EAAK,CAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,OAAA,EAAS,EAAE,QAAA;AAC3D,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,MAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,yBAAyB,CAAA;AAAA,EACjD,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,SAAA,EAAWA,KAAA,CAAE,QAAA,EAAS,CAAE,KAAKA,KAAA,CAAE,GAAA,EAAK,CAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACnE,WAAWA,KAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA;AAC/B,CAAC;AAUM,IAAM,eAAA,GAAkBA,MAAE,MAAA,CAAO;AAAA,EACtC,UAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,4BAA4B,CAAA;AAAA,EACxD,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,cAAcA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EACjD,uBAAuBA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC3D,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC5C,WAAA,EAAaA,KAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,MAAA,EAAQ,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,OAAO,CAAA;AAAA,EAC3E,KAAA,EAAOA,KAAA,CACJ,MAAA,CAAOA,KAAA,CAAE,MAAA,IAAU,eAAe,CAAA,CAClC,QAAA,EAAS,CACT,OAAA,CAAQ;AAAA,IACP,OAAO,EAAE,QAAA,EAAU,SAAS,YAAA,EAAc,IAAA,EAAM,uBAAuB,KAAA,EAAM;AAAA,IAC7E,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,qBAAA;AAAA,MACV,UAAA,EAAY,8BAAA;AAAA,MACZ,YAAA,EAAc,IAAA;AAAA,MACd,qBAAA,EAAuB;AAAA;AACzB,GACD,CAAA;AAAA,EACH,gBAAgBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,QAAQ,CAAA;AAAA,EACtD,WAAA,EAAaA,MACV,MAAA,CAAO;AAAA,IACN,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC3B,EACA,QAAA;AACL,CAAC;AASM,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EAC7C,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC5C,gBAAgBA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EACnD,kBAAkBA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EACtD,eAAeA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EACnD,aAAaA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAChD,YAAYA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC/C,QAAQA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI;AAC7C,CAAC;AAKM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC5C,UAAUA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,OAAO,CAAA;AAAA,EAC/C,MAAA,EAAQA,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,OAAA,EAAS,KAAK,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACtE,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,OAAO;AAC/C,CAAC;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC5C,WAAWA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,cAAc,CAAA;AAAA,EACvD,WAAWA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,YAAY,CAAA;AAAA,EACrD,SAASA,KAAA,CACN,KAAA,CAAMA,MAAE,IAAA,CAAK,CAAC,OAAO,OAAA,EAAS,KAAA,EAAO,UAAU,MAAM,CAAC,CAAC,CAAA,CACvD,QAAA,GACA,OAAA,CAAQ,CAAC,KAAK,CAAC,CAAA;AAAA,EAClB,YAAA,EAAc,uBAAuB,QAAA,EAAS;AAAA,EAC9C,MAAA,EAAQ,iBAAiB,QAAA,EAAS;AAAA,EAClC,iBAAiBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,MAAM,CAAA;AAAA,EACrD,iBAAiBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,EAAE,CAAA;AAAA,EACjD,eAAeA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAClD,eAAeA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI;AACpD,CAAC;AASM,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EAC7C,MAAA,EAAQ,kBAAA;AAAA,EACR,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,cAAA,EAAgBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACpC,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,YAAA,EAAcA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACnC,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC9B,YAAYA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACzC,gBAAA,EAAkBA,KAAA,CAAE,KAAA,CAAM,qBAAqB,EAAE,QAAA,EAAS;AAAA,EAC1D,MAAA,EAAQA,KAAA,CACL,QAAA,EAAS,CACT,IAAA,CAAKA,MAAE,GAAA,EAAK,CAAA,CACZ,OAAA,CAAQA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,OAAA,EAAQ,EAAGA,KAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,OAAA,EAAS,CAAC,CAAC,CAAC,CAAA,CACtD,QAAA,EAAS;AAAA,EACZ,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC;AAKM,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EAC7C,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC5C,WAAWA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,QAAQ,CAAA;AAAA,EACjD,QAAA,EAAU,cAAA,CAAe,QAAA,EAAS,CAAE,QAAQ,SAAS,CAAA;AAAA,EACrD,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,KAAQ;AAChD,CAAC;AAKM,IAAM,sBAAA,GAAyBA,MAAE,MAAA,CAAO;AAAA,EAC7C,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC7C,UAAUA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,GAAG,CAAA;AAAA,EAC3C,aAAaA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAChD,cAAA,EAAgBA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE;AAC3D,CAAC;AAKM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,YAAA,EAAcA,KAAA,CACX,QAAA,EAAS,CACT,IAAA,CAAKA,MAAE,GAAA,EAAK,CAAA,CACZ,OAAA,CAAQA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,IAAA,EAAK,EAAGA,KAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA,CAChD,QAAA,EAAS;AAAA,EACZ,gBAAA,EAAkBA,KAAA,CACf,QAAA,EAAS,CACT,IAAA,CAAKA,MAAE,GAAA,EAAK,CAAA,CACZ,OAAA,CAAQA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,IAAA,EAAK,EAAGA,KAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA,CAChD,QAAA,EAAS;AAAA,EACZ,oBAAA,EAAsBA,KAAA,CACnB,QAAA,EAAS,CACT,IAAA,CAAKA,MAAE,GAAA,EAAK,CAAA,CACZ,OAAA,CAAQA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,IAAA,EAAK,EAAGA,KAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA,CAChD,QAAA,EAAS;AAAA,EACZ,eAAA,EAAiBA,KAAA,CACd,QAAA,EAAS,CACT,IAAA,CAAKA,MAAE,GAAA,EAAK,CAAA,CACZ,OAAA,CAAQA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,IAAA,EAAK,EAAGA,KAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA,CAChD,QAAA,EAAS;AAAA,EACZ,OAAA,EAASA,KAAA,CACN,QAAA,EAAS,CACT,IAAA,CAAKA,MAAE,GAAA,EAAK,CAAA,CACZ,OAAA,CAAQA,KAAA,CAAE,KAAA,CAAM,CAACA,KAAA,CAAE,IAAA,EAAK,EAAGA,KAAA,CAAE,OAAA,CAAQA,KAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA,CAChD,QAAA;AACL,CAAC;AAKM,IAAM,uBAAA,GAA0BA,MAAE,IAAA,CAAK;AAAA,EAC5C,UAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAMM,IAAM,yBAAA,GAA4BA,MAAE,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhD,OAAOA,KAAA,CACJ,KAAA,CAAM,uBAAuB,CAAA,CAC7B,QAAA,GACA,OAAA,CAAQ;AAAA,IACP,UAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAAA;AAAA;AAAA;AAAA,EAKH,KAAA,EAAOA,MACJ,MAAA,CAAO;AAAA;AAAA,IAEN,YAAYA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,mBAAmB,CAAA;AAAA;AAAA,IAE7D,YAAYA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,oBAAoB,CAAA;AAAA;AAAA,IAE9D,gBAAgBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,6BAA6B,CAAA;AAAA;AAAA,IAE3E,iBAAiBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,4BAA4B,CAAA;AAAA;AAAA,IAE3E,yBAAyBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,gCAAgC,CAAA;AAAA;AAAA,IAEvF,oBAAoBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,8BAA8B,CAAA;AAAA;AAAA,IAEhF,qBAAqBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,mBAAmB,CAAA;AAAA;AAAA,IAEtE,6BAA6BA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,uBAAuB;AAAA,GACnF,EACA,QAAA,EAAS;AAAA;AAAA,EAGZ,uBAAuBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,eAAe;AACtE,CAAC,CAAA;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC5C,cAAA,EAAgBA,KAAA,CACb,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,OAAA,CAAQ,CAAC,sBAAA,EAAwB,sBAAsB,CAAC,CAAA;AAAA,EAC3D,UAAA,EAAYA,MACT,MAAA,CAAO;AAAA,IACN,KAAKA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,UAAU,CAAA;AAAA,IAC7C,MAAMA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,WAAW,CAAA;AAAA,IAC/C,MAAMA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,WAAW,CAAA;AAAA,IAC/C,IAAIA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,SAAS,CAAA;AAAA,IAC3C,IAAIA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,SAAS,CAAA;AAAA,IAC3C,MAAMA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,WAAW;AAAA,GAChD,EACA,QAAA,EAAS;AAAA,EACZ,yBAAA,EAA2BA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACpE,eAAA,EAAiBA,MACd,MAAA,CAAO;AAAA,IACN,WAAWA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,WAAW,CAAA;AAAA,IACpD,WAAWA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,WAAW,CAAA;AAAA,IACpD,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,QAAQ,CAAA;AAAA,IAC9C,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,QAAQ;AAAA,GAC/C,EACA,QAAA,EAAS;AAAA,EACZ,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,MAAM,CAAA;AAAA,EAC5C,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,QAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,CAAC,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAC,CAAA;AAAA,EACpF,cAAcA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EACjD,gBAAgBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,QAAQ,CAAA;AAAA,EACtD,OAAA,EAASA,KAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,EAC/E,SAAA,EAAWA,MAAE,MAAA,CAAOA,KAAA,CAAE,QAAO,EAAG,sBAAsB,EAAE,QAAA,EAAS;AAAA,EACjE,UAAA,EAAYA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACrD,gBAAA,EAAkBA,MAAE,KAAA,CAAM,qBAAqB,EAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EACtE,aAAA,EAAeA,MAAE,KAAA,CAAM,kBAAkB,EAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA,EAChE,KAAA,EAAO,kBAAkB,QAAA,EAAS;AAAA,EAClC,KAAA,EAAO,uBAAuB,QAAA,EAAS;AAAA,EACvC,KAAA,EAAO,uBAAuB,QAAA,EAAS;AAAA,EACvC,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA;AAAA,EAE7C,QAAA,EAAU,0BAA0B,QAAA;AACtC,CAAC;AASM,IAAM,iBAAA,GAAoBA,MAAE,MAAA,CAAO;AAAA,EACxC,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,MAAM,CAAA;AAAA,EAC5C,OAAOA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC1C,WAAWA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC/C,QAAQA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC3C,UAAUA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC7C,gBAAgBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,QAAQ,CAAC;AACjD,CAAC;AAKM,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EACzC,QAAA,EAAU,cAAA,CAAe,QAAA,EAAS,CAAE,QAAQ,MAAM,CAAA;AAAA,EAClD,QAAQA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI,CAAA;AAAA,EAC3C,IAAIA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EACxC,QAAQA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC5C,GAAA,EAAKA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAChC,SAAA,EAAW,gBAAgB,QAAA,EAAS;AAAA,EACpC,KAAA,EAAO,kBAAkB,QAAA;AAC3B,CAAC;AAYM,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAA,EAASA,KAAA,CAAE,KAAA,CAAM,CAACA,MAAE,MAAA,EAAO,EAAGA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,CAAC,CAAC,EAAE,QAAA,EAAS;AAAA,EAC7D,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA,EACpC,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA,EACpC,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA,EACpC,KAAA,EAAO,kBAAkB,QAAA;AAC3B,CAAC;AA4DM,SAAS,uBAAuB,QAAA,EAAyC;AAC9E,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,IACnC,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAAA,IAC5B,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,UAAU,UAAA,IAAc,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAAA,IACrD,UAAU,UAAA,IAAc,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,GAAI;AAAA,GACvD,CAAE,CAAA;AACJ;AAsBO,SAAS,eAAe,MAAA,EAAyD;AACtF,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,CAAU,MAAM,CAAA;AAEhD,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,MAAA,EAAQ,sBAAA,CAAuB,MAAA,CAAO,KAAK;AAAA,GAC7C;AACF;AAmBO,SAAS,sBAAsB,MAAA,EAAuC;AAC3E,EAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AAEpC,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,MAAA,EAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACxF,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,EAAqC,aAAa,CAAA,CAAE,CAAA;AAAA,EACtE;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AASO,SAAS,qBAAA,CACd,SACA,MAAA,EACwD;AACxD,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ,kBAAA;AAAA,IACR,MAAA,EAAQ,kBAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,MAAM,MAAA,GAAS,eAAe,OAAsC,CAAA;AAEpE,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,OAAA;AAAA,UACN,OAAA,EAAS,kCAAkC,OAAO,CAAA,CAAA;AAAA,UAClD,IAAA,EAAM;AAAA;AACR;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA;AAEtC,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAM,MAAA,CAAO;AAAA,KACf;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,MAAA,EAAQ,sBAAA,CAAuB,MAAA,CAAO,KAAK;AAAA,GAC7C;AACF;AAQO,SAAS,mBAAmB,MAAA,EAAmC;AACpE,EAAA,MAAM,KAAA,GAAQ,CAAC,kCAAA,EAAoC,EAAE,CAAA;AAErD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAO,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAEjC,IAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,QAAA,EAAU;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAA;AAC5C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC9C;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACpmBO,IAAM,cAAA,GAAiB;AAKvB,IAAM,iBAAA,GAA8B;AAKpC,IAAM,kBAAA,GAAqB;AAK3B,IAAM,kBAAA,GAAqB;AAK3B,IAAM,uBAAA,GAA0B;AAKhC,IAAM,wBAAA,GAA2B;AAKjC,IAAM,wBAAA,GAA2B;AASjC,IAAM,qBAAA,GAAwB,CAAC,YAAA,EAAc,aAAA,EAAe,eAAe;AAK3E,IAAM,iBAAiC,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,MAAM,MAAM;AAKzE,IAAM,sBAAA,GAAuD;AAAA,EAClE,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,cAAA;AAAA,EACN,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM,aAAA;AAAA,EACN,OAAA,EAAS,YAAA;AAAA,EACT,GAAA,EAAK;AACP;AASO,IAAM,sBAAA,GAAyD;AAAA,EACpE,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ;AACV;AAKO,IAAM,mBAAA,GAA4C;AAAA,EACvD,UAAA,EAAY,IAAA;AAAA,EACZ,OAAA,EAAS,OAAA;AAAA,EACT,aAAa,EAAC;AAAA,EACd,eAAA,EAAiB;AACnB;AASO,IAAM,oBAAA,GAAsC;AAK5C,IAAM,kBAAA,GAA0C;AAAA,EACrD,SAAA,EAAW,wBAAA;AAAA,EACX,SAAA,EAAW,wBAAA;AAAA,EACX,SAAA,EAAW,oBAAA;AAAA,EACX,UAAA,EAAY,IAAA;AAAA,EACZ,QAAA,EAAU,IAAA;AAAA,EACV,MAAA,EAAQ;AACV;AASO,IAAM,mBAAA,GAA4C;AAAA,EACvD,MAAA,EAAQ,OAAA;AAAA,EACR,SAAA,EAAW,kBAAA;AAAA,EACX,cAAA,EAAgB,uBAAA;AAAA,EAChB,cAAA,EAAgB,qBAAA;AAAA,EAChB,mBAAmB,EAAC;AAAA,EACpB,SAAA,EAAW,kBAAA;AAAA,EACX,YAAY,EAAC;AAAA,EACb,eAAA,EAAiB,sBAAA;AAAA,EACjB,MAAA,EAAQ,cAAA;AAAA,EACR,OAAA,EAAS,cAAA;AAAA,EACT,2BAA2B,EAAC;AAAA,EAC5B,0BAA0B,EAAC;AAAA,EAC3B,UAAA,EAAY,OAAA;AAAA,EACZ,YAAA,EAAc,KAAA;AAAA,EACd,MAAA,EAAQ,mBAAA;AAAA,EACR,YAAY,EAAC;AAAA,EACb,eAAe,EAAC;AAAA,EAChB,eAAe,EAAC;AAAA,EAChB,SAAS,EAAC;AAAA,EACV,gBAAA,EAAkB,IAAA;AAAA,EAClB,YAAA,EAAc,EAAA;AAAA,EACd,kBAAA,EAAoB,KAAA;AAAA,EACpB,KAAA,EAAO,KAAA;AAAA,EACP,kBAAkB;AACpB;AASO,IAAM,mBAAA,GAA4C;AAAA,EACvD,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EACjB,KAAA,EAAO,KAAA;AAAA,EACP,QAAA,EAAU;AACZ;AAYO,IAAM,aAAA,GAAgC;AAAA,EAC3C,MAAA,EAAQ,mBAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,MAAA,EAAQ,mBAAA;AAAA,EACR,SAAA,EAAW,QAAQ,GAAA;AACrB;AAeO,IAAM,WAAA,GAAsC;AAAA;AAAA,EAEjD,cAAA,EAAgB,iBAAA;AAAA,EAChB,UAAA,EAAY,cAAA;AAAA,EACZ,QAAA,EAAU,YAAA;AAAA;AAAA,EAGV,WAAA,EAAa,eAAA;AAAA,EACb,eAAA,EAAiB,kBAAA;AAAA,EACjB,eAAA,EAAiB,kBAAA;AAAA,EACjB,UAAA,EAAY,cAAA;AAAA,EACZ,kBAAA,EAAoB,qBAAA;AAAA,EACpB,mBAAA,EAAqB,qBAAA;AAAA;AAAA,EAGrB,kBAAA,EAAoB,uBAAA;AAAA,EACpB,uBAAA,EAAyB,0BAAA;AAAA;AAAA,EAGzB,qBAAA,EAAuB,iBAAA;AAAA,EACvB,qBAAA,EAAuB,iBAAA;AAAA,EACvB,oBAAA,EAAsB,iBAAA;AAAA,EACtB,qBAAA,EAAuB,kBAAA;AAAA,EACvB,mBAAA,EAAqB,gBAAA;AAAA,EACrB,iBAAA,EAAmB;AACrB;AAKO,IAAM,cAAA,uBAAkC,GAAA,CAAI;AAAA,EACjD,YAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,yBAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACF,CAAC;AAKM,IAAM,aAAA,mBAA6B,IAAI,GAAA,CAAI,CAAC,qBAAqB,CAAC;AAKlE,IAAM,+BAA4B,IAAI,GAAA,CAAI,CAAC,cAAA,EAAgB,mBAAmB,CAAC;AAa/E,SAAS,iBAAA,CAAkB,QAAsB,KAAA,EAAwB;AAC9E,EAAA,IAAI,QAAA;AAEJ,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,KAAA;AACH,MAAA,QAAA,GAAW,YAAA;AACX,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,GAAW,cAAA;AACX,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,QAAA,GAAW,WAAA;AACX,MAAA;AAAA,IACF,KAAK,IAAA;AACH,MAAA,QAAA,GAAW,WAAA;AACX,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,QAAA,GAAW,aAAA;AACX,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,QAAA,GAAW,YAAA;AACX,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,QAAA,GAAW,UAAA;AACX,MAAA;AAAA,IACF;AACE,MAAA,QAAA,GAAW,YAAA;AAAA;AAGf,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACzC,EAAA,IAAI,aAAa,EAAA,EAAI;AACnB,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AACnC,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,GAAG,GAAG,CAAA,CAAA;AAC/B;AAQO,SAAS,oBAAoB,MAAA,EAA8B;AAChE,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,KAAA;AACH,MAAA,OAAO,GAAG,kBAAkB,CAAA,IAAA,CAAA;AAAA,IAC9B,KAAK,MAAA;AACH,MAAA,OAAO,GAAG,kBAAkB,CAAA,KAAA,CAAA;AAAA,IAC9B,KAAK,IAAA;AAAA,IACL,KAAK,IAAA;AACH,MAAA,OAAO,GAAG,kBAAkB,CAAA,GAAA,CAAA;AAAA,IAC9B,KAAK,MAAA;AACH,MAAA,OAAO,GAAG,kBAAkB,CAAA,KAAA,CAAA;AAAA,IAC9B,KAAK,SAAA;AACH,MAAA,OAAO,GAAG,kBAAkB,CAAA,QAAA,CAAA;AAAA,IAC9B,KAAK,KAAA;AACH,MAAA,OAAO,GAAG,kBAAkB,CAAA,IAAA,CAAA;AAAA,IAC9B;AACE,MAAA,OAAO,kBAAA;AAAA;AAEb;AAQO,SAAS,oBAAoB,MAAA,EAA8B;AAChE,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,KAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,IAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;ACjTA,SAAS,mBAAA,CACP,QACA,OAAA,EACsB;AACtB,EAAA,MAAM,IAAA,GAAO,mBAAA;AACb,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEvC,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAQ,GAAA,GAAME,wBAAA,CAAK,QAAQ,GAAA,EAAK,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA;AAAA,IACnD,KAAA,EAAO,MAAA,EAAQ,KAAA,IAAS,IAAA,CAAK,KAAA;AAAA,IAC7B,QAAA,EAAU,MAAA,EAAQ,QAAA,IAAY,IAAA,CAAK;AAAA,GACrC;AACF;AAKA,SAAS,oBAAoB,MAAA,EAAwD;AACnF,EAAA,MAAM,IAAA,GAAO,mBAAA;AAEb,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IACvC,OAAA,EAAS,MAAA,EAAQ,OAAA,IAAW,IAAA,CAAK,OAAA;AAAA,IACjC,aAAa,MAAA,EAAQ,WAAA,IAAe,CAAC,GAAG,KAAK,WAAW,CAAA;AAAA,IACxD,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,MAAA,EAAQ,eAAA,EAAiB,OAAA,IAAW,KAAK,eAAA,CAAgB,OAAA;AAAA,MAClE,MAAA,EAAQ,MAAA,EAAQ,eAAA,EAAiB,MAAA,IAAU,KAAK,eAAA,CAAgB;AAAA;AAClE,GACF;AACF;AAKA,SAAS,kBAAA,CACP,QACA,OAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,kBAAA;AACb,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,GAAA,IAAO,QAAQ,GAAA,EAAI;AAElE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,QAAQ,SAAA,GAAYA,wBAAA,CAAK,QAAQ,SAAA,EAAW,MAAA,CAAO,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AAAA,IAChF,SAAA,EAAW,QAAQ,SAAA,GAAYA,wBAAA,CAAK,QAAQ,SAAA,EAAW,MAAA,CAAO,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AAAA,IAChF,SAAA,EAAW,MAAA,EAAQ,SAAA,IAAa,IAAA,CAAK,SAAA;AAAA,IACrC,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IACvC,QAAA,EAAU,MAAA,EAAQ,QAAA,IAAY,IAAA,CAAK,QAAA;AAAA,IACnC,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,IAAA,CAAK;AAAA,GACjC;AACF;AAKA,SAAS,mBAAA,CACP,QACA,OAAA,EACsB;AACtB,EAAA,MAAM,IAAA,GAAO,mBAAA;AACb,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,GAAA,IAAO,QAAQ,GAAA,EAAI;AAGlE,EAAA,MAAM,aAAa,CAAC,GAAA,KAAwBA,wBAAA,CAAK,OAAA,CAAQ,WAAW,GAAG,CAAA;AAGvE,EAAA,MAAM,gBAAgB,IAAI,GAAA,CAAI,OAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAC,CAAA;AAC7D,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,KAAA,MAAW,CAAC,QAAQ,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAC7D,MAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,QAAA,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,WAAA,CAAY,aAAa,CAAA;AAGnD,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAAoB;AACrD,EAAA,IAAI,QAAQ,iBAAA,EAAmB;AAC7B,IAAA,KAAA,MAAW,CAAC,MAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,iBAAiB,CAAA,EAAG;AACvE,MAAA,oBAAA,CAAqB,GAAA,CAAI,IAAA,EAAM,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,IACrD;AAAA,EACF;AACA,EAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,WAAA,CAAY,oBAAoB,CAAA;AAGjE,EAAA,MAAM,6BAA6B,MAAA,EAAQ,yBAAA,IAA6B,EAAC,EAAG,IAAI,UAAU,CAAA;AAC1F,EAAA,MAAM,4BAA4B,MAAA,EAAQ,wBAAA,IAA4B,EAAC,EAAG,IAAI,UAAU,CAAA;AACxF,EAAA,MAAM,oBAAoB,MAAA,EAAQ,gBAAA,IAAoB,EAAC,EAAG,IAAI,UAAU,CAAA;AAExE,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IAC/B,WAAW,MAAA,EAAQ,SAAA,GAAY,WAAW,MAAA,CAAO,SAAS,IAAI,IAAA,CAAK,SAAA;AAAA,IACnE,gBAAgB,MAAA,EAAQ,cAAA,GACpB,WAAW,MAAA,CAAO,cAAc,IAChC,IAAA,CAAK,cAAA;AAAA,IACT,gBAAgB,MAAA,EAAQ,cAAA,IAAkB,CAAC,GAAG,KAAK,cAAc,CAAA;AAAA,IACjE,iBAAA;AAAA,IACA,WAAW,MAAA,EAAQ,SAAA,GAAY,WAAW,MAAA,CAAO,SAAS,IAAI,IAAA,CAAK,SAAA;AAAA,IACnE,UAAA;AAAA,IACA,iBAAiB,EAAE,GAAG,KAAK,eAAA,EAAiB,GAAG,QAAQ,eAAA,EAAgB;AAAA,IACvE,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IAC/B,SAAS,MAAA,EAAQ,OAAA,IAAW,CAAC,GAAG,KAAK,OAAO,CAAA;AAAA,IAC5C,yBAAA;AAAA,IACA,wBAAA;AAAA,IACA,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IACvC,YAAA,EAAc,MAAA,EAAQ,YAAA,IAAgB,IAAA,CAAK,YAAA;AAAA,IAC3C,kBAAkB,MAAA,EAAQ,gBAAA;AAAA,IAC1B,MAAA,EAAQ,mBAAA,CAAoB,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC1C,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,EAAC;AAAA,IACnC,aAAA,EAAe,MAAA,EAAQ,aAAA,IAAiB,EAAC;AAAA,IACzC,aAAA,EAAe,MAAA,EAAQ,aAAA,IAAiB,EAAC;AAAA,IACzC,OAAA,EAAS,MAAA,EAAQ,OAAA,IAAW,EAAC;AAAA,IAC7B,cAAc,MAAA,EAAQ,YAAA;AAAA,IACtB,kBAAkB,MAAA,EAAQ,gBAAA;AAAA,IAC1B,sBAAsB,MAAA,EAAQ,oBAAA;AAAA,IAC9B,iBAAiB,MAAA,EAAQ,eAAA;AAAA,IACzB,gBAAA,EAAkB,MAAA,EAAQ,gBAAA,IAAoB,IAAA,CAAK,gBAAA;AAAA,IACnD,YAAA,EAAc,MAAA,EAAQ,YAAA,IAAgB,IAAA,CAAK,YAAA;AAAA,IAC3C,kBAAA,EAAoB,MAAA,EAAQ,kBAAA,IAAsB,IAAA,CAAK,kBAAA;AAAA,IACvD,KAAA,EAAO,MAAA,EAAQ,KAAA,IAAS,IAAA,CAAK,KAAA;AAAA,IAC7B,gBAAA;AAAA,IACA,UAAU,MAAA,EAAQ;AAAA,GACpB;AACF;AASA,SAAS,cAAA,CAAe,QAAoB,SAAA,EAA4C;AACtF,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,SAAA,CAAU,MAAA,GAAS,EAAE,GAAG,MAAA,CAAO,MAAA,EAAQ,GAAG,SAAA,CAAU,MAAA,EAAO,GAAI,MAAA,CAAO,MAAA;AAAA,IAC9E,KAAA,EAAO,SAAA,CAAU,KAAA,GAAQ,EAAE,GAAG,MAAA,CAAO,KAAA,EAAO,GAAG,SAAA,CAAU,KAAA,EAAM,GAAI,MAAA,CAAO,KAAA;AAAA,IAC1E,MAAA,EAAQ,SAAA,CAAU,MAAA,GAAS,EAAE,GAAG,MAAA,CAAO,MAAA,EAAQ,GAAG,SAAA,CAAU,MAAA,EAAO,GAAI,MAAA,CAAO;AAAA,GAChF;AACF;AAyBO,SAAS,cACd,MAAA,GAAqB,EAAC,EACtB,OAAA,GAA0B,EAAC,EACX;AAEhB,EAAA,MAAM,eAAe,OAAA,CAAQ,SAAA,GAAY,eAAe,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA,GAAI,MAAA;AAErF,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,GAAA,IAAO,QAAQ,GAAA,EAAI;AAElE,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,mBAAA,CAAoB,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AAAA,IACxD,MAAA,EAAQ,mBAAA,CAAoB,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA;AAAA,IACxD,KAAA,EAAO,kBAAA,CAAmB,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AAAA,IACrD;AAAA,GACF;AACF;AAmBO,SAAS,gBAAgB,OAAA,EAAmC;AACjE,EAAA,IAAI,SAAqB,EAAC;AAE1B,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAA,GAAS,cAAA,CAAe,QAAQ,MAAM,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,oBAAA,CAAqB,OAAA,GAAmC,EAAC,EAAmB;AAC1F,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,aAAA,CAAc,MAAA;AAAA,IACxC,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,aAAA,CAAc,MAAA;AAAA,IACxC,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,aAAA,CAAc,KAAA;AAAA,IACtC,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,GAAA,EAAI;AAAA,IAC5C,YAAY,OAAA,CAAQ;AAAA,GACtB;AACF;;;ACxPA,IAAM,WAAA,GAAc,MAAA;AAKb,IAAM,iBAAA,GAAoB;AAAA,EAC/B,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AAYA,SAAS,eAAe,OAAA,EAAgD;AACtE,EAAA,OAAOC,wBAAY,WAAA,EAAa;AAAA,IAC9B,YAAA,EAAc,iBAAA;AAAA,IACd,SAAS,OAAA,EAAS,OAAA;AAAA,IAClB,WAAA,EAAa;AAAA,GACd,CAAA;AACH;AAQA,SAAS,mBAAmB,OAAA,EAAoD;AAC9E,EAAA,OAAOC,4BAAgB,WAAA,EAAa;AAAA,IAClC,YAAA,EAAc,iBAAA;AAAA,IACd,SAAS,OAAA,EAAS,OAAA;AAAA,IAClB,WAAA,EAAa;AAAA,GACd,CAAA;AACH;AAgCA,eAAsB,UAAA,CAAW,OAAA,GAA6B,EAAC,EAA8B;AAC3F,EAAA,MAAM,EAAE,MAAM,OAAA,CAAQ,GAAA,IAAO,UAAA,EAAY,SAAA,EAAW,QAAA,GAAW,KAAA,EAAM,GAAI,OAAA;AACzE,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,aAAyB,EAAC;AAC9B,EAAA,IAAI,kBAAA;AAGJ,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,QAAA,GAAW,eAAe,EAAE,OAAA,EAASF,yBAAK,OAAA,CAAQ,GAAG,GAAG,CAAA;AAC9D,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,MAAM,YAAA,GAAeA,yBAAK,UAAA,CAAW,UAAU,IAC3C,UAAA,GACAA,wBAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAA;AAChC,QAAA,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,CAAK,YAAY,CAAA;AAAA,MACjD,CAAA,MAAO;AAEL,QAAA,YAAA,GAAe,MAAM,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA;AAAA,MAC1C;AAEA,MAAA,IAAI,YAAA,IAAgB,CAAC,YAAA,CAAa,OAAA,EAAS;AACzC,QAAA,UAAA,GAAa,YAAA,CAAa,MAAA;AAC1B,QAAA,kBAAA,GAAqB,YAAA,CAAa,QAAA;AAAA,MACpC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,8BAAA,EAAiC,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,kBAAA,GAAqBA,wBAAAA,CAAK,OAAA,CAAQ,kBAAkB,CAAA,GAAI,GAAA;AAE1E,EAAA,MAAM,cAAA,GAAiB,cAAc,UAAA,EAAY;AAAA,IAC/C,GAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,cAAA;AAAA,IACR,UAAA,EAAY,kBAAA;AAAA,IACZ;AAAA,GACF;AACF;AAUA,eAAsB,gBAAA,CAAiB,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EAAgC;AAC/F,EAAA,MAAM,WAAW,cAAA,EAAe;AAEhC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA;AACxC,IAAA,OAAO,MAAA,EAAQ,QAAA;AAAA,EACjB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAOO,SAAS,gBAAA,GAAyB;AACvC,EAAA,MAAM,WAAW,cAAA,EAAe;AAChC,EAAA,QAAA,CAAS,WAAA,EAAY;AACvB;AAWO,SAAS,cAAA,CAAe,OAAA,GAA6B,EAAC,EAAqB;AAChF,EAAA,MAAM,EAAE,MAAM,OAAA,CAAQ,GAAA,IAAO,UAAA,EAAY,SAAA,EAAW,QAAA,GAAW,KAAA,EAAM,GAAI,OAAA;AACzE,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,aAAyB,EAAC;AAC9B,EAAA,IAAI,kBAAA;AAGJ,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,QAAA,GAAW,mBAAmB,EAAE,OAAA,EAASA,yBAAK,OAAA,CAAQ,GAAG,GAAG,CAAA;AAElE,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,MAAM,YAAA,GAAeA,yBAAK,UAAA,CAAW,UAAU,IAC3C,UAAA,GACAA,wBAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAA;AAChC,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,YAAY,CAAA;AAEzC,QAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS;AAC7B,UAAA,UAAA,GAAa,MAAA,CAAO,MAAA;AACpB,UAAA,kBAAA,GAAqB,MAAA,CAAO,QAAA;AAAA,QAC9B;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA;AAElC,QAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS;AAC7B,UAAA,UAAA,GAAa,MAAA,CAAO,MAAA;AACpB,UAAA,kBAAA,GAAqB,MAAA,CAAO,QAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,8BAAA,EAAiC,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,kBAAA,GAAqBA,wBAAAA,CAAK,OAAA,CAAQ,kBAAkB,CAAA,GAAI,GAAA;AAE1E,EAAA,MAAM,cAAA,GAAiB,cAAc,UAAA,EAAY;AAAA,IAC/C,GAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,cAAA;AAAA,IACR,UAAA,EAAY,kBAAA;AAAA,IACZ;AAAA,GACF;AACF;AA+BO,SAAS,aAAa,MAAA,EAAgC;AAC3D,EAAA,OAAO,MAAA;AACT;AA0BO,SAAS,kBAAkB,QAAA,EAA0D;AAC1F,EAAA,OAAO,QAAA,EAAS;AAClB;;;ACpRA,SAAS,aAAa,KAAA,EAAgD;AACpE,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAE5C,EAAA,IAAI,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,GAAA,IAAO,eAAe,KAAA,EAAO;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,KAAe,OAAA,IAAW,UAAA,KAAe,GAAA,IAAO,eAAe,IAAA,EAAM;AACvE,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,YAAY,KAAA,EAA+C;AAClE,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,MAAA,GAAY,GAAA;AACzC;AAQA,SAAS,WAAW,KAAA,EAAiD;AACnE,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AAC9C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA,CACzB,MAAA,CAAO,OAAO,CAAA;AACnB;AASA,SAAS,cAAA,CAAe,GAAA,EAA8BA,KAAAA,EAAc,KAAA,EAAsB;AACxF,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE5B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,MAAA,MAAA,CAAO,cAAA,CAAe,KAAK,GAAA,EAAK;AAAA,QAC9B,KAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,KAAA,EAAO,MAAM,CAAA,GAAI,KAAA;AACxB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,MAAA,KAAW,MAAA,EAAW;AAC/C,MAAA,IAAI,EAAE,SAAS,GAAA,CAAA,EAAM;AACnB,QAAA,MAAA,CAAO,cAAA,CAAe,KAAK,KAAA,EAAO;AAAA,UAChC,OAAO,EAAC;AAAA,UACR,QAAA,EAAU,IAAA;AAAA,UACV,UAAA,EAAY,IAAA;AAAA,UACZ,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,MAAM,MAAA,GAAS,IAAI,KAAK,CAAA;AACxB,MAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,MAAA,EAAQ;AAAA,QACpC,KAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA,GAAI,KAAA;AAC/B,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,MAAA,KAAW,MAAA,IAAa,UAAU,MAAA,EAAW;AACtE,MAAA,IAAI,EAAE,SAAS,GAAA,CAAA,EAAM;AACnB,QAAA,MAAA,CAAO,cAAA,CAAe,KAAK,KAAA,EAAO;AAAA,UAChC,OAAO,EAAC;AAAA,UACR,QAAA,EAAU,IAAA;AAAA,UACV,UAAA,EAAY,IAAA;AAAA,UACZ,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,MAAM,OAAA,GAAU,IAAI,KAAK,CAAA;AACzB,MAAA,IAAI,EAAE,UAAU,OAAA,CAAA,EAAU;AACxB,QAAA,MAAA,CAAO,cAAA,CAAe,SAAS,MAAA,EAAQ;AAAA,UACrC,OAAO,EAAC;AAAA,UACR,QAAA,EAAU,IAAA;AAAA,UACV,UAAA,EAAY,IAAA;AAAA,UACZ,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AACA,MAAA,MAAM,OAAA,GAAU,QAAQ,MAAM,CAAA;AAC9B,MAAA,MAAA,CAAO,cAAA,CAAe,SAAS,KAAA,EAAO;AAAA,QACpC,KAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,UAAA,EAAY,IAAA;AAAA,QACZ,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAGF;AA0BO,SAAS,gBAAA,CAAiB,OAAA,GAA2B,EAAC,EAAwB;AACnF,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA;AACnC,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,OAAA;AAEjC,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE9D,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA,EAAG;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,MAAM,CAAA;AAC3B,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA;AAGJ,IAAA,IAAI,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9B,MAAA,WAAA,GAAc,aAAa,QAAQ,CAAA;AAAA,IACrC,CAAA,MAAA,IAAW,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,EAAG;AACpC,MAAA,WAAA,GAAc,YAAY,QAAQ,CAAA;AAAA,IACpC,CAAA,MAAA,IAAW,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,EAAG;AACnC,MAAA,WAAA,GAAc,WAAW,QAAQ,CAAA;AAAA,IACnC,CAAA,MAAO;AAEL,MAAA,WAAA,GAAc,QAAA;AAAA,IAChB;AAGA,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,MAAA,cAAA,CAAe,MAAA,EAAQ,YAAY,WAAW,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,IAAA,CAAK,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAc;AAClE,EAAA,OACE,GAAA,CAAI,IAAI,CAAA,KAAM,MAAA,IACd,IAAI,wBAAwB,CAAA,KAAM,MAAA,IAClC,GAAA,CAAI,gBAAgB,CAAA,KAAM,MAAA,IAC1B,GAAA,CAAI,WAAW,MAAM,MAAA,IACrB,GAAA,CAAI,UAAU,CAAA,KAAM,MAAA,IACpB,GAAA,CAAI,QAAQ,CAAA,KAAM,UAClB,GAAA,CAAI,WAAW,CAAA,KAAM,MAAA,IACrB,IAAI,aAAa,CAAA,KAAM,MAAA,IACvB,GAAA,CAAI,UAAU,CAAA,KAAM,MAAA;AAExB;AAQO,SAAS,mBAAA,CAAoB,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAc;AACjF,EAAA,OAAO,GAAA,CAAI,UAAU,CAAA,KAAM,MAAA,IAAa,GAAA,CAAI,aAAa,CAAA,KAAM,GAAA,IAAO,GAAA,CAAI,MAAM,CAAA,KAAM,MAAA;AACxF;AAUO,SAAS,kBAAA,CAAmB,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAAyB;AAC3F,EAAA,MAAM,YAAA,GAAe,IAAI,gBAAgB,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,IAAI,YAAY,CAAA;AAClC,EAAA,MAAM,KAAA,GAAQ,IAAI,OAAO,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,IAAI,SAAS,CAAA;AAG7B,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,KAAc,MAAA,IAAU,KAAA,EAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACnD,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,eAAA,CAAgB,GAAA,GAAyB,OAAA,CAAQ,GAAA,EAA0B;AACzF,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,EAAE,GAAA,EAAK,CAAA;AAGvC,EAAA,IAAI,IAAA,CAAK,GAAG,CAAA,IAAK,CAAC,OAAO,MAAA,EAAQ;AAC/B,IAAA,MAAA,CAAO,MAAA,GAAS,EAAE,KAAA,EAAO,KAAA,EAAM;AAAA,EACjC;AAGA,EAAA,MAAM,QAAA,GAAW,mBAAmB,GAAG,CAAA;AACvC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAA,CAAO,MAAA,GAAS;AAAA,MACd,GAAG,MAAA,CAAO,MAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACrPO,SAAS,oBAAA,CAAqB,QAAiB,QAAA,EAAmC;AACvF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,cAAwB,EAAC;AAG/B,EAAA,IAAI,QAAA,EAAU,QAAA,CAAS,oBAAoB,CAAA,EAAG;AAC5C,IAAA,QAAA,CAAS,KAAK,sEAAsE,CAAA;AACpF,IAAA,WAAA,CAAY,KAAK,uEAAuE,CAAA;AAExF,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAA,EAAgB,eAAA;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,oBAAA,CAAqB,MAAM,CAAA,EAAG;AAChC,IAAA,QAAA,CAAS,KAAK,uEAAuE,CAAA;AACrF,IAAA,WAAA,CAAY,KAAK,oDAAoD,CAAA;AAErE,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA;AAAA,MAChB,cAAA,EAAgB,eAAA;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,KAAA;AAAA,IAChB,cAAA,EAAgB,SAAA;AAAA,IAChB,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,SAAS,qBAAqB,MAAA,EAA+C;AAC3E,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,MAAA;AAIZ,EAAA,OACE,OAAO,GAAA,CAAI,QAAQ,CAAA,KAAM,QAAA,IACxB,OAAO,GAAA,CAAI,QAAQ,CAAA,KAAM,QAAA,IAAY,EAAE,WAAA,IAAe,GAAA,CAAA;AAE3D;AAkBO,SAAS,0BAA0B,MAAA,EAAwC;AAChF,EAAA,MAAM,SAAuB,EAAC;AAG9B,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,WAAW,IAAA,EAAM;AACzD,IAAA,MAAA,CAAO,YAAY,MAAA,CAAO,MAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,WAAW,IAAA,EAAM;AACzD,IAAA,MAAA,CAAO,YAAY,MAAA,CAAO,MAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,WAAW,IAAA,EAAM;AACzD,IAAA,MAAA,CAAO,SAAS,MAAA,CAAO,MAAA;AAAA,EACzB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,EAAG;AAEjC,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAM,IAAA,EAAM,MAAA,EAAQ,WAAW,KAAK,CAAA;AACzE,IAAA,MAAA,CAAO,OAAA,GAAU,OAAO,OAAA,CAAQ,MAAA;AAAA,MAAO,CAAC,CAAA,KACtC,YAAA,CAAa,QAAA,CAAS,CAAkC;AAAA,KAC1D;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,WAAW,IAAA,EAAM;AACzD,IAAA,MAAA,CAAO,MAAA,GAAS;AAAA,MACd,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,OAAA,IAAW;AAAA;AAAA,KAEpC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAiBO,SAAS,aAAA,CACd,QACA,QAAA,EAC4C;AAC5C,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,MAAA,EAAQ,QAAQ,CAAA;AAEnD,EAAA,IAAI,CAAC,MAAM,cAAA,EAAgB;AACzB,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA,EACF;AAEA,EAAA,QAAQ,MAAM,cAAA;AAAgB,IAC5B,KAAK,eAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,0BAA0B,MAA4B,CAAA;AAAA,QAC9D,UAAU,KAAA,CAAM;AAAA,OAClB;AAAA,IAEF;AACE,MAAA,OAAO;AAAA,QACL,MAAA;AAAA,QACA,QAAA,EAAU,CAAC,GAAG,KAAA,CAAM,UAAU,sCAAsC;AAAA,OACtE;AAAA;AAEN;AAYO,SAAS,uBAAuB,MAAA,EAA8B;AACnE,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,MAAM,SAAA,GAAY,MAAA;AAClB,EAAA,MAAM,MAAA,GAAS,UAAU,QAAQ,CAAA;AAEjC,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,CAAA,gFAAA;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,YAAY,MAAA,IAAU,OAAO,MAAA,CAAO,QAAQ,MAAM,QAAA,EAAU;AAC9D,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,CAAA,oGAAA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AASO,SAAS,uBAAA,CAAwB,YAAqB,SAAA,EAA+B;AAC1F,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,MAAM,GAAI,CAAA;AAEvD,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,4BAAA,EAWqB,UAAA,CAAW,OAAA,CAAQ,aAAA,EAAe,KAAK,CAAC,CAAA;AAAA,CAAA;AAEtE;;;ACtMO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;AA2aO,SAAS,YAAY,GAAA,EAAgC;AAC1D,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,IAAY,GAAA;AACrB;AAKO,SAAS,cAAc,GAAA,EAAkC;AAC9D,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,IAAW,GAAA,IAAO,EAAE,QAAA,IAAY,GAAA,CAAA;AACzC;AAKO,SAAS,QAAQ,GAAA,EAA4B;AAClD,EAAA,OAAO,WAAA,CAAY,GAAG,CAAA,IAAK,aAAA,CAAc,GAAG,CAAA;AAC9C;AAKO,SAAS,iBAAiB,IAAA,EAAiC;AAChE,EAAA,OAAO,iBAAA,CAAkB,SAAS,IAAiB,CAAA;AACrD;AAKO,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,WAAW,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AACjF;AASO,SAAS,cAAc,KAAA,EAAuB;AACnD,EAAA,OAAO,WAAA,CAAY,KAAK,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AACnD;AAKO,SAAS,aAAa,KAAA,EAAkC;AAC7D,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AACA,EAAA,OAAQ,KAAA,CAAsB,IAAA;AAChC;AAKO,SAAS,oBAAoB,KAAA,EAAkC;AACpE,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA,CAAM,YAAA;AAAA,EACf;AACA,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,OAAO,MAAA,CAAO,eAAe,MAAA,CAAO,OAAA;AACtC;AAKO,SAAS,YAAY,KAAA,EAA+B;AACzD,EAAA,MAAM,IAAA,GAAkB;AAAA,IACtB,QAAQ,KAAA,CAAM;AAAA,GAChB;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,gBAAA,CAAiB,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9C,IAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,IAAA;AAAA,EACrB;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,OAAA;AACxC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAEA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,oBAAoB,GAAA,EAA8B;AAChE,EAAA,IAAI,CAAC,gBAAA,CAAiB,GAAG,CAAA,EAAG;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC7B,EAAA,OAAO,KAAA,CAAM,MAAM,GAAG,CAAA;AACxB;ACplBA,IAAM,iBAAA,GAAoB,6CAAA;AAG1B,IAAM,WAAA,GAAc,cAAA;AAGpB,IAAM,WAAA,GAAc,cAAA;AAGpB,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,aAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKD,SAAS,aAAa,KAAA,EAAwB;AAE5C,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,EAAG;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAOA,IAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,EAC1B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKD,SAAS,iBAAiB,KAAA,EAAwB;AAEhD,EAAA,IAAI,UAAU,GAAA,EAAK;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAClC,EAAA,IAAI,SAAA,KAAc,GAAA,IAAO,SAAA,KAAc,GAAA,EAAK;AAC1C,IAAA,CAAA,GAAI,CAAA;AAAA,EACN;AACA,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,OAAO,CAAA,GAAI,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA;AAC7B,IAAA,IAAI,IAAA,IAAQ,GAAA,IAAO,IAAA,IAAQ,GAAA,EAAK;AAC9B,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAA,IAAW,IAAA,KAAS,GAAA,IAAO,CAAC,MAAA,EAAQ;AAClC,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,CAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,CAAC,EAAE,WAAA,EAAY;AAE1C,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,WAAA,CAAY,IAAI,IAAI,CAAA;AAC7B;AASA,SAAS,mBAAA,CACPA,KAAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,cAAc,KAAK,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,aAAa,KAAK,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,YAAY,KAAK,CAAA;AAGhC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,uEAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,oBAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,8BAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV;AAAA,KACD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,6BAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,UAAA,EAAY,mCAAmC,iBAAA,CAAkB,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,GAAA;AAAA,KACxF,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAClC,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,wBAAwB,IAAI,CAAA,CAAA,CAAA;AAAA,MACrC,QAAA,EAAU,SAAA;AAAA,MACV,KAAA,EAAO,IAAA;AAAA,MACP,UAAA,EAAY,CAAA,aAAA,EAAgB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACzD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,EAAU;AACrC,IAAA,kBAAA,CAAmBA,KAAAA,EAAM,KAAA,EAAO,IAAA,EAAmB,MAAM,CAAA;AAAA,EAC3D;AACF;AAKA,SAAS,kBAAA,CACPA,KAAAA,EACA,KAAA,EACA,IAAA,EACA,MAAA,EACM;AACN,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,OAAA;AACH,MAAA,IAAI,CAAC,YAAA,CAAa,KAAK,CAAA,EAAG;AACxB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,yBAAyB,KAAK,CAAA,CAAA,CAAA;AAAA,UACvC,QAAA,EAAU,OAAA;AAAA,UACV,KAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,IAAI,CAAC,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC5B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,6BAA6B,KAAK,CAAA,CAAA,CAAA;AAAA,UAC3C,QAAA,EAAU,OAAA;AAAA,UACV,KAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC7B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,8BAA8B,KAAK,CAAA,CAAA,CAAA;AAAA,UAC5C,QAAA,EAAU,OAAA;AAAA,UACV,KAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AACA,MAAA;AAKA;AAEN;AAKA,SAAS,kBAAkB,KAAA,EAAwB;AAEjD,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAClC,EAAA,IAAI,CAAC,OAAO,KAAA,CAAM,OAAO,KAAK,OAAA,IAAW,CAAA,IAAK,WAAW,GAAA,EAAM;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAAU,MAAA,EAAQ,WAAW,QAAQ,CAAA;AACvD,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AASA,SAAS,kBAAA,CACP,UAAA,EACA,QAAA,EACA,MAAA,EACA,UACA,UAAA,EACM;AACN,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAErD,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAMA,QAAO,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAE/C,IAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClB,MAAA,UAAA,CAAW,KAAA,IAAS,CAAA;AACpB,MAAA,mBAAA,CAAoBA,KAAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,MAAA,kBAAA,CAAmB,KAAA,EAA0BA,KAAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA;AAAA,IACjF;AAAA,EACF;AACF;AAKA,SAAS,YAAA,CACP,QAAA,EACA,MAAA,EACA,QAAA,EACQ;AACR,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUG,gBAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,MAAM,UAAA,GAAa,EAAE,KAAA,EAAO,CAAA,EAAE;AAE9B,IAAA,kBAAA,CAAmB,IAAA,EAAM,EAAA,EAAI,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA;AAEzD,IAAA,OAAO,UAAA,CAAW,KAAA;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,yBAAyB,YAAY,CAAA,CAAA;AAAA,MAC9C,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,CAAA;AAAA,EACT;AACF;AAKA,SAAS,aAAA,CAAc,GAAA,EAAa,KAAA,GAAkB,EAAC,EAAa;AAClE,EAAA,IAAI,CAACC,cAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAUC,gBAAY,GAAG,CAAA;AAC/B,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,QAAA,GAAWC,UAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AAChC,IAAA,MAAM,IAAA,GAAOC,aAAS,QAAQ,CAAA;AAE9B,IAAA,IAAI,IAAA,CAAK,aAAY,EAAG;AACtB,MAAA,aAAA,CAAc,UAAU,KAAK,CAAA;AAAA,IAC/B,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AAClC,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAyBA,eAAsB,cAAA,CACpB,MAAA,EACA,OAAA,GAA2B,EAAC,EACD;AAC3B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,EAAE,OAAA,GAAU,KAAA,EAAO,QAAQ,KAAA,EAAO,MAAA,GAAS,OAAM,GAAI,OAAA;AAE3D,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,cAAA,IAAkB,MAAA,CAAO,MAAA,CAAO,cAAA;AAE/D,EAAA,IAAI,CAACH,cAAA,CAAW,cAAc,CAAA,EAAG;AAC/B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,cAAA;AAAA,UACN,OAAA,EAAS,sCAAA;AAAA,UACT,QAAA,EAAU;AAAA;AACZ,OACF;AAAA,MACA,UAAU,EAAC;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW,CAAA;AAAA,MACX,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KACzB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,cAAc,cAAc,CAAA;AAE9C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAA,CAAQ,CAAA,WAAA,EAAc,SAAA,CAAU,MAAM,CAAA,eAAA,CAAiB,CAAA;AAAA,EACzD;AAGA,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,SAAA,IAAa,CAAA;AACb,IAAA,MAAM,YAAA,GAAeI,cAAA,CAAS,cAAA,EAAgB,IAAI,CAAA;AAElD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,CAAS,CAAA,YAAA,EAAe,YAAY,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AACtD,IAAA,WAAA,IAAe,UAAA;AAAA,EACjB;AAGA,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,MAAA,KAAW,KAAK,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,MAAA,CAAO,MAAA,KAAW,CAAA;AAGxF,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,UAAA,CAAW,CAAA,UAAA,EAAa,WAAW,CAAA,WAAA,EAAc,SAAS,CAAA,MAAA,CAAQ,CAAA;AAClE,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,eAAA,CAAiB,CAAA;AAAA,MAC7C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAA,uBAAA,EAA0B,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA,EAAY,WAAA;AAAA,IACZ,SAAA;AAAA,IACA,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,GACzB;AACF;AAQA,eAAsB,iBAAA,CACpB,MAAA,EACA,OAAA,GAA2B,EAAC,EACb;AACf,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,MAAA,EAAQ,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,CAAA;AAEzE,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,OAAA,CAAQ,MAAM,CAAA,OAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IACnD;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,IAAA,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,EACxD;AACF;AAMA,SAAS,QAAQ,OAAA,EAAuB;AACtC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAC/B;AAEA,SAAS,SAAS,OAAA,EAAuB;AACvC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAM,OAAO,CAAA,CAAE,CAAA;AAC9B;AAEA,SAAS,WAAW,OAAA,EAAuB;AACzC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC7B;AAEA,SAAS,QAAQ,OAAA,EAAuB;AACtC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAC/B;AAEA,SAAS,SAAS,OAAA,EAAuB;AACvC,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC9B;AC5cA,IAAM,mBAAA,GAA2C;AAAA,EAC/C,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,IAAA;AAAA,IACX,KAAA,EAAO,CAAC,OAAA,EAAS,MAAM;AAAA,GACzB;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA,GAChB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA,GAChB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,CAAC,MAAM;AAAA;AAElB,CAAA;AASA,SAAS,kBAAA,CACPR,KAAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAK,CAAA,EAAG;AAEnB,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,IAAa,KAAA,CAAM,WAAW,IAAA,EAAM;AACvD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAAA,KAAAA;AAAA,QACA,OAAA,EAAS,0DAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,MAAA,IAAI,CAAC,gBAAA,CAAiB,KAAA,CAAM,KAAK,CAAA,EAAG;AAClC,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAAA,KAAAA;AAAA,UACA,OAAA,EAAS,CAAA,oBAAA,EAAuB,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,UAC3C,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,MAAA,IAAW,aAAA,CAAc,KAAK,CAAA,EAAG;AAC/B,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,UAAU,IAAA,EAAM;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAAA,KAAAA;AAAA,QACA,OAAA,EAAS,yDAAA;AAAA,QACT,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAGA,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,gFAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACF;AAKA,SAAS,iBAAA,CACP,GAAA,EACA,QAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAMA,QAAO,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAG/C,IAAA,IAAI,OAAA,CAAQ,KAAK,CAAA,EAAG;AAClB,MAAA,kBAAA,CAAmBA,KAAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AAEtD,MAAA,iBAAA,CAAkB,KAAA,EAAOA,KAAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACjD;AAAA,EACF;AACF;AAKA,SAAS,2BAAA,CACP,IAAA,EACA,cAAA,EACA,kBAAA,EACA,QACA,QAAA,EACa;AACb,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAGtC,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA;AAAA,IACtC,CAAC,CAAC,GAAG,CAAA,KAAM,IAAI,WAAA,EAAY,KAAM,eAAe,WAAA;AAAY,MAC1D,CAAC,CAAA;AAEL,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,wBAAwB,cAAc,CAAA,qBAAA,CAAA;AAAA,MAC/C,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAE1C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,IACxB;AAGA,IAAA,IAAI,kBAAA,CAAmB,SAAA,IAAa,kBAAA,CAAmB,KAAA,EAAO;AAC5D,MAAA,KAAA,MAAW,YAAA,IAAgB,mBAAmB,KAAA,EAAO;AACnD,QAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,EAAG;AACjC,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,GAAG,cAAc,CAAA,MAAA,CAAA;AAAA,YACvB,SAAS,CAAA,eAAA,EAAkB,YAAY,iCAAiC,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,YACxF,QAAA,EAAU;AAAA,WACX,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,UAAU,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AACnE,MAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC5C,QAAA,iBAAA,CAAkB,UAAU,CAAA,EAAG,cAAc,UAAU,QAAQ,CAAA,CAAA,EAAI,QAAQ,QAAQ,CAAA;AAAA,MACrF;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,iBAAA,CAAkB,UAAA,EAAY,cAAA,EAAgB,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,aAAA;AACT;AASO,SAAS,iBAAA,CACd,UACA,kBAAA,EACmD;AACnD,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,EAAA,IAAI,CAACI,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,gBAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,aAAA,EAAe,UAAA,EAAY,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EACtF;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUD,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,IAAA,GAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,yBAAyB,OAAO,CAAA,CAAA;AAAA,MACzC,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,aAAA,EAAe,UAAA,EAAY,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EACtF;AAGA,EAAA,IAAI,IAAA,KAAS,QAAQ,OAAO,IAAA,KAAS,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpE,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,oCAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,UAAU,aAAA,EAAe,UAAA,EAAY,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAAA,EACtF;AAGA,EAAA,MAAM,QAAA,GAAWM,cAAA,CAAS,QAAA,EAAUC,aAAA,CAAQ,QAAQ,CAAC,CAAA;AACrD,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AAG1E,EAAA,MAAMC,YAAAA,GAAc,CAAC,GAAA,KAAyB;AAC5C,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAChB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,EAAG;AACtC,MAAA,KAAA,IAASA,aAAY,KAAK,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAGA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,KAAA,GAAQ,2BAAA;AAAA,MACZ,IAAA;AAAA,MACA,cAAA;AAAA,MACA,kBAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,IACxB;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,QAAA,MAAM,UAAA,GAAa,KAAA;AACnB,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA,EAAG;AAChD,YAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,UACxB;AAAA,QACF;AACA,QAAA,iBAAA,CAAkB,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,UAAA,GAAaA,aAAY,IAAI,CAAA;AAE7B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,oBAAA,CAAqB,OAAA,GAAgC,EAAC,EAAwB;AAC5F,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,WAAA,GAAc,mBAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA8B;AAChD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,cAAA,GAAiB,CAAA;AAGrB,EAAA,MAAM,SAAA,GAAY,UAAA,IAAc,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,SAAA;AAEvD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,uCAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,IAAI,CAACP,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,mCAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,kBAAkB,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrE,IAAA,MAAM,QAAA,GAAWE,UAAAA,CAAK,SAAA,EAAW,kBAAA,CAAmB,KAAK,CAAA;AAEzD,IAAA,IAAI,CAACF,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,YAAA,CAAa,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,CAAA,uBAAA,EAA0B,kBAAA,CAAmB,KAAK,CAAA,WAAA,CAAA;AAAA,UAC3D,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,QAAA,EAAU,kBAAkB,CAAA;AAC7D,IAAA,KAAA,CAAM,GAAA,CAAI,mBAAmB,KAAA,EAAO;AAAA,MAClC,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,WAAW,MAAA,CAAO;AAAA,KACnB,CAAA;AAGD,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAC5B,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAChC,IAAA,eAAA,IAAmB,MAAA,CAAO,UAAA;AAC1B,IAAA,cAAA,IAAkB,MAAA,CAAO,SAAA;AACzB,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,aAAA,EAAe;AACvC,MAAA,aAAA,CAAc,IAAI,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgBC,eAAAA,CAAY,SAAS,CAAA,CAAE,MAAA;AAAA,MAC3C,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,IAAKE,YAAAA,CAASD,UAAAA,CAAK,SAAA,EAAW,CAAC,CAAC,CAAA,CAAE,MAAA;AAAO,KACpE;AACA,IAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AAE5E,IAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA,EAAG;AAC5B,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAMA,UAAAA,CAAK,SAAA,EAAW,IAAI,CAAA;AAAA,UAC1B,OAAA,EAAS,yCAAyC,IAAI,CAAA,CAAA;AAAA,UACtD,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,kBAAkB,MAAA,GAAS,CAAC,GAAG,MAAA,EAAQ,GAAG,QAAQ,CAAA,GAAI,MAAA;AAE5D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,gBAAgB,MAAA,KAAW,CAAA;AAAA,IAClC,MAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA,EAAY,eAAA;AAAA,IACZ,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,WAAA,CAAY,MAAmB,cAAA,EAAmC;AAChF,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,IAAA;AAAA,MACtC,CAAC,CAAC,GAAG,CAAA,KAAM,IAAI,WAAA,EAAY,KAAM,eAAe,WAAA;AAAY,QAC1D,CAAC,CAAA;AAEL,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAGA,EAAA,KAAA,MAAW,GAAG,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC5C,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,MAAM,UAAA,GAAa,KAAA;AACnB,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,OAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,MAAM,CAAA;AAChB;AASO,SAAS,gBAAA,CACd,UAAA,EACA,OAAA,GAAoD,EAAC,EAC5C;AACT,EAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,uCAAA,EAAqC,UAAU;AAAA,CAAI,CAAA;AAEhE,EAAA,MAAM,SAAS,oBAAA,CAAqB,EAAE,GAAG,OAAA,EAAS,YAAY,CAAA;AAG9D,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,UAAU,CAAA,IAAK,OAAO,KAAA,EAAO;AAC7C,IAAA,IAAI,WAAW,MAAA,CAAO,MAAA,KAAW,KAAK,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG;AACtE,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UAAA,EAAQ,IAAI,CAAA,CAAE,CAAA;AAC3B,MAAA,KAAA,MAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACrC,QAAA,OAAA,CAAQ,MAAM,CAAA,UAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,KAAA,MAAW,OAAA,IAAW,WAAW,QAAA,EAAU;AACzC,QAAA,OAAA,CAAQ,KAAK,CAAA,iBAAA,EAAU,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAClC,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,6BAAA,EAAwB,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,MAAA,CAAO,aAAA,CAAc,IAAA,GAAO,CAAA,EAAG;AACjC,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,0BAAA,EAAwB,CAAC,GAAG,MAAA,CAAO,aAAa,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7E;AAGA,EAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,EAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,CAAA;AAClC,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,OAAA,CAAQ,KAAK,oCAA+B,CAAA;AAAA,EAC9C,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,6BAAwB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,WAAA,EAAc,MAAA,CAAO,SAAS,MAAM,CAAA,WAAA;AAAA,KAClF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AC/eA,IAAM,8BAAc,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAGrE,SAAS,UAAU,GAAA,EAAsB;AACvC,EAAA,OAAO,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAC7B;AAKA,SAAS,cAAA,CAAe,QAAiB,IAAA,EAAyB;AAChE,EAAA,IAAI,OAAA,GAAmB,GAAA;AACvB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,YAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,IAAa,OAAO,YAAY,QAAA,EAAU;AAC5E,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,GAAG,CAAA,EAAG;AACnB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAW,QAAoC,GAAG,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,OAAA;AACT;AASA,SAAS,mBAAmB,KAAA,EAAe,MAAA,GAAmB,EAAC,EAAG,YAAY,EAAA,EAAa;AAEzF,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,aAAa,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GAAY,UAAU,WAAA,EAAY;AACxC,EAAA,IAAI,UAAU,QAAA,CAAS,SAAS,KAAK,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,EAAG;AACtE,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,cAAc,IAAA,EAAc,MAAA,GAAmB,EAAC,EAAG,YAAY,EAAA,EAAa;AAEnF,EAAA,IAAI,kBAAA,CAAmB,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA,EAAG;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA,KAAS,QAAA;AAClB;AAKO,SAAS,cAAA,CACd,KAAA,EACA,IAAA,EACA,OAAA,GAAiC,EAAC,EACzB;AAET,EAAA,IAAI,SAAS,QAAA,IAAY,OAAA,CAAQ,SAAA,IAAa,OAAO,UAAU,QAAA,EAAU;AACvE,IAAA,MAAM,QAAA,GAAW,KAAA;AACjB,IAAA,MAAM,QAAQ,OAAA,CAAQ,SAAA;AAGtB,IAAA,IAAI,MAAM,WAAA,EAAY,CAAE,SAAS,QAAA,CAAS,WAAA,EAAa,CAAA,EAAG;AACxD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA;AAAA,EAC9B;AAGA,EAAA,IACE,OAAO,KAAA,KAAU,QAAA,IACjB,kBAAA,CAAmB,IAAA,IAAQ,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA,EAChE;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,aAAA,CAAc,IAAA,IAAQ,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAE7F,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,OAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,EACjB;AAGA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,cAAc,SAAA,EAAsD;AAClF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAqC;AAAA,IACzC,MAAA,EAAQ,WAAA;AAAA,IACR,MAAA,EAAQ,YAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,OAAO,OAAA,CAAQ,SAAS,CAAA,IAAM,SAAA;AAChC;AAKO,SAAS,cAAA,CACd,UAAA,EACA,OAAA,GAAiC,EAAC,EAChB;AAClB,EAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,EAAU;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,UAAA;AAGjB,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,QAAQ,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,gBAAA,GAA0C;AAAA,IAC9C,GAAG,OAAA;AAAA,IACH,MAAA,EAAS,QAAA,CAAS,SAAS,CAAA,IAA8B;AAAC,GAC5D;AAEA,EAAA,MAAM,OAAA,GAAU,SAAS,OAAO,CAAA;AAChC,EAAA,MAAM,eAAA,GAAkB,cAAc,OAAO,CAAA;AAG7C,EAAA,MAAM,KAAA,GAAmB;AAAA,IACvB,QAAQ,cAAA,CAAe,QAAA,CAAS,QAAQ,CAAA,EAAG,SAAS,gBAAgB,CAAA;AAAA,IACpE,OAAO,eAAA,IAAmB;AAAA,GAC5B;AAGA,EAAA,IAAI,SAAS,cAAc,CAAA,IAAK,OAAO,QAAA,CAAS,cAAc,MAAM,QAAA,EAAU;AAC5E,IAAA,KAAA,CAAM,YAAA,GAAe,SAAS,cAAc,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,SAAS,aAAa,CAAA,IAAK,OAAO,QAAA,CAAS,aAAa,MAAM,QAAA,EAAU;AAC1E,IAAA,KAAA,CAAM,WAAA,GAAc,SAAS,aAAa,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,mBACd,GAAA,EACA,SAAA,GAAY,EAAA,EACZ,OAAA,GAAiD,EAAC,EACzB;AACzB,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACjE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AAEzE,IAAA,MAAM,cAAc,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAGxD,IAAA,MAAM,YAAA,GAAsC;AAAA,MAC1C,GAAI,OAAA,CAAQ,GAAG,CAAA,IAAK,EAAC;AAAA,MACrB,SAAA,EAAW;AAAA,KACb;AACA,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,KAAA,EAAO,YAAY,CAAA;AAEtD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,IAChB,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AAEtD,MAAA,MAAM,MAAA,GAAS,kBAAA;AAAA,QACb,KAAA;AAAA,QACA,WAAA;AAAA,QACC,OAAA,CAAQ,GAAG,CAAA,IAA+C;AAAC,OAC9D;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AASA,SAAS,kBAAA,CAAmB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACtF,EAAA,MAAM,YAAY,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,UAAU,OAAO,CAAA;AAErF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,IAAI,CAAA,KAAA,CAAO,CAAA;AACpD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,mBAAmB,SAAS;AAAA,GACrC;AACF;AAKA,SAAS,kBAAA,CAAmB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACtF,EAAA,MAAM,YAAY,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,UAAU,OAAO,CAAA;AAErF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,IAAI,CAAA,KAAA,CAAO,CAAA;AACpD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,mBAAmB,SAAS;AAAA,GACrC;AACF;AAKA,SAAS,qBAAA,CAAsB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACzF,EAAA,MAAM,WAAW,cAAA,CAAe,IAAA,EAAM,YAAA,EAAc,OAAA,EAAS,MAAM,UAAU,CAAA;AAE7E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4BAAA,EAA+B,IAAI,CAAA,KAAA,CAAO,CAAA;AACvD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,mBAAmB,QAAQ;AAAA,GACvC;AACF;AAKA,SAAS,oBAAA,CAAqB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACxF,EAAA,MAAM,UAAU,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,UAAU,SAAS,CAAA;AAErF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAI,CAAA,KAAA,CAAO,CAAA;AACtD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,mBAAmB,OAAO;AAAA,GACrC;AACF;AAKA,SAAS,uBAAA,CAAwB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AAC3F,EAAA,MAAM,aAAa,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,UAAU,YAAY,CAAA;AAE3F,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8BAAA,EAAiC,IAAI,CAAA,KAAA,CAAO,CAAA;AACzD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,mBAAmB,UAAU;AAAA,GAC3C;AACF;AAKA,SAAS,oBAAA,CAAqB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACxF,EAAA,MAAM,UAAU,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,UAAU,SAAS,CAAA;AAErF,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,2BAAA,EAA8B,IAAI,CAAA,KAAA,CAAO,CAAA;AACtD,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,mBAAmB,OAAO;AAAA,GACrC;AACF;AAKA,SAAS,mBAAA,CAAoB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACvF,EAAA,MAAM,cAAc,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,WAAW,OAAO,CAAA;AAExF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,IAAI,CAAA,KAAA,CAAO,CAAA;AAC3D,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,mBAAmB,WAAW;AAAA;AACvC,GACF;AACF;AAKA,SAAS,mBAAA,CAAoB,IAAA,EAAmB,IAAA,GAAO,OAAA,EAAkC;AACvF,EAAA,MAAM,cAAc,cAAA,CAAe,IAAA,EAAM,cAAc,OAAA,EAAS,IAAA,EAAM,WAAW,OAAO,CAAA;AAExF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gCAAA,EAAmC,IAAI,CAAA,KAAA,CAAO,CAAA;AAC3D,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,mBAAmB,WAAW;AAAA;AACvC,GACF;AACF;AAKA,SAAS,kBAAkB,IAAA,EAA4C;AACrE,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,YAAA,EAAc,SAAS,MAAM,CAAA;AAI/D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AACzC,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,UAAiD,EAAC;AACxD,EAAA,MAAM,UAAA,GAAa,KAAK,YAAY,CAAA;AACpC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACzC,MAAA,MAAM,SAAA,GAAY,WAAW,GAAG,CAAA;AAChC,MAAA,MAAM,UAAA,GAAa,YAAY,aAAa,CAAA;AAG5C,MAAA,MAAM,SAAA,GAAY,UAAA,GAAa,UAAU,CAAA,GAAI,WAAW,CAAA;AACxD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,EAAE,SAAA,EAAU;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,YAAY,kBAAA,CAAmB,IAAA,EAAM,IAAI,EAAE,UAAA,EAAY,SAGtD;AAAA,GACH;AACF;AAKA,SAAS,eAAe,IAAA,EAA4C;AAClE,EAAA,MAAM,OAAO,cAAA,CAAe,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,QAAQ,SAAS,CAAA;AAEvE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AACtC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,mBAAmB,IAAI;AAAA,GAClC;AACF;AAKA,SAAS,cAAc,IAAA,EAA4C;AAEjE,EAAA,MAAM,IAAA,GACJ,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,eAAe,CAAA,IAC/D,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAE1D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,OAAA,GAAiD;AAAA,IACrD,MAAA,EAAQ,EAAE,QAAA,EAAU,IAAA,EAAK;AAAA,IACzB,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA;AAAK,GACvB;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,kBAAA,CAAmB,IAAA,EAAM,EAAA,EAAI,OAAO;AAAA;AAC9C,GACF;AACF;AAKA,SAAS,mBAAmB,IAAA,EAA4C;AACtE,EAAA,MAAM,cAAc,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,aAAa,CAAA;AAEjF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AACzC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,WAAA,EAAa,mBAAmB,WAAW;AAAA;AAC7C,GACF;AACF;AAKA,SAAS,kBAAkB,IAAA,EAA4C;AACrE,EAAA,MAAM,YAAY,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,WAAW,CAAA;AAE7E,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,mBAAmB,SAAS;AAAA;AACzC,GACF;AACF;AAKA,SAAS,YAAY,IAAA,EAA4C;AAC/D,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,SAAS,MAAM,CAAA;AAG3D,EAAA,MAAM,IAAA,GAAO,OAAO,MAAM,CAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAEhC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,sBAAsB,CAAA;AACnC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,MAAA,GAA2F;AAAA,IAC/F,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,mBAAmB,IAAI;AAAA;AAC/B,GACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,GAAU,kBAAA,CAAmB,OAAO,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,eAAe,IAAA,EAA4C;AAClE,EAAA,MAAM,OAAO,cAAA,CAAe,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,QAAQ,SAAS,CAAA;AAIvE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,MAAA,GAAgD,EAAE,MAAA,EAAQ,EAAC,EAAE;AAEnE,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,MAAM,SAAA,GAAY,QAAQ,WAAW,CAAA;AACrC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,KAAA,GAAmB;AAAA,QACvB,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OACT;AAEA,MAAA,IAAI,UAAU,cAAc,CAAA,IAAK,OAAO,SAAA,CAAU,cAAc,MAAM,QAAA,EAAU;AAC9E,QAAA,KAAA,CAAM,YAAA,GAAe,UAAU,cAAc,CAAA;AAAA,MAC/C;AAEA,MAAA,IAAI,UAAU,aAAa,CAAA,IAAK,OAAO,SAAA,CAAU,aAAa,MAAM,QAAA,EAAU;AAC5E,QAAA,KAAA,CAAM,WAAA,GAAc,UAAU,aAAa,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AASA,IAAMM,oBAAAA,GAAyC;AAAA,EAC7C,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,kCAAA,EAAoC,SAAA,EAAW,kBAAA,EAAmB;AAAA,MAC1E,EAAE,IAAA,EAAM,gCAAA,EAAkC,SAAA,EAAW,oBAAA,EAAqB;AAAA,MAC1E,EAAE,IAAA,EAAM,mCAAA,EAAqC,SAAA,EAAW,uBAAA,EAAwB;AAAA,MAChF,EAAE,IAAA,EAAM,gCAAA,EAAkC,SAAA,EAAW,oBAAA,EAAqB;AAAA,MAC1E,EAAE,IAAA,EAAM,iCAAA,EAAmC,SAAA,EAAW,kBAAA,EAAmB;AAAA,MACzE,EAAE,IAAA,EAAM,kCAAA,EAAoC,SAAA,EAAW,qBAAA,EAAsB;AAAA,MAC7E,EAAE,IAAA,EAAM,+BAAA,EAAiC,SAAA,EAAW,mBAAA,EAAoB;AAAA,MACxE,EAAE,IAAA,EAAM,+BAAA,EAAiC,SAAA,EAAW,mBAAA;AAAoB;AAC1E,GACF;AAAA,EACA,UAAA,EAAY;AAAA,IACV,KAAA,EAAO,iBAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,kCAAA,EAAoC,SAAA,EAAW,mBAAmB;AAAA,GACtF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,+BAAA,EAAiC,SAAA,EAAW,gBAAgB;AAAA,GAChF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,gCAAA,EAAkC,SAAA,EAAW,eAAe;AAAA,GAChF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS;AAAA,MACP,EAAE,IAAA,EAAM,qCAAA,EAAuC,SAAA,EAAW,kBAAA,EAAmB;AAAA,MAC7E,EAAE,IAAA,EAAM,oCAAA,EAAsC,SAAA,EAAW,iBAAA,EAAkB;AAAA,MAC3E,EAAE,IAAA,EAAM,8BAAA,EAAgC,SAAA,EAAW,WAAA;AAAY;AACjE,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,SAAS,CAAC,EAAE,MAAM,8BAAA,EAAgC,SAAA,EAAW,gBAAgB;AAAA;AAEjF,CAAA;AASA,SAAS,UAAU,QAAA,EAAwB;AACzC,EAAA,MAAM,GAAA,GAAMC,cAAQ,QAAQ,CAAA;AAC5B,EAAA,IAAI,CAACT,cAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAAU,aAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,EACpC;AACF;AAKO,SAASC,YAAAA,CAAY,MAAmB,cAAA,EAAmC;AAChF,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,EAAM,cAAc,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,IAC1B;AACA,IAAA,OAAO,CAAC,MAAM,CAAA;AAAA,EAChB;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,MAAM,UAAA,GAAa,KAAA;AACnB,MAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,MAAM,CAAA;AAChB;AAKA,SAAS,cAAA,CACP,gBAAA,EACA,UAAA,EACA,WAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAYT,UAAAA,CAAK,UAAA,EAAY,YAAY,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiBA,UAAAA,CAAK,UAAA,EAAY,gBAAA,CAAiB,KAAK,CAAA;AAE9D,EAA6B;AAE3B,IAAA,IAAIF,cAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,IAAIA,cAAAA,CAAW,cAAc,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6CAAA,EAAsC,gBAAA,CAAiB,KAAK,CAAA,CAAE,CAAA;AAC3E,MAAA,OAAO,cAAA;AAAA,IACT;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAWF;AASO,SAAS,gBAAgB,OAAA,EAA4C;AAC1E,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAc,EAAC;AAAA,IACf,WAAA,GAAc,OAAA;AAAA,IACd,MAAA,GAAS,KAAA;AAAA,IACT,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,gBAAA,uBAAoC,GAAA,EAAI;AAC9C,EAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,qEAA8D,CAAA;AAC3E,IAAA,OAAA,CAAQ,KAAK,0BAAmB,CAAA;AAChC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAE,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,cAAc,CAAA,CAAE,CAAA;AACrD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iBAAA,EAAoB,WAAW,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,KAAK,CAAA,kBAAA,EAAqB,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,KAAK,uCAAuC,CAAA;AAAA,IACtD;AACA,IAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,EACjB;AAGA,EAAA,MAAM,gBAA0C,EAAC;AACjD,EAAA,MAAM,SAAA,GAAYE,UAAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AAC9C,EAAA,IAAIF,cAAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUD,gBAAAA,CAAa,SAAA,EAAW,OAAO,CAAA;AAC/C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAGpC,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,gBAAgB,KAAK,MAAA,CAAO,OAAA,CAAQS,oBAAmB,CAAA,EAAG;AAC1E,QAAA,MAAM,WAAA,GAAc,gBAAA;AACpB,QAAA,IAAI,YAAY,SAAA,EAAW;AACzB,UAAA,MAAM,cAAA,GAAiB,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAClE,UAAA,MAAM,KAAA,GAAQG,YAAAA,CAAY,SAAA,EAAW,cAAc,CAAA;AACnD,UAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,YAAA,aAAA,CAAc,cAAc,CAAA,GAAI,KAAA;AAChC,YAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,cAAA,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,CAAS,IAAA;AAAA,QACP,CAAA,8CAAA,EAAiD,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,OAC3G;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAC,cAAA,EAAgB,gBAAgB,KAAK,MAAA,CAAO,OAAA,CAAQH,oBAAmB,CAAA,EAAG;AACpF,IAAA,MAAM,WAAA,GAAc,gBAAA;AACpB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,cAAc,CAAA,cAAA,CAAgB,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,WAAA,EAAa,SAAkB,CAAA;AAGhE,IAAA,IAAI,CAACR,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAClD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAUD,gBAAAA,CAAa,SAAA,EAAW,OAAO,CAAA;AAC/C,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,kBAAkB,SAAS,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,OAC1F;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,cAAA,GAAiB,CAAC,WAAW,CAAA;AACjC,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,MAAM,cAAA,GAAiB,eAAe,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,cAAA,CAAe,KAAA,CAAM,CAAC,CAAA;AACtF,MAAA,IAAI,aAAA,CAAc,cAAc,CAAA,EAAG;AACjC,QAAA,cAAA,GAAiB,aAAA,CAAc,cAAc,CAAA,CAAE,MAAA,CAAO,CAAC,MAAM,CAAC,WAAA,CAAY,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MACvF,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQY,YAAAA,CAAY,IAAA,EAAM,cAAc,CAAA;AAC9C,QAAA,IAAI,MAAM,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/C,UAAA,cAAA,GAAiB,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,CAAC,WAAA,CAAY,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,MAAA,IAAU,YAAY,OAAA,EAAS;AACxC,MAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AAEjC,QAAA,IAAI,aAAa,MAAA,CAAO,IAAA;AACxB,QAAA,IAAI,WAAA,CAAY,SAAA,IAAa,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AACtD,UAAA,MAAM,GAAA,GAAML,aAAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAC/B,UAAA,MAAM,IAAA,GAAOD,cAAAA,CAAS,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACtC,UAAA,MAAM,GAAA,GAAMI,aAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAE/B,UAAA,IAAI,SAAS,WAAA,EAAa;AACxB,YAAA,UAAA,GAAaP,UAAAA,CAAK,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,WAAA,EAAa,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAAA,UAC9D;AAAA,QACF;AAEA,QAAA,MAAM,UAAA,GAAaA,UAAAA,CAAK,cAAA,EAAgB,UAAU,CAAA;AAElD,QAAA,IAAI;AAEF,UAAA,MAAM,MAAA,GAAS,WAAA,CAAY,SAAA,GACvB,MAAA,CAAO,SAAA,CAAU,MAAM,IAAI,CAAA,GAC3B,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AAEzB,UAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA;AACvC,UAAA,IAAI,eAAe,CAAA,EAAG;AACpB,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,wBAAA,EAA2B,UAAU,CAAA,EAAA,EAAK,IAAI,CAAA,MAAA,CAAQ,CAAA;AACpE,YAAA;AAAA,UACF;AAEA,UAAA,eAAA,IAAmB,UAAA;AAEnB,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,YAAA,SAAA,CAAU,UAAU,CAAA;AAGpB,YAAAU,iBAAA,CAAc,YAAY,CAAA,EAAG,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,OAAO,CAAA;AAAA,UAC3E;AAEA,UAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAE5B,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,WAAA,GAAc,SAAS,YAAA,GAAe,EAAA;AAC5C,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,CAAA,iBAAA,EAAe,UAAU,CAAA,EAAG,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,WAAW,CAAA;AAAA,aACzF;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,oBAAoB,UAAU,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,WAC7F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,mCAA8B,CAAA;AAC3C,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,4BAAA,EAA0B,cAAc,CAAA,CAAE,CAAA;AACvD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAAiB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,YAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA,EAAe,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA;AAAA,IAC1C,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,kBAAA,CACd,SAAA,EACA,cAAA,EACA,OAAA,GAA2E,EAAC,EACnE;AACT,EAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,IAC7B,SAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,GAAG;AAAA,GACJ,CAAA;AAGD,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EAC5B;AAGA,EAAA,KAAA,MAAW,OAAA,IAAW,OAAO,QAAA,EAAU;AACrC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;ACp6BA,IAAM,uBAAA,GAA0B,mBAAA;AAGhC,IAAM,uBAAA,GAA0B,oBAAA;AAGhC,IAAM,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,CAAA;AAalB,IAAM,cAAA,GAAiB,CAAC,OAAA,EAAS,aAAa,CAAA;AAS9C,SAAS,mBAAmB,OAAA,EAAyD;AACnF,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AAEjC,IAAA,MAAM,OAAA,GAAU,IAAI,IAAI,CAAA,CAAA,CAAA;AACxB,IAAA,IAAI,OAAA,CAAQ,SAAS,OAAO,CAAA,IAAK,QAAQ,QAAA,CAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA,EAAG;AAC9D,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAC1B;AAKA,SAAS,kBAAkB,OAAA,EAAyB;AAElD,EAAA,MAAM,aAAA,GAAgB,uBAAA;AACtB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC3C,EAAA,OAAO,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AACpC;AAKO,SAAS,oBAAoB,SAAA,EAA+D;AACjG,EAAA,OAAO;AAAA,IACL,UAAA,EAAYV,UAAAA,CAAK,SAAA,EAAW,uBAAuB,CAAA;AAAA,IACnD,UAAA,EAAYA,UAAAA,CAAK,SAAA,EAAW,uBAAuB;AAAA,GACrD;AACF;AAsBO,SAAS,WAAW,OAAA,EAAkC;AAC3D,EAAA,MAAM,EAAE,UAAA,EAAY,UAAA,EAAY,SAAS,KAAA,EAAO,OAAA,GAAU,OAAM,GAAI,OAAA;AAEpE,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,0DAAmD,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAA;AACvC,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAA;AACvC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,KAAK,uCAAuC,CAAA;AAAA,IACtD;AAAA,EACF;AAGA,EAAA,IAAI,CAACF,cAAAA,CAAW,UAAU,CAAA,EAAG;AAC3B,IAAA,MAAM,KAAA,GAAQ,0BAA0B,UAAU,CAAA,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAC,KAAK;AAAA,KAChB;AAAA,EACF;AAGA,EAAA,IAAI,aAAA;AACJ,EAAA,IAAI;AACF,IAAA,aAAA,GAAgBD,gBAAAA,CAAa,YAAY,OAAO,CAAA;AAAA,EAClD,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,QAAQ,CAAA,4BAAA,EAA+B,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,eAAe,CAAA,CAAA;AACjG,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,CAAA;AAAA,MACb,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,CAAC,KAAK;AAAA,KAChB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,CAAA,EAAG,SAAS,CAAA,EAAG,aAAa,CAAA,CAAA;AAG9C,EAAA,MAAM,YAAA,GAAe,mBAAmB,aAAa,CAAA;AACrD,EAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACnC,IAAA,KAAA,MAAW,IAAA,IAAQ,aAAa,OAAA,EAAS;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAE,CAAA;AAAA,IACnD;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,kBAAkB,aAAa,CAAA;AAGnD,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,IAAIC,cAAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkBD,gBAAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AACxD,MAAA,IAAI,oBAAoB,SAAA,EAAW;AACjC,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,KAAK,0CAAqC,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,CAAC,MAAA,EAAQ;AACtB,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAYU,cAAQ,UAAU,CAAA;AACpC,MAAA,IAAI,CAACT,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,QAAAU,aAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC1C;AAEA,MAAAE,iBAAAA,CAAc,UAAA,EAAY,SAAA,EAAW,OAAO,CAAA;AAAA,IAC9C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,QAAQ,CAAA,6BAAA,EAAgC,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,UAAU,eAAe,CAAA,CAAA;AAClG,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5B;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,CAAC,KAAK;AAAA,OAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,mCAA8B,CAAA;AAAA,IAC7C;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,WAAW,CAAA,CAAE,CAAA;AACjD,IAAA,IAAI,YAAA,CAAa,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,OAAA,CAAQ,KAAK,CAAA,wBAAA,EAA2B,YAAA,CAAa,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACnC,MAAA,OAAA,CAAQ,KAAK,CAAA,gCAAA,EAAyB,YAAA,CAAa,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACzE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,aAAa,CAAC,CAAA;AAAA,IAC7E,WAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS;AAAA,GACvC;AACF;AAKO,SAAS,cAAc,SAAA,EAA4B;AACxD,EAAA,MAAM,KAAA,GAAQ,oBAAoB,SAAS,CAAA;AAC3C,EAAA,MAAM,SAAS,UAAA,CAAW;AAAA,IACxB,GAAG,KAAA;AAAA,IACH,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,IAAI,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,EAAG;AACjC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;ACrOA,IAAM,eAAA,GAAkB,UAAA;AAGxB,IAAM,aAAA,GAAgB,CAAC,mBAAA,EAAqB,uBAAuB,CAAA;AAGnE,IAAM,uBAAA,GAA6C;AAAA,EACjD;AAAA,IACE,WAAA,EAAa,iBAAA;AAAA,IACb,IAAA,EAAM,gBAAA;AAAA,IACN,EAAA,EAAI;AAAA;AAER,CAAA;AASA,SAAS,iBAAA,CACP,OAAA,EACA,YAAA,EACA,OAAA,EACmC;AACnC,EAAA,IAAI,MAAA,GAAS,OAAA;AACb,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAE/B,IAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AAEjC,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,MAAA,OAAO,GAAA,GAAM,OAAO,MAAA,EAAQ;AAC1B,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA;AACzC,QAAA,IAAI,QAAQ,EAAA,EAAI;AACd,UAAA;AAAA,QACF;AACA,QAAA,UAAA,EAAA;AACA,QAAA,GAAA,GAAM,GAAA,GAAM,CAAA;AAAA,MACd;AAEA,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,MAAA,GAAS,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,KAAK,EAAE,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACtC,MAAA,UAAA,GAAa,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AACxC,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,KAAK,EAAE,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,UAAA,IAAc,UAAA;AACd,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,IAAA,GACJ,IAAA,CAAK,WAAA,KAAgB,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAA;AACnF,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAQ,IAAI,CAAA,EAAA,EAAK,UAAU,CAAA,eAAA,CAAiB,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAW;AACrC;AAmBO,SAAS,eAAe,OAAA,EAAgD;AAC7E,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,UAAA,GAAa,SAAA;AAAA,IACb,YAAA,GAAe,uBAAA;AAAA,IACf,MAAA,GAAS,KAAA;AAAA,IACT,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAGJ,EAAA,IAAI,CAACZ,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,UAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,gBAAA,EAAmB,SAAS,CAAA,CAAE;AAAA,KACzC;AAAA,EACF;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAUD,gBAAAA,CAAa,WAAW,OAAO,CAAA;AAAA,EAC3C,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,UAAA;AAAA,MACA,MAAA,EAAQ,CAAC,CAAA,qBAAA,EAAwB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA,CAAE;AAAA,KACzF;AAAA,EACF;AAGA,EAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,KAAU,iBAAA,CAAkB,OAAA,EAAS,cAAc,OAAO,CAAA;AAG1E,EAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,CAAC,MAAA,EAAQ;AACxB,IAAA,IAAI;AACF,MAAAa,iBAAAA,CAAc,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC3C,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,gBAAA,EAAkB,KAAA;AAAA,QAClB,UAAA;AAAA,QACA,MAAA,EAAQ,CAAC,CAAA,sBAAA,EAAyB,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,eAAe,CAAA,CAAE;AAAA,OAC1F;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,gBAAA,EAAkB,KAAA;AAAA,IAClB;AAAA,GACF;AACF;AAaO,SAAS,oBAAoB,OAAA,EAMyD;AAC3F,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,KAAA,GAAQ,aAAA;AAAA,IACR,YAAA,GAAe,uBAAA;AAAA,IACf,MAAA,GAAS,KAAA;AAAA,IACT,OAAA,GAAU;AAAA,GACZ,GAAI,OAAA;AAEJ,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,0CAAmC,CAAA;AAAA,EAClD;AAEA,EAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,IAAA,MAAM,QAAA,GAAWV,UAAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AAEtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAM,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,SAAS,cAAA,CAAe;AAAA,MAC5B,SAAA,EAAW,QAAA;AAAA,MACX,YAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAI,MAAA,CAAO,mBAAmB,CAAA,EAAG;AAC/B,QAAA,aAAA,EAAA;AACA,QAAA,iBAAA,IAAqB,MAAA,CAAO,gBAAA;AAAA,MAC9B,WAAW,OAAA,EAAS;AAClB,QAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AAAA,MACvC;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,MAAA,EAAQ;AACxB,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAC5B,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,KAAA,MAAW,GAAA,IAAO,OAAO,MAAA,EAAQ;AAC/B,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,iBAAA,EAAU,GAAG,CAAA,CAAE,CAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,iCAAA,EAAiC,aAAa,CAAA,kBAAA,CAAoB,CAAA;AAC/E,IAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,iBAAiB,CAAA,CAAE,CAAA;AAAA,IAC5D;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,eAAe,SAAA,EAA4B;AACzD,EAAA,MAAM,MAAA,GAASA,UAAAA,CAAK,SAAA,EAAW,eAAe,CAAA;AAE9C,EAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,IACjC,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AAKO,SAAS,iBAAiB,SAAA,EAA2B;AAC1D,EAAA,OAAOA,UAAAA,CAAK,WAAW,eAAe,CAAA;AACxC;AAKO,SAAS,eAAA,GAA4B;AAC1C,EAAA,OAAO,CAAC,GAAG,aAAa,CAAA;AAC1B;AAKO,SAAS,yBAAA,GAA+C;AAC7D,EAAA,OAAO,CAAC,GAAG,uBAAuB,CAAA;AACpC;;;AC9OA,IAAM,UAAA,GAAa;AAAA,EACjB,cAAA;AAAA,EACA,8BAAA;AAAA,EACA,sCAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,GAAG,CAAA;AAGV,IAAM,qBAAqB,CAAC,cAAA,EAAgB,8BAA8B,CAAA,CAAE,KAAK,GAAG,CAAA;AAGpF,IAAM,sBAAA,GAA8C;AAAA,EAClD,UAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAA;AAGA,IAAM,sBAAA,GAAuD;AAAA,EAC3D,UAAA,EAAY,mBAAA;AAAA,EACZ,UAAA,EAAY,oBAAA;AAAA,EACZ,cAAA,EAAgB,6BAAA;AAAA,EAChB,eAAA,EAAiB,4BAAA;AAAA,EACjB,uBAAA,EAAyB,gCAAA;AAAA,EACzB,kBAAA,EAAoB,8BAAA;AAAA,EACpB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,2BAAA,EAA6B;AAC/B,CAAA;AASA,SAAS,OAAA,CAAQ,IAAA,EAAiB,KAAA,EAAe,KAAA,EAAe,OAAA,EAA2B;AACzF,EAAA,MAAM,OAAA,GAAU,CAAA,CAAA,EAAI,KAAA,GAAQ,CAAC,IAAI,KAAK,CAAA,CAAA,CAAA;AAEtC,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,CAAA,eAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,UAAA,CAAY,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,EAAK,OAAO,CAAA,WAAA,EAAO,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,KAAK,EAAA,EAAI;AACX,IAAA,IAAI;AAEF,MAAA,MAAM,MAAA,GAAS,KAAK,EAAA,EAAG;AACvB,MAAA,IAAI,kBAAkB,OAAA,EAAS;AAE7B,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,6BAAA,EAAsB,IAAA,CAAK,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAAA,MACxE;AAEA,MAAA,IAAI,WAAW,KAAA,EAAO;AACpB,QAAA,OAAA,CAAQ,MAAM,CAAA,sCAAA,CAAmC,CAAA;AACjD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAK,iBAAY,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAiB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AACzF,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC7D,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,QAAQ,CAAA,GAAA,CAAK,CAAA;AAAA,IACrC;AAEA,IAAA,IAAI;AACF,MAAAW,sBAAA,CAAS,KAAK,OAAA,EAAS;AAAA,QACrB,GAAA,EAAK,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAAA,QAC7B,KAAA,EAAO,UAAU,SAAA,GAAY,MAAA;AAAA,QAC7B,KAAK,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAK,aAAa,GAAA;AAAI,OACzC,CAAA;AACD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,KAAK,iBAAY,CAAA;AAAA,MAC3B;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAiB,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA,CAAE,CAAA;AACzF,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAAgB,IAAA,CAAK,IAAI,CAAA,2BAAA,CAA6B,CAAA;AACnE,EAAA,OAAO,IAAA;AACT;AASA,SAAS,iBAAiB,WAAA,EAAgE;AACxF,EAAA,OAAO;AAAA,IACL,GAAG,sBAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF;AAKA,IAAM,kBAAA,GAAwD;AAAA,EAC5D,QAAA,EAAU,iBAAA;AAAA,EACV,SAAA,EAAW,wBAAA;AAAA,EACX,kBAAA,EAAoB,wBAAA;AAAA,EACpB,IAAA,EAAM,qBAAA;AAAA,EACN,YAAA,EAAc,sCAAA;AAAA,EACd,qBAAA,EAAuB,oCAAA;AAAA,EACvB,WAAA,EAAa,wBAAA;AAAA,EACb,gBAAA,EAAkB,qCAAA;AAAA,EAClB,yBAAA,EAA2B,mCAAA;AAAA,EAC3B,MAAA,EAAQ;AACV,CAAA;AAKA,SAAS,mBACP,QAAA,EACA,gBAAA,EACA,eAAA,EACA,SAAA,EACA,OACA,YAAA,EACW;AACX,EAAA,MAAM,WAAA,GAAc,mBAAmB,QAAQ,CAAA;AAE/C,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,UAAA;AAEH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,sBAAA;AAAA,QACT,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAI,MAAM;AACR,UAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,YAC7B,SAAA,EAAW,eAAA;AAAA,YACX,cAAA,EAAgB,SAAA;AAAA,YAChB,OAAA,EAAS;AAAA,WACV,CAAA;AACD,UAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,YAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,YAC5B;AAAA,UACF;AACA,UAAA,OAAO,MAAA,CAAO,OAAA;AAAA,QAChB;AAAA,OACF;AAAA,IAEF,KAAK,kBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,mCAAmC,YAAY,CAAA,CAAA;AAAA,QACxD,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,EAAA,EAAI,MAAM,aAAA,CAAc,gBAAgB;AAAA,OAC1C;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,QAAQ,UAAU,CAAA,CAAA,EAAI,MAAM,cAAc,CAAA,CAAA,EAAI,MAAM,eAAe,CAAA,CAAA;AAAA,QAC5E,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,qBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,QAAQ,UAAU,CAAA,CAAA,EAAI,MAAM,cAAc,CAAA,CAAA,EAAI,MAAM,uBAAuB,CAAA,mBAAA,CAAA;AAAA,QACpF,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,EAAA,EAAI,MAAM,cAAA,CAAe,gBAAgB;AAAA,OAC3C;AAAA,IAEF,KAAK,gBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,QAAQ,kBAAkB,CAAA,CAAA,EAAI,MAAM,kBAAkB,CAAA,CAAA,EAAI,MAAM,mBAAmB,CAAA,CAAA;AAAA,QAC5F,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,yBAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,QAAQ,kBAAkB,CAAA,CAAA,EAAI,MAAM,kBAAkB,CAAA,CAAA,EAAI,MAAM,2BAA2B,CAAA,mBAAA,CAAA;AAAA,QACpG,GAAA,EAAK;AAAA,OACP;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,MAAA;AAAA,QACT,GAAA,EAAK;AAAA,OACP;AAAA,IAEF;AACE,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,iBAAiB,QAAQ,CAAA,CAAA;AAAA,QAC/B,IAAI,MAAM;AACR,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oCAAA,EAA6B,QAAQ,CAAA,CAAE,CAAA;AACpD,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,OACF;AAAA;AAEN;AAKA,SAAS,gBAAA,CACP,SAAA,EACA,SAAA,EACA,OAAA,EACA,QAAA,EACa;AACb,EAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAe,SAAA,EAAU,GAAI,OAAA;AAKnD,EAAA,MAAM,gBAAA,GAAmB,UAAU,QAAA,CAAS,cAAc,IACtDJ,aAAAA,CAAQ,SAAS,CAAA,GACjBA,aAAAA,CAAQ,SAAS,CAAA;AAGrB,EAAA,MAAM,eAAA,GAAkB,GAAG,gBAAgB,CAAA,cAAA,CAAA;AAG3C,EAAA,MAAM,aAAA,GAAgB,UAAU,KAAA,IAAS,sBAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,QAAA,EAAU,KAAK,CAAA;AAC9C,EAAA,MAAM,YAAA,GAAe,UAAU,qBAAA,IAAyB,eAAA;AAGxD,EAAA,MAAM,QAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,IAAA,MAAM,IAAA,GAAO,kBAAA;AAAA,MACX,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAI,QAAA,KAAa,cAAc,YAAA,EAAc;AAC3C,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AACA,IAAA,IAAI,QAAA,KAAa,WAAA,KAAgB,aAAA,IAAiB,SAAA,CAAA,EAAY;AAC5D,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AACA,IAAA,IAAI,SAAA,IAAa,CAAC,CAAC,YAAA,EAAc,uBAAuB,aAAa,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,EAAG;AAEzF,MAAA,IAAI,CAAC,CAAC,UAAU,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,MACd;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,OAAO,KAAA;AACT;AAgCO,SAAS,WAAA,CACd,SAAA,EACA,QAAA,EACA,OAAA,GAAwB,EAAC,EACZ;AACb,EAAA,MAAM,EAAE,YAAA,EAAc,SAAA,EAAW,UAAU,IAAA,EAAM,KAAA,GAAQ,OAAM,GAAI,OAAA;AAEnE,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,IAAI;AACF,IAAA,IAAI,CAACT,cAAAA,CAAW,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,cAAA;AAAA,QACA,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,QAC/B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACvB,MAAA,EAAQ,CAAC,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAE,CAAA;AAAA,QACnD;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,cAAA;AAAA,MACA,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,MAC/B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,MAAA,EAAQ,CAAC,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAE,CAAA;AAAA,MACzD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,CAACA,cAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,cAAA;AAAA,QACA,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,QAC/B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACvB,MAAA,EAAQ,CAAC,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAE,CAAA;AAAA,QACjD;AAAA,OACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,cAAA;AAAA,MACA,WAAA,EAAa,CAAC,iBAAiB,CAAA;AAAA,MAC/B,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MACvB,MAAA,EAAQ,CAAC,CAAA,iCAAA,EAAoC,QAAQ,CAAA,CAAE,CAAA;AAAA,MACvD;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,IAAA,OAAA,CAAQ,KAAK,sXAAgE,CAAA;AAC7E,IAAA,OAAA,CAAQ,KAAK,0EAAgE,CAAA;AAC7E,IAAA,OAAA,CAAQ,KAAK,sXAAgE,CAAA;AAE7E,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,CAAQ,KAAK,qDAA2C,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,KAAK,sDAA4C,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,MAAM,QAAQ,gBAAA,CAAiB,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAE7E,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAM,SAAA,EAAW,MAAM,MAAA,EAAQ,OAAA,IAAW,CAAC,KAAK,CAAA;AAExE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,QAAA,cAAA,CAAe,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,IAAA,CAAK,KAAK,IAAI,CAAA;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAGhD,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAElC,MAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM;AAAA,gCAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,MACzD;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,cAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACV,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,EAAA,MAAM,WAAA,GAAA,CAAe,QAAA,GAAW,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAA;AAG/C,EAAA,IAAI,OAAA,IAAW,CAAC,KAAA,EAAO;AACrB,IAAA,OAAA,CAAQ,KAAK,wXAAkE,CAAA;AAC/E,IAAA,OAAA,CAAQ,KAAK,8EAA+D,CAAA;AAC5E,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAA,kBAAA,EAAS,cAAA,CAAe,MAAM,CAAA,iBAAA,EAAoB,WAAW,CAAA,qCAAA;AAAA,KAC/D;AACA,IAAA,OAAA,CAAQ,KAAK,sXAAgE,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,cAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,cAAA,CAAe,SAAA,EAAmB,QAAA,EAAkB,IAAA,GAAiB,EAAC,EAAY;AAChG,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,QAAA,CAAS,iBAAiB,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,CAAS,kBAAkB,CAAA;AACtD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA;AAC9C,EAAA,MAAM,QAAQ,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IAAK,IAAA,CAAK,SAAS,IAAI,CAAA;AAE5D,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,SAAA,EAAW,QAAA,EAAU;AAAA,IAC9C,YAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAS,CAAC,KAAA;AAAA,IACV;AAAA,GACD,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AAMO,SAAS,WAAA,CAAY,WAAmB,QAAA,EAAwB;AACrE,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA;AACxD,EAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AAC9B;AClaO,IAAM,yBAAA,GAA4B,CAAC,MAAM;AAKhD,IAAM,eAAA,GAAkB,CAAC,UAAA,EAAY,YAAY,CAAA;AAKjD,IAAM,qBAAA,GAAwB;AAAA,EAC5B,KAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA;AAaA,SAAS,mBAAA,CAAoB,SAAiB,OAAA,EAAqD;AAEjG,EAAA,MAAM,WAAA,GAAcc,cAAQ,OAAO,CAAA;AACnC,EAAA,MAAM,YAAA,GAAeA,cAAQ,OAAO,CAAA;AAEpC,EAAA,IAAI,CAAC,WAAA,CAAY,UAAA,CAAW,YAAY,CAAA,EAAG;AACzC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,CAAA,WAAA,EAAc,OAAO,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAA;AAAA,KACrE;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAUT,eAAS,WAAW,CAAA;AACpC,EAAA,IAAI,qBAAA,CAAsB,QAAA,CAAS,OAAiD,CAAA,EAAG;AACrF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,cAAc,OAAO,CAAA,oCAAA;AAAA,KAC9B;AAAA,EACF;AAGA,EAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAOA,SAAS,iBAAiB,GAAA,EAAqB;AAE7C,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA;AAChD;AASA,SAAS,kBAAkB,OAAA,EAAyB;AAElD,EAAA,MAAM,OAAA,GAAU,iBAAiB,OAAO,CAAA;AAGxC,EAAA,OAAO,QAAQ,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AACzD;AAUA,SAAS,gBAAA,CAAiB,UAAkB,OAAA,EAA0B;AAEpE,EAAA,IAAI,CAAC,QAAQ,QAAA,CAAS,GAAG,KAAK,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,IAAA,OAAO,QAAA,KAAa,OAAA;AAAA,EACtB;AAGA,EAAA,IAAI,QAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,CAAC,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzF,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AACjC,IAAA,OAAO,QAAA,CAAS,SAAS,SAAS,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,QAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,SAAS,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1F,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,IAAA,OAAO,QAAA,CAAS,WAAW,MAAM,CAAA;AAAA,EACnC;AAIA,EAAA,MAAM,WAAA,GAAc,kBAAkB,OAAO,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,CAAG,CAAA;AAC3C,EAAA,OAAO,KAAA,CAAM,KAAK,QAAQ,CAAA;AAC5B;AASA,SAAS,cAAA,CAAe,UAAkB,gBAAA,EAAqC;AAC7E,EAAA,MAAM,WAAA,GAAc,CAAC,GAAG,eAAA,EAAiB,GAAG,gBAAgB,CAAA;AAC5D,EAAA,OAAO,YAAY,IAAA,CAAK,CAAC,YAAY,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAC,CAAA;AAC1E;AAYA,SAAS,cAAc,OAAA,EAAkD;AACvE,EAAA,IAAI,CAACL,cAAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,EAC7B;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,MAAM,UAAUC,eAAAA,CAAY,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAC5D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,IAAA,EAAA;AACA,MAAA,MAAM,YAAY,aAAA,CAAcC,UAAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAC,CAAA;AACzD,MAAA,KAAA,IAAS,SAAA,CAAU,KAAA;AACnB,MAAA,IAAA,IAAQ,SAAA,CAAU,IAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,KAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AASA,SAAS,cAAA,CACP,SACA,OAAA,EACkB;AAClB,EAAA,MAAM,OAAA,GAAUF,eAAW,OAAO,CAAA;AAElC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0CAAA,EAAmC,OAAO,CAAA,CAAE,CAAA;AAAA,IAC3D;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,YAAA,EAAc,CAAA;AAAA,MACd,kBAAA,EAAoB,CAAA;AAAA,MACpB,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AAEpC,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,6BAAsB,OAAO,CAAA,EAAA,EAAK,OAAO,KAAK,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,aAAA;AAAA,OACtE;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,cAAc,MAAA,CAAO,KAAA;AAAA,MACrB,oBAAoB,MAAA,CAAO,IAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAGA,EAAA,MAAM,UAAUC,eAAAA,CAAY,OAAA,EAAS,EAAE,aAAA,EAAe,MAAM,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,eAAe,CAAA,CAAE,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAEjF,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAEzB,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAChD,QAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAAoB,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,QAC/C;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAYC,UAAAA,CAAK,OAAA,EAAS,KAAA,CAAM,IAAI,CAAA;AAC1C,MAAAa,UAAA,CAAO,WAAW,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,IACpD;AAAA,EACF,CAAA,MAAO;AAEL,IAAAA,UAAA,CAAO,SAAS,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAA,CAAQ,IAAA,CAAK,qBAAgB,OAAO,CAAA,EAAA,EAAK,OAAO,KAAK,CAAA,QAAA,EAAW,MAAA,CAAO,IAAI,CAAA,aAAA,CAAe,CAAA;AAAA,EAC5F;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,cAAc,MAAA,CAAO,KAAA;AAAA,IACrB,oBAAoB,MAAA,CAAO,IAAA;AAAA,IAC3B,OAAA,EAAS;AAAA,GACX;AACF;AAiCO,SAAS,iBAAA,CAAkB,OAAA,GAAwB,EAAC,EAAgB;AACzE,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAAA,IACxC,WAAA,EAAa,OAAA,CAAQ,WAAA,IAAe,CAAC,GAAG,yBAAyB,CAAA;AAAA,IACjE,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,IAC1B,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,IAC5B,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY;AAAC,GACjC;AAEA,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,OAAA,EAAS,IAAA;AAAA,IACT,SAAS,EAAC;AAAA,IACV,iBAAA,EAAmB,CAAA;AAAA,IACnB,uBAAA,EAAyB,CAAA;AAAA,IACzB,QAAQ,EAAC;AAAA,IACT,UAAU,EAAC;AAAA,IACX,QAAQ,iBAAA,CAAkB,MAAA;AAAA,IAC1B,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,IAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,MAAA,GAAS,WAAA,GAAc,EAAA;AACzD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,iCAAA,EAA+B,OAAO,CAAA,CAAE,CAAA;AACrD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,EAAY,iBAAA,CAAkB,OAAO,CAAA,CAAE,CAAA;AAAA,EACtD;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,kBAAkB,WAAA,EAAa;AAC/C,IAAA,MAAM,YAAA,GAAeD,aAAA,CAAQ,iBAAA,CAAkB,OAAA,EAAS,GAAG,CAAA;AAG3D,IAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,YAAA,EAAc,iBAAA,CAAkB,OAAO,CAAA;AAC9E,IAAA,IAAI,CAAC,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA,EAAO;AACzC,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AACnC,MAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,eAAe,YAAA,EAAc;AAAA,QAC3C,QAAQ,iBAAA,CAAkB,MAAA;AAAA,QAC1B,SAAS,iBAAA,CAAkB,OAAA;AAAA,QAC3B,UAAU,iBAAA,CAAkB;AAAA,OAC7B,CAAA;AAED,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,OAAO,CAAA;AAC3B,MAAA,MAAA,CAAO,qBAAqB,OAAA,CAAQ,YAAA;AACpC,MAAA,MAAA,CAAO,2BAA2B,OAAA,CAAQ,kBAAA;AAAA,IAC5C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,GAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAC9D,MAAA,MAAA,CAAO,OAAO,IAAA,CAAK,CAAA,iBAAA,EAAoB,GAAG,CAAA,GAAA,EAAM,YAAY,CAAA,CAAE,CAAA;AAC9D,MAAA,MAAA,CAAO,OAAA,GAAU,KAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE/B,EAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,IAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,GAAS,cAAA,GAAiB,SAAA;AAC9D,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,OAAA,EAAK,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,iBAAiB,WACrC,MAAA,CAAO,uBAAuB,CAAA,gBAAA,EAAmB,MAAA,CAAO,QAAQ,CAAA,EAAA;AAAA,OACvE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,MAAM,kCAA6B,CAAA;AAC3C,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,cAAA,CACd,OAAA,EACA,OAAA,GAAyC,EAAC,EACjC;AACT,EAAA,MAAM,SAAS,iBAAA,CAAkB;AAAA,IAC/B,GAAG,OAAA;AAAA,IACH,OAAA;AAAA,IACA,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,GAC7B,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AC1bA,SAASE,SAAQ,GAAA,EAAuB;AACtC,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,OAAO,OAAA,IAAW,UAAU,QAAA,IAAY,MAAA;AAC1C;AAKA,SAAS,eAAe,GAAA,EAAuB;AAC7C,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,IAAI,CAAC,IAAI,UAAA,CAAW,GAAG,KAAK,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,EAAU;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAWA,SAAS,SAAA,CACP,MAAA,EACA,MAAA,EACA,OAAA,GAAU,KAAA,EACG;AACb,EAAA,MAAM,SAAsB,MAAA,GAAS,EAAE,GAAG,MAAA,KAAW,EAAC;AAGtD,EAAA,MAAM,aAAA,GAAgBA,SAAQ,MAAM,CAAA;AACpC,EAAA,MAAM,aAAA,GAAgBA,SAAQ,MAAM,CAAA;AACpC,EAAA,MAAM,iBAAA,GAAoB,eAAe,MAAM,CAAA;AAC/C,EAAA,MAAM,iBAAA,GAAoB,eAAe,MAAM,CAAA;AAE/C,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,sEAA4D,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,gEAAsD,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,EAAE,GAAG,MAAA,EAAO;AAAA,EACrB;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAE9B,IAAA,IAAI,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAEjF,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,QACZ,WAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAErC,MAAA,MAAM,gBAAgB,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,GAAI,cAAc,EAAC;AAClE,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,GAAG,aAAA,EAAe,GAAG,WAAW,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAW;AAEpC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AASA,SAAS,YAAY,GAAA,EAAsB;AACzC,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,MAAA,GAAS,GAAA;AAEf,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AAExB,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAM,WAAA,GAAc,KAAA;AAEpB,MAAA,IAAI,OAAA,IAAW,WAAA,IAAe,QAAA,IAAY,WAAA,EAAa;AACrD,QAAA,KAAA,EAAA;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,KAAA,IAAS,YAAY,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAUA,SAAS,gBAAA,CACP,GAAA,EACA,OAAA,EACA,OAAA,EACA,cAAA,EACM;AACN,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,EAAY,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9D,EAAA,MAAM,gBAAgB,OAAA,CAAQ,WAAA,EAAY,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAG9D,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,aAAa,CAAA,CAAA,CAAA,EAAK,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,CAAG,CAAA;AAEzE,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AAErB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAE7E,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,MAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,QAAA,IAAI,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA,EAAG;AAElC,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACzC,UAAA,QAAA,GAAW,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACtC,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,QAAA;AAGX,MAAA,IAAK,GAAA,CAAI,GAAG,CAAA,CAAa,UAAA,CAAW,GAAG,CAAA,EAAG;AACxC,QAAA,IAAI,EAAE,kBAAkB,GAAA,CAAA,EAAM;AAC5B,UAAA,GAAA,CAAI,cAAc,CAAA,GAAI,EAAA;AAAA,QACxB;AACA,QAAA,IAAI,EAAE,qBAAqB,GAAA,CAAA,EAAM;AAC/B,UAAA,GAAA,CAAI,iBAAiB,CAAA,GAAI,cAAA;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,SAAS,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACtE,MAAA,gBAAA,CAAiB,KAAA,EAAsB,OAAA,EAAS,OAAA,EAAS,cAAc,CAAA;AAAA,IACzE;AAAA,EACF;AACF;AASA,SAAS,eAAe,GAAA,EAAuB;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA,KAAQ,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACzD,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA;AACf,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,CAAK,MAAM,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAE9C,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA;AAChC,IAAA,IAAI,OAAA,IAAW,CAAC,OAAA,EAAS;AACvB,MAAA,OAAO,EAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,EAC1B,CAAC,CAAA;AAED,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,cAAA,CAAe,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,MAAA;AACT;AAUA,SAAS,mBAAmB,GAAA,EAAuB;AACjD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,iBAAA,GAAoB,IAAA;AACxB,EAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,EAAA,SAAS,gBAAgB,IAAA,EAAqC;AAC5D,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,MAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/D,QAAA,MAAM,WAAA,GAAc,KAAA;AACpB,QAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,UAAA,cAAA,EAAA;AACA,UAAA,IACE,OAAO,WAAA,CAAY,QAAQ,CAAA,KAAM,QAAA,IAChC,YAAY,QAAQ,CAAA,CAAa,UAAA,CAAW,GAAG,CAAA,EAChD;AACA,YAAA;AAAA,UACF,CAAA,MAAO;AACL,YAAA,iBAAA,GAAoB,KAAA;AACpB,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,eAAA,CAAgB,WAAW,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,eAAA,CAAgB,GAA8B,CAAA;AAC9C,EAAA,OAAO,qBAAqB,cAAA,GAAiB,EAAA;AAC/C;AAKA,SAAS,kBAAkB,IAAA,EAAqC;AAC9D,EAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,EAAG;AAClC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAA;AAChC,IAAA,OAAO,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAAA,EACpB;AACA,EAAA,OAAO,IAAA;AACT;AASA,SAAS,QAAA,CAAS,UAAkB,OAAA,EAAyC;AAC3E,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWF,cAAQ,QAAQ,CAAA;AACjC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,mBAAA,EAAe,QAAQ,CAAA,CAAE,CAAA;AAAA,IACxC;AACA,IAAA,MAAM,OAAA,GAAUf,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,QAAA,CAAS,QAAA,EAAkB,IAAA,EAAe,OAAA,EAA2B;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWe,cAAQ,QAAQ,CAAA;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC,CAAA;AAC5C,IAAAF,iBAAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AACxC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAY,QAAQ,CAAA,CAAE,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAaO,SAAS,iBAAiB,OAAA,EAAoC;AACnE,EAAA,MAAM,EAAE,aAAa,UAAA,EAAY,QAAA,GAAW,QAAQ,MAAA,GAAS,KAAA,EAAO,OAAA,GAAU,KAAA,EAAM,GAAI,OAAA;AAExF,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,UAAA;AAAA,MACA,MAAA,EAAQ,CAAC,wCAAwC;AAAA,KACnD;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,IAAI,CAACZ,cAAAA,CAAW,IAAI,CAAA,EAAG;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA,IAC9C;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,uCAAgC,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,cAAgF,EAAC;AAEvF,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG;AAC7C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAE,CAAA;AACtD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,kBAAkB,IAAI,CAAA;AACnC,IAAA,MAAM,cAAA,GAAiB,OAClB,IAAA,CAAK,CAAC,EAAE,IAAI,CAAA,GACZ,KAAK,CAAC,CAAA;AACX,IAAA,MAAM,UAAA,GAAa,YAAY,cAAc,CAAA;AAE7C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,CAAA,uBAAA,EAAmB,IAAA,IAAQ,SAAS,CAAA,GAAA,EAAM,UAAU,CAAA,QAAA,CAAU,CAAA;AAAA,IAC7E;AAEA,IAAA,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,cAAA,EAAgB,YAAY,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,kBAAkB,WAAA,CAAY,MAAA;AAAA,MAC9B,WAAA,EAAa,CAAA;AAAA,MACb,UAAA;AAAA,MACA,QAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAC,uCAAuC;AAAA,KAC/E;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAA,KAAM,IAAI,CAAA;AAC5F,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,CAAC,CAAA,IAAK,QAAA;AAC1C,EAAA,MAAM,cAAc,eAAA,CAAgB,QAAA,CAAS,QAAQ,CAAA,GACjD,WACA,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,EAAG,MAAO,CAAA,CAAE,MAAA,IAAU,EAAE,MAAA,GAAS,CAAA,GAAI,GAAI,WAAW,CAAA;AAEhF,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,oCAAA,EAAkC,WAAW,CAAA,CAAA,CAAG,CAAA;AAC7D,IAAA,OAAA,CAAQ,KAAK,mCAA4B,CAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,eAAA,GAAkB,YAAY,CAAC,CAAA;AACrC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,WAAA,EAAa,CAAA;AAAA,MACb,UAAA;AAAA,MACA,MAAA,EAAQ,CAAC,yBAAyB;AAAA,KACpC;AAAA,EACF;AAEA,EAAA,IAAI,SAAsB,eAAA,CAAgB,IAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,IAAA,MAAM,MAAA,GAAS,YAAY,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA;AAAA,IACF;AACA,IAAA,IAAI,aAAa,OAAA,EAAS;AAExB,MAAA,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,MAAA,EAAQ,OAAO,CAAA;AAAA,IACjD,CAAA,MAAO;AAEL,MAAA,MAAA,GAAS,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,qDAAyC,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,KAAA,GAAQ,OAAO,OAAO,CAAA;AAC5B,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,KAAA,MAAW,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACzC,MAAA,MAAM,IAAA,GAAO,MAAM,QAAQ,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,OAAO,QAAQ,CAAA;AAE9B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,MAAW,WAAA,IAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7C,UAAA,IAAI,kBAAA,CAAmB,MAAA,CAAO,WAAW,CAAC,CAAA,EAAG;AAC3C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4CAAA,EAAqC,WAAW,CAAA,CAAE,CAAA;AAAA,YACjE;AACA,YAAA,OAAO,OAAO,WAAW,CAAA;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,aAAa,WAAA,CAAY,WAAA,EAAY,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC/D,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gDAAA,EAA4C,UAAU,CAAA,YAAA,CAAc,CAAA;AAAA,EACnF;AACA,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa,WAAW,CAAA;AAAA,IAC9D;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,gDAAyC,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AAGpC,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM,CAAA;AAEtC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,IAAA,CAAK,6BAAwB,WAAW,CAAA;AAAA,CAAW,CAAA;AAAA,EAC7D;AAGA,EAAA,MAAM,SAAS,CAAC,EAAE,CAAC,WAAW,GAAG,QAAQ,CAAA;AAGzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,IAAI,CAAC,QAAA,CAAS,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA,EAAG;AAC1C,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAE,CAAA;AACxD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,kBAAkB,WAAA,CAAY,MAAA;AAAA,QAC9B,WAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY;AAAA,OAChD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAA,CAAQ,KAAK,0BAAqB,CAAA;AAClC,IAAA,OAAA,CAAQ,KAAK,oBAAa,CAAA;AAC1B,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,WAAA,EAAc,IAAA,CAAK,UAAU,CAAA,OAAA,CAAS,CAAA;AAAA,IACrD;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,aAAA,EAAgB,WAAW,CAAA,OAAA,CAAS,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,kBAAkB,WAAA,CAAY,MAAA;AAAA,IAC9B,WAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,IAC9C,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS;AAAA,GACvC;AACF;AAKO,SAAS,mBAAA,CAAoB,OAAA,EAAiB,OAAA,EAAiB,MAAA,EAAyB;AAC7F,EAAA,MAAM,SAAS,gBAAA,CAAiB;AAAA,IAC9B,WAAA,EAAa,CAAC,OAAA,EAAS,OAAO,CAAA;AAAA,IAC9B,UAAA,EAAY,MAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,OAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IAC5B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA;AAChB;AChiBA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,oBAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AASA,SAAS,YAAY,OAAA,EAAyB;AAC5C,EAAA,MAAM,KAAA,GAAQ,QACX,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA,CACnC,OAAA,CAAQ,SAAS,gBAAgB,CAAA,CACjC,QAAQ,KAAA,EAAO,OAAO,EACtB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,mBAAmB,IAAI,CAAA;AAClC,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAChC;AAKA,SAAS,oBAAA,CAAqB,cAAsB,QAAA,EAA6B;AAC/E,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,KAAA,GAAQ,YAAY,OAAO,CAAA;AACjC,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,EAAG;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAgBiB,0BAAS,YAAY,CAAA;AAC3C,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,cACb,GAAA,EACA,OAAA,EACA,WACA,cAAA,EACA,QAAA,EACA,cACA,cAAA,EAC6B;AAC7B,EAAA,MAAM,QAA4B,EAAC;AAEnC,EAAA,IAAI,eAAe,QAAA,EAAU;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAASC,cAAA,CAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAEtE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,SAAA,GAAiBD,gBAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAC3C,MAAA,MAAM,YAAA,GAAoBA,gBAAA,CAAA,QAAA,CAAS,OAAA,EAAS,SAAS,CAAA;AAGrD,MAAA,IAAI,oBAAA,CAAqB,YAAA,EAAc,cAAc,CAAA,EAAG;AACtD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,WAAA,EAAY,IAAM,cAAA,IAAkB,KAAA,CAAM,gBAAe,EAAI;AAErE,QAAA,MAAM,WAAW,MAAM,aAAA;AAAA,UACrB,SAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA,GAAe,CAAA;AAAA,UACf;AAAA,SACF;AACA,QAAA,KAAA,CAAM,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,IAAK,KAAA,CAAM,KAAK,QAAA,CAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA,EAAG;AAEjE,QAAA,MAAM,IAAA,GAAO,MAASC,cAAA,CAAA,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAC7C,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,YAAA,EAAc,SAAA;AAAA,UACd,YAAA;AAAA,UACA,MAAWD,gBAAA,CAAA,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAAA,UAC/C,SAAA;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,KAAK,CAAA,kCAAA,EAAqC,GAAG,CAAA,EAAA,EAAM,KAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,EACtF;AAEA,EAAA,OAAO,KAAA;AACT;AAsBA,eAAsB,gBAAgB,OAAA,EAA2D;AAC/F,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA,GAAiB,uBAAA;AAAA,IACjB,cAAA,GAAiB,KAAA;AAAA,IACjB,QAAA,GAAW;AAAA,GACb,GAAI,OAAA;AAEJ,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,WAAA,GAAmBA,yBAAQ,GAAG,CAAA;AAGpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAASC,cAAA,CAAA,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AAC/C,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,QAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAC5B,QAAA;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAG5B,IAAA,MAAM,aAAa,MAAM,aAAA;AAAA,MACvB,WAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,EAC1B;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAEhE,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,WAAA,EAAa,WAAA;AAAA,IACb,kBAAA,EAAoB,WAAA;AAAA,IACpB,YAAY,KAAA,CAAM,MAAA;AAAA,IAClB;AAAA,GACF;AACF;AASO,SAAS,SAAA,CACd,KAAA,EACA,KAAA,GAA4C,cAAA,EACxB;AACpB,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA;AAExB,EAAA,IAAI,UAAU,cAAA,EAAgB;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,EACpD,CAAA,MAAA,IAAW,UAAU,iBAAA,EAAmB;AACtC,IAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAEpB,MAAA,MAAM,IAAA,GAAYD,gBAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,YAAY,CAAA;AACxC,MAAA,MAAM,IAAA,GAAYA,gBAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,YAAY,CAAA;AACxC,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,MAChC;AAEA,MAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,WAAA,CACd,KAAA,EACA,QAAA,EACA,OAAA,GAAU,KAAA,EACU;AACpB,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC5B,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA;AAChE,IAAA,OAAO,OAAA,GAAU,UAAU,CAAC,OAAA;AAAA,EAC9B,CAAC,CAAA;AACH;AAKO,SAAS,wBAAA,GAAqC;AACnD,EAAA,OAAO,CAAC,GAAG,uBAAuB,CAAA;AACpC;ACjPA,SAAS,sBAAsB,OAAA,EAAiC;AAC9D,EAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,EAAA,MAAM,OAAA,GAAU,CAAA;AAAA;AAAA,cAAA,EAEF,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AASvB,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,qBAAA,CAAsB,QAAgB,OAAA,EAAiC;AAC9E,EAAA,OAAO,yBAAyB,MAAM,CAAA,cAAA,CAAA;AACxC;AASA,SAAS,iBAAA,CAAkB,SAAiB,MAAA,EAAkC;AAC5E,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,WAAA,GAAc,WAAA,CAAY,MAAA,GAAS,CAAA;AACrD,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,SAAS,SAAS,CAAA,gEAAA;AAAA,KACpB;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,YAAY,KAAK,EAAC;AACpD,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,WAAW,CAAA;AACvC,EAAA,IAAI,WAAA,CAAY,MAAA,GAAS,WAAA,CAAY,IAAA,EAAM;AACzC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,oFAAA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,WAAW,MAAA,EAAQ;AAErB,IAAA,MAAM,kBAAA,GAAqB,kCAAA;AAC3B,IAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,OAAO,CAAA,EAAG;AACpC,MAAA,QAAA,CAAS,KAAK,CAAA,gEAAA,CAAkE,CAAA;AAAA,IAClF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAuBA,eAAsB,YAAA,CACpB,YAAA,EACA,WAAA,EACA,MAAA,GAA+B,EAAC,EACL;AAC3B,EAAA,MAAM,EAAE,UAAA,GAAa,OAAA,EAAQ,GAAI,MAAA;AAEjC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,OAAA,GAAoB,CAAC,oBAAoB,CAAA;AAC/C,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,YAAA,CAAa,MAAM,CAAC,CAAA;AAGrD,EAAA,IAAI,eAAe,QAAA,EAAU;AAE3B,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,KAAA,CAAM,KAAK,qBAAA,CAAsB,OAAA,CAAQ,MAAA,EAAQ,YAAA,CAAa,MAAM,CAAC,CAAA;AACrE,MAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC7B;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,oBAAA,EAAsB,YAAA,CAAa,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,CAAM,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,EACjC,CAAA,MAAO;AAEL,IAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,oBAAA,EAAsB,YAAA,CAAa,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,CAAM,IAAA,CAAK,aAAa,OAAO,CAAA;AAE/B,IAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,MAAA,KAAA,CAAM,KAAK,qBAAA,CAAsB,OAAA,CAAQ,MAAA,EAAQ,YAAA,CAAa,MAAM,CAAC,CAAA;AACrE,MAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,CAAA;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,IAC7B;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACvC,EAAA,QAAA,CAAS,KAAK,GAAG,iBAAA,CAAkB,aAAA,EAAe,YAAA,CAAa,MAAM,CAAC,CAAA;AAEtE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,aAAA;AAAA,IACT,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAUA,eAAsB,WAAA,CACpB,KAAA,EACA,IAAA,EACA,MAAA,EACyB;AACzB,EAAA,MAAM,UAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAASE,cAAA,CAAA,QAAA,CAAS,QAAA,CAAS,UAAU,OAAO,CAAA;AAChE,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS,WAAA;AAAA,QACT,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AASO,SAAS,uBAAA,CACd,cACA,SAAA,EACQ;AACR,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,YAAA,GAAe,CAAC,YAAY,CAAA;AAC1E,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,cAAc,OAAA,EAAS;AAEhC,IAAA,IAAI,WAAW,UAAA,CAAW,GAAG,KAAK,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,EAAG;AAE5D,MAAA,MAAM,YAAA,GAAoBC,gBAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,UAAU,CAAA;AACvD,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,SAAA,EAAY,YAAY,CAAA,EAAA,CAAI,CAAA;AAAA,IAC9C,CAAA,MAAO;AAEL,MAAA,UAAA,CAAW,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,CAAA,EAAA,CAAI,CAAA;AAAA,IAC5C;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC;;AAAA,CAAA;AACjC;AAUO,SAAS,mBAAA,CACd,OAAA,EACA,YAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,YAAA,EAAc,SAAS,CAAA;AAC9D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,GAAS,OAAA;AAClB;ACpNA,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,gDAAA,EAAkD,EAAE,CAAA;AAC7E;AAMA,SAAS,cAAc,OAAA,EAAyB;AAC9C,EAAA,OACE,OAAA,CAEG,QAAQ,sCAAA,EAAwC,EAAE,EAElD,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAEnB,OAAA,CAAQ,uBAAuB,IAAI,CAAA,CAEnC,QAAQ,KAAA,EAAO,GAAG,EAElB,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA,CAC5B,IAAA,EAAK;AAEZ;AAKA,SAAS,gBAAgB,WAAA,EAAuC;AAC9D,EAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,OAAA,CAAQ,KAAA,CAAM,4BAA4B,CAAA;AAC9E,EAAA,OAAO,kBAAkB,OAAA,GAAU,MAAA;AACrC;AAKA,SAAS,iBAAA,CAAkB,OAAA,EAAmB,IAAA,EAAc,SAAA,EAA2B;AACrF,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,OAAA,EAAS,CAAA;AAAA,IACT,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAG,SAAS,CAAA,CAAA;AAAA,IACzB,OAAA;AAAA,IACA,OAAO,EAAC;AAAA,IACR,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAA;AAC5C;AAwBA,eAAsB,YAAA,CACpB,aACA,MAAA,EACuB;AACvB,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,qBAAA,EAAuB,UAAA,EAAY,QAAO,GAAI,MAAA;AAEvE,EAAA,IAAI,UAAU,WAAA,CAAY,OAAA;AAG1B,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,OAAA,GAAU,qBAAqB,OAAO,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,MAAM,QAAA,GAAW,cAAc,OAAO,CAAA;AACtC,IAAA,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,QAAA,EAAU,OAAO,CAAA;AAClD,IAAA,OAAA,GAAU,QAAA;AAAA,EACZ;AAGA,EAAA,MAAM,SAAA,GAAY,gBAAgB,WAAW,CAAA;AAC7C,EAAA,MAAM,aAAkBC,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,GAAG,IAAI,CAAA,EAAG,SAAS,CAAA,CAAE,CAAA;AAG7D,EAAA,MAASC,wBAAS,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAGtD,EAAA,MAASA,cAAA,CAAA,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAGxD,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,SAAA,GAAY,iBAAA,CAAkB,WAAA,CAAY,OAAA,EAAS,IAAA,EAAM,SAAS,CAAA;AAClE,IAAA,MAAM,OAAA,GAAU,GAAG,UAAU,CAAA,IAAA,CAAA;AAC7B,IAAA,MAASA,cAAA,CAAA,QAAA,CAAS,SAAA,CAAU,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAGvD,IAAA,MAAM,MAAA,GAAS;AAAA,qBAAA,EAA0B,IAAI,GAAG,SAAS,CAAA,OAAA,CAAA;AACzD,IAAA,OAAA,IAAW,MAAA;AACX,IAAA,MAASA,cAAA,CAAA,QAAA,CAAS,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAO,WAAA,CAAY,OAAA;AAAA,IACnB,IAAA,EAAM,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,OAAO,CAAA;AAAA,IACxC;AAAA,GACF;AACF;AAYA,eAAsB,aAAA,CACpB,QAAA,EACA,SAAA,EACA,QAAA,EACA,WACA,MAAA,EACsD;AACtD,EAAA,MAAM,EAAE,QAAA,GAAW,eAAA,EAAiB,GAAG,cAAa,GAAI,MAAA;AACxD,EAAA,MAAM,UAAuD,EAAC;AAG9D,EAAA,MAAM,SAAA,GAAY,UAAU,QAAQ,CAAA;AACpC,EAAA,IAAI,QAAA,IAAY,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACpC,IAAA,MAAM,cAAc,MAAM,WAAA;AAAA,MACxB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAAA,MACnC,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,EAAE,SAAS,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAM,EAAG,WAAW,CAAA;AAExF,IAAA,OAAA,CAAQ,GAAA,GAAM,MAAM,YAAA,CAAa,WAAA,EAAa;AAAA,MAC5C,GAAG,YAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,UAAA,GAAa,UAAU,SAAS,CAAA;AACtC,EAAA,IAAI,SAAA,IAAa,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AACtC,IAAA,MAAM,cAAc,MAAM,WAAA;AAAA,MACxB,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAAA,MACpC,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,EAAE,SAAS,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAO,EAAG,WAAW,CAAA;AAE1F,IAAA,OAAA,CAAQ,IAAA,GAAO,MAAM,YAAA,CAAa,WAAA,EAAa;AAAA,MAC7C,GAAG,YAAA;AAAA,MACH,IAAA,EAAM,IAAI,QAAQ,CAAA;AAAA,KACnB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AAUA,eAAsB,qBAAA,CACpB,KAAA,EACA,MAAA,EACA,MAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,UAAU,KAAK,CAAA;AAC9B,EAAA,MAAM,cAAc,MAAM,WAAA;AAAA,IACxB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAAA,IAChC,MAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAM,YAAA,CAAa,EAAE,SAAS,EAAA,EAAI,MAAA,IAAU,WAAW,CAAA;AAE3E,EAAA,OAAO,YAAA,CAAa,aAAa,MAAM,CAAA;AACzC;AC7MO,IAAM,kBAAA,GAAmD;AAAA,EAC9D,GAAA,EAAK,YAAA;AAAA,EACL,IAAA,EAAM,cAAA;AAAA,EACN,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM,aAAA;AAAA,EACN,OAAA,EAAS,YAAA;AAAA,EACT,GAAA,EAAK;AACP;AAaO,SAAS,mBAAA,CAAoB,UAAkB,MAAA,EAAmC;AACvF,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,EAAA,MAAM,SAAA,GAAoC;AAAA,IACxC,KAAA,EAAO,OAAO,KAAA,IAAS,SAAA;AAAA,IACvB,IAAA,EAAM,OAAO,IAAA,IAAQ,QAAA;AAAA,IACrB,MAAA,EAAQ,OAAO,MAAA,IAAU,EAAA;AAAA,IACzB,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,GAAA,CAAI,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAAA,IACxD,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa,GAAA,CAAI,WAAA;AAAY,GACjD;AAEA,EAAA,IAAI,MAAA,GAAS,QAAA;AACb,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,CAAA,CAAA,EAAI,GAAG,KAAK,KAAK,CAAA;AAAA,EAC9C;AAEA,EAAA,OAAO,MAAA;AACT;AAyBO,SAAS,iBAAA,CACd,MAAA,EACA,MAAA,EACA,MAAA,GAA4B,EAAC,EACrB;AAER,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,MAAM,KAAK,MAAA,CAAO,OAAA;AAGhD,EAAA,IAAI,WAAW,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,IAAK,mBAAmB,MAAM,CAAA;AAGpE,EAAA,QAAA,GAAW,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAE/C,EAAA,OAAYC,gBAAA,CAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAChC;AAUO,SAAS,qBAAA,CACd,OAAA,EACA,MAAA,EACA,MAAA,GAA4B,EAAC,EACC;AAC9B,EAAA,MAAM,SAAgD,EAAC;AAEvD,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAA,CAAO,MAAM,CAAA,GAAI,iBAAA,CAAkB,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,MAAA;AACT;AAYO,SAAS,oBAAoB,KAAA,EAGlC;AACA,EAAA,MAAM,YAAgC,EAAC;AACvC,EAAA,MAAM,eAAuC,EAAC;AAE9C,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxD,IAAA,MAAM,UAAA,GAAkBA,2BAAU,UAAU,CAAA;AAC5C,IAAA,MAAM,cAAA,GAAiB,aAAa,UAAU,CAAA;AAE9C,IAAA,IAAI,mBAAmB,MAAA,EAAW;AAChC,MAAA,SAAA,CAAU,IAAA,CAAK,CAAC,cAAA,EAAgB,MAAM,CAAC,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,UAAU,CAAA,GAAI,MAAA;AAAA,IAC7B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAU,MAAA,KAAW,CAAA;AAAA,IAC5B;AAAA,GACF;AACF;AAYA,eAAsB,iBAAiB,KAAA,EAAkD;AACvF,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,KAAA,MAAW,UAAA,IAAc,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AAC7C,IAAA,WAAA,CAAY,GAAA,CAASA,gBAAA,CAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAASC,wBAAS,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO,OAAA;AACT;AAQO,SAAS,mBAAmB,WAAA,EAIlB;AACf,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAY,SAAA,IAAa,MAAA;AAAA,IAClC,UAAA,EAAY,WAAA,CAAY,UAAA,IAAc,EAAC;AAAA,IACvC,SAAA,EAAW,WAAA,CAAY,eAAA,IAAmB,EAAC;AAAA,IAC3C,UAAA,EAAY;AAAA,GACd;AACF;;;ACwJO,SAAS,UAAU,GAAA,EAA8B;AACtD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,GAAA;AAGd,EAAA,IAAI,OAAO,KAAA,CAAM,MAAM,CAAA,KAAM,QAAA,EAAU;AACrC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAC,CAAA,EAAG;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,aAAa,KAAA,EAAyB;AACpD,EAAA,OAAO,MAAM,MAAA,KAAW,MAAA;AAC1B;AAKO,SAAS,gBAAgB,KAAA,EAAyB;AACvD,EAAA,OAAO,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA;AAC/B;AAKO,SAAS,eAAe,KAAA,EAAoC;AACjE,EAAA,OAAO,KAAA,CAAM,SAAS,KAAA,CAAM,IAAA;AAC9B;;;AC1WO,IAAM,oBAAA,GAAyC;AAAA,EACpD,IAAA,EAAM,yBAAA;AAAA,EACN,MAAA,EAAQ,CAAC,EAAE,UAAA,EAAY,SAAQ,KAA4B;AACzD,IAAA,MAAM,MAAA,GAAU,OAAA,CAAQ,QAAQ,CAAA,IAAgB,IAAA;AAChD,IAAA,MAAM,QAAA,GAAY,OAAA,CAAQ,UAAU,CAAA,IAAgB,wBAAA;AAEpD,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AACpD,MAAA,MAAM,QAAkB,EAAC;AAGzB,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,CAAA,GAAA,CAAK,CAAA;AAAA,MACvC;AAGA,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,WAAA;AAChD,MAAA,IAAI,WAAA,IAAe,WAAA,KAAgB,KAAA,CAAM,OAAA,EAAS;AAChD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,WAAW,CAAA,GAAA,CAAK,CAAA;AAAA,MACrC;AAGA,MAAA,MAAM,aAAa,KAAA,CAAM,MAAA,KAAW,MAAA,GAAY,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AACrE,MAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,WAAW,UAAA,GAAa,IAAA,CAAK,UAAU,UAAU,CAAA;AAGrF,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,MAAM,CAAA,EAAG,MAAM,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAEhD,MAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,OAAO,GAAG,QAAQ,CAAA;AAAA,EAAO,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA;AAAA,EAC/C;AACF,CAAA;;;ACjCO,IAAM,wBAAA,GAA6C;AAAA,EACxD,IAAA,EAAM,6BAAA;AAAA,EACN,MAAA,EAAQ,CAAC,EAAE,UAAA,EAAY,SAAQ,KAA4B;AACzD,IAAA,MAAM,MAAA,GAAU,OAAA,CAAQ,QAAQ,CAAA,IAAgB,IAAA;AAEhD,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AACpD,MAAA,MAAM,QAAkB,EAAC;AAGzB,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,CAAA,GAAA,CAAK,CAAA;AAAA,MACvC;AAGA,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,WAAA;AAChD,MAAA,IAAI,WAAA,IAAe,WAAA,KAAgB,KAAA,CAAM,OAAA,EAAS;AAChD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQ,WAAW,CAAA,GAAA,CAAK,CAAA;AAAA,MACrC;AAGA,MAAA,MAAM,aAAa,KAAA,CAAM,MAAA,KAAW,MAAA,GAAY,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AACrE,MAAA,MAAM,QAAQ,OAAO,UAAA,KAAe,WAAW,UAAA,GAAa,IAAA,CAAK,UAAU,UAAU,CAAA;AAGrF,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,MAAM,CAAA,EAAG,MAAM,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AAEhD,MAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,OAAO,CAAA;AAAA,EAAY,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,CAAA;AAAA,EACzC;AACF;;;AC1CA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA;AACT;AAcA,SAAS,mBAAA,CAAoB,GAAA,EAAoB,MAAA,GAAS,CAAA,EAAW;AACnE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACjC,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAElC,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAY,4BAAA,CAA6B,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA,GAAM,IAAI,GAAG,CAAA,CAAA,CAAA;AAExE,IAAA,MAAM,UAAA,GAAa,KAAA;AAGnB,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,MAAA,IAAU,GAAG,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,EAAA,EAAK,WAAW,KAAK,CAAA;AAAA,CAAA;AAAA,IACxD,CAAA,MAAO;AAEL,MAAA,MAAA,IAAU,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,SAAS,KAAK,mBAAA,CAAoB,UAAA,EAAY,MAAA,GAAS,CAAC,CAAC;AAAA,CAAA;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,MAAA,IAAU,GAAG,MAAM,CAAA,CAAA,CAAA;AACnB,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAClD;AA4BO,IAAM,sBAAA,GAA2C;AAAA,EACtD,IAAA,EAAM,yBAAA;AAAA,EACN,MAAA,EAAQ,CAAC,EAAE,UAAA,EAAW,KAA4B;AAEhD,IAAA,MAAM,YAA2B,EAAC;AAElC,IAAA,KAAA,MAAW,KAAA,IAAS,WAAW,SAAA,EAAW;AACxC,MAAA,IAAI,OAAA,GAAyB,SAAA;AAC7B,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAM,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC9C,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAExB,QAAA,IAAI,GAAA,KAAQ,WAAA,IAAe,GAAA,KAAQ,aAAA,IAAiB,QAAQ,WAAA,EAAa;AACvE,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,GAAG,MAAM,QAAA,EAAU;AACrD,UAAA,OAAA,CAAQ,GAAG,IAAI,EAAC;AAAA,QAClB;AACA,QAAA,OAAA,GAAU,QAAQ,GAAG,CAAA;AAAA,MACvB;AAEA,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AAChD,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,OAAO,CAAA,GAAI;AAAA,UACjB,QAAA,EAAU,IAAA;AAAA,UACV,KAAA,EAAO,kBAAkB,KAAK;AAAA,SAChC;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,aAAuC,EAAC;AAC9C,IAAA,KAAA,MAAW,KAAA,IAAS,WAAW,SAAA,EAAW;AACxC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAC7B,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,UAAA,UAAA,CAAW,QAAQ,IAAI,EAAC;AAAA,QAC1B;AACA,QAAA,UAAA,CAAW,QAAQ,CAAA,CAAE,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MAChD;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,KAAA,MAAW,YAAY,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAK,EAAG;AACrD,MAAA,MAAM,cAAA,GAAiB,WAAW,QAAQ,CAAA;AAC1C,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,UAAA,CAAW,QAAQ,CAAC,CAAA,SAAA,CAAA;AACxC,MAAA,YAAA,IAAgB,CAAA;AAAA,OAAA,EAAe,QAAQ,CAAA;AAAA;AAAA,CAAA;AACvC,MAAA,YAAA,IAAgB,eAAe,QAAQ,CAAA;AAAA,CAAA;AACvC,MAAA,YAAA,IAAgB,cAAA,CAAe,IAAI,CAAC,CAAA,KAAM,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACjE,MAAA,YAAA,IAAgB,OAAA;AAAA,IAClB;AAGA,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,SAAA,CAAU,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA;AACtE,IAAA,YAAA,IAAgB,CAAA;AAAA;AAAA;AAAA,CAAA;AAChB,IAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,IAAA,YAAA,IAAgB,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAChE,IAAA,YAAA,IAAgB,OAAA;AAGhB,IAAA,IAAI,WAAA,GAAc,qDAAA;AAClB,IAAA,KAAA,MAAW,KAAA,IAAS,WAAW,SAAA,EAAW;AACxC,MAAA,MAAM,IAAA,GAAO,kBAAkB,KAAK,CAAA;AACpC,MAAA,WAAA,IAAe,CAAA,qBAAA,EAAwB,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA;AAAA,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,EAYT,YAAY;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,8BAAA,EAQkB,mBAAA,CAAoB,SAAS,CAAC;;AAAA;AAAA;AAAA;;AAAA,EAM5D,WAAW;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,CAAA;AAAA,EAQX;AACF;;;AC/LO,IAAM,cAAA,GAAqC;AAAA,EAChD,oBAAA;AAAA,EACA,wBAAA;AAAA,EACA;AACF;AAgBO,SAAS,eAAA,CACd,EAAA,EACA,aAAA,GAAoC,EAAC,EAC/B;AACN,EAAA,MAAM,UAAA,GAAa,CAAC,GAAG,cAAA,EAAgB,GAAG,aAAa,CAAA;AAEvD,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,EAAA,CAAG,cAAA,CAAe;AAAA,MAChB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAQ,MAAA,CAAO;AAAA,KAChB,CAAA;AAAA,EACH;AACF;;;AC3BO,IAAM,iBAAA,GAA8C;AAAA,EACzD,IAAA,EAAM,YAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,eAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,qBAAA;AAAA;AAAA,IACA,qBAAA;AAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA;AAEJ;;;ACZO,IAAM,gBAAA,GAA6C;AAAA,EACxD,IAAA,EAAM,WAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,eAAA;AAAA,IACA,YAAA;AAAA,IACA,qBAAA;AAAA;AAAA,IACA,qBAAA;AAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA;AAEJ;;;ACLO,IAAM,kBAAA,GAA+C;AAAA,EAC1D,IAAA,EAAM,aAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,eAAA;AAAA;AAAA,IACA,YAAA;AAAA;AAAA,IACA,cAAA;AAAA;AAAA,IACA,qBAAA;AAAA;AAAA,IACA,qBAAA;AAAA;AAAA,IACA,eAAA;AAAA;AAAA,IACA;AAAA;AAAA;AAEJ;;;ACpBO,IAAM,eAAA,GAA8C;AAAA,EACzD,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF;AAgBO,SAAS,uBAAA,CACd,EAAA,EACA,YAAA,GAA2C,EAAC,EACtC;AACN,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,eAAA,EAAiB,GAAG,YAAY,CAAA;AAEtD,EAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,EAAA,CAAG,sBAAA,CAAuB;AAAA,MACxB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,YAAY,KAAA,CAAM;AAAA,KACnB,CAAA;AAAA,EACH;AACF;;;AClCA,IAAM,qBAAA,GAAiD;AAAA,EACrD,CAAC,kBAAkB,SAAS,CAAA;AAAA,EAC5B,CAAC,oBAAoB,WAAW,CAAA;AAAA,EAChC,CAAC,mBAAmB,gBAAgB;AACtC,CAAA;AAKA,SAAS,QAAA,CAAS,OAAgB,QAAA,EAA4C;AAC5E,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,GAAS,MAAA,CAAO,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,aAAA,CAAc,KAA8B,QAAA,EAAyC;AAC5F,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAElC,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AAErB,IAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,MAAA,MAAM,UAAA,GAAa,KAAA;AAGnB,MAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,QAAA,UAAA,CAAW,QAAQ,CAAA,GAAI,QAAA,CAAS,UAAA,CAAW,QAAQ,GAAG,QAAQ,CAAA;AAAA,MAChE,CAAA,MAAA,IAES,WAAW,UAAA,EAAY;AAC9B,QAAA,UAAA,CAAW,OAAO,CAAA,GAAI,QAAA,CAAS,UAAA,CAAW,OAAO,GAAG,QAAQ,CAAA;AAAA,MAC9D,CAAA,MAEK;AACH,QAAA,aAAA,CAAc,YAAY,QAAQ,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AAaO,IAAM,aAAA,GAAwC;AAAA,EACnD,IAAA,EAAM,gBAAA;AAAA,EACN,YAAA,EAAc,CAAC,UAAA,KAAe;AAC5B,IAAA,aAAA,CAAc,YAAY,qBAAqB,CAAA;AAC/C,IAAA,OAAO,UAAA;AAAA,EACT;AACF;AAgBO,SAAS,gCACd,QAAA,EACwB;AACxB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,uBAAA;AAAA,IACN,YAAA,EAAc,CAAC,UAAA,KAAe;AAC5B,MAAA,aAAA,CAAc,YAAY,QAAQ,CAAA;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,GACF;AACF;;;AC3FO,IAAM,oBAAA,GAAiD,CAAC,aAAa;AAgBrE,SAAS,qBAAA,CACd,EAAA,EACA,mBAAA,GAAgD,EAAC,EAC3C;AACN,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,oBAAA,EAAsB,GAAG,mBAAmB,CAAA;AAEzE,EAAA,KAAA,MAAW,gBAAgB,gBAAA,EAAkB;AAC3C,IAAA,EAAA,CAAG,oBAAA,CAAqB;AAAA,MACtB,MAAM,YAAA,CAAa,IAAA;AAAA,MACnB,cAAc,YAAA,CAAa;AAAA,KAC5B,CAAA;AAAA,EACH;AACF;;;AC/BA,IAAM,sBAAA,GAAyB,EAAA;AAK/B,SAAS,YAAY,KAAA,EAAyB;AAC5C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA;AAGvC,EAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,MAAM,QAAA,CAAS,YAAY,CAAA,IAAK,KAAA,CAAM,SAAS,aAAa,CAAA;AAAA,EACrE,CAAC,CAAA;AACD,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,MAAM,QAAA,CAAS,YAAY,CAAA,IAAK,KAAA,CAAM,SAAS,aAAa,CAAA;AAAA,EACrE,CAAC,CAAA;AACD,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,aAAa,CAAA;AAChE,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,KAAA,KAAU,aAAa,KAAA,KAAU,aAAA;AAAA,EAC1C,CAAC,CAAA;AACD,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,QAAA;AAC/E;AAuBO,IAAM,YAAA,GAAoC;AAAA,EAC/C,IAAA,EAAM,eAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,SAAA,EAAW,CAAC,KAAA,EAAO,OAAA,KAAiC;AAClD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA;AACpC,IAAA,MAAM,YAAA,GAAe,SAAS,cAAA,IAAkB,sBAAA;AAGhD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,CAAA,EAAG,QAAQ,YAAY,CAAA,GAAA,CAAA;AAAA,IAChC;AAGA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AACrD,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACxC,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,CAAA,EAAG,WAAW,YAAY,CAAA,GAAA,CAAA;AAAA,IACnC;AAGA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AChGA,IAAM,aAAA,GAAwC;AAAA,EAC5C,IAAA,EAAM,GAAA;AAAA,EACN,QAAA,EAAU,GAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,GAAA;AAAA,EACP,MAAA,EAAQ,GAAA;AAAA,EACR,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ,GAAA;AAAA,EACR,QAAA,EAAU,GAAA;AAAA,EACV,QAAA,EAAU,GAAA;AAAA,EACV,IAAA,EAAM,GAAA;AAAA,EACN,SAAA,EAAW,GAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,KAAA,EAAO,GAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAKA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA;AAGvC,EAAA,IAAI,SAAA,KAAc,YAAA,IAAgB,SAAA,KAAc,QAAA,EAAU;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,KAAA,KAAU,gBAAgB,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,IAAK,KAAA,CAAM,SAAS,YAAY,CAAA;AAAA,EAC/F,CAAC,CAAA;AAED,EAAA,OAAO,iBAAA,IAAqB,KAAA;AAC9B;AAuBO,IAAM,kBAAA,GAA0C;AAAA,EACrD,IAAA,EAAM,qBAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ,YAAA;AAAA,EACR,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA;AAGpC,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACxC,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,MAAM,aAAa,KAAA,CAAM,WAAA,EAAY,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AAC5D,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe,UAAU,CAAA,EAAG;AAE5C,QAAA,MAAM,WAAA,GAAc,cAAc,UAAU,CAAA;AAC5C,QAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,UAAA,OAAO,WAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AC9FA,IAAMC,uBAAAA,GAAyB,EAAA;AAK/B,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,IAAA;AAGvC,EAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,CAAC,IAAA,KAAS;AACnD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,WAAA,EAAY;AACvC,IAAA,OAAO,KAAA,KAAU,gBAAgB,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,IAAK,KAAA,CAAM,SAAS,YAAY,CAAA;AAAA,EAC/F,CAAC,CAAA;AAGD,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,aAAa,CAAA;AAEhE,EAAA,OAAA,CAAQ,iBAAA,IAAqB,WAAW,kBAAA,IAAsB,KAAA,CAAA;AAChE;AAuBO,IAAM,kBAAA,GAA0C;AAAA,EACrD,IAAA,EAAM,qBAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ,YAAA;AAAA,EACR,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA;AAGpC,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,KAAA,GAAQA,uBAAAA;AAAA,IACjB;AAGA,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,MAAA,OAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,GAAI,GAAA;AAAA,IACpC;AAGA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AACxC,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC3B,QAAA,IAAI,YAAY,CAAA,EAAG;AACjB,UAAA,OAAO,QAAA;AAAA,QACT;AACA,QAAA,OAAO,QAAA,GAAWA,uBAAAA;AAAA,MACpB;AAAA,IACF;AAGA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACvEO,IAAM,SAAA,GAAiC;AAAA,EAC5C,IAAA,EAAM,YAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,CAAC,KAAA,KAAU;AACpB,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,GAAG,EAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,WAAA,EAAY;AAAA,EAC7D;AACF;;;ACZO,IAAM,iBAAA,GAA2C;AAAA,EACtD,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF;AAgBO,SAAS,kBAAA,CACd,EAAA,EACA,gBAAA,GAA0C,EAAC,EACrC;AACN,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,iBAAA,EAAmB,GAAG,gBAAgB,CAAA;AAEhE,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,EAAA,CAAG,iBAAA,CAAkB;AAAA,MACnB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,QAAQ,SAAA,CAAU,MAAA;AAAA,MAClB,WAAW,SAAA,CAAU;AAAA,KACtB,CAAA;AAAA,EACH;AACF;;;AC7BA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,0BAAA;AAAA,EACA,+BAAA;AAAA,EACA,4BAAA;AAAA,EACA,2BAAA;AAAA,EACA,2BAAA;AAAA,EACA;AACF,CAAA;AAKA,IAAM,oBAAsC,CAAC,KAAA,EAAO,MAAM,IAAA,EAAM,MAAA,EAAQ,aAAa,MAAM,CAAA;AA2BpF,SAAS,2BAAA,CACd,UAAA,EACA,OAAA,GAA0C,EAAC,EACjC;AACV,EAAA,MAAM;AAAA,IACJ,MAAA,GAAS,uBAAA;AAAA,IACT,MAAA,GAAS,WAAW,MAAA,CAAO,MAAA;AAAA,IAC3B,SAAA,GAAY,WAAW,MAAA,CAAO,SAAA;AAAA,IAC9B,YAAA,GAAe,UAAA,CAAW,MAAA,CAAO,YAAA,IAAgB,EAAA;AAAA,IACjD,gBAAA,GAAmB,UAAA,CAAW,MAAA,CAAO,gBAAA,IAAoB,IAAA;AAAA,IACzD,SAAA,GAAY,iBAAA;AAAA,IACZ,OAAA,GAAU,UAAA,CAAW,MAAA,CAAO,KAAA,IAAS;AAAA,GACvC,GAAI,OAAA;AAEJ,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvB,GAAA,EAAK;AAAA,MACH,SAAA,EAAW,UAAU,SAAA,GAAY,SAAA;AAAA,MACjC,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,aAAA,EAAe,CAAC,gBAAgB,CAAA;AAAA,IAChC,MAAA;AAAA,IACA,WAAW;AAAC,GACd;AAGA,EAAA,MAAM,sBAAsB,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,GAAI,SAAA,GAAY,GAAG,SAAS,CAAA,CAAA,CAAA;AAE9E,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,SAAA,IAAa,EAAC;AAG7C,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7B,IAAA,eAAA,CAAgB,KAAK,CAAA,GAAI;AAAA,MACvB,cAAA,EAAgB,YAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,IAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,eAAA;AAAA,UACb,MAAA,EAAQ,6BAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,MAAA;AAAA,YACA;AAAA;AACF;AACF;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,IAAA,eAAA,CAAgB,IAAI,CAAA,GAAI;AAAA,MACtB,cAAA,EAAgB,WAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,GAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,WAAA;AAAA,UACb,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS,EAAE,gBAAA;AAAiB,SAC9B;AAAA,QACA;AAAA,UACE,WAAA,EAAa,YAAA;AAAA,UACb,MAAA,EAAQ,mBAAA;AAAA,UACR,OAAA,EAAS,EAAE,gBAAA;AAAiB;AAC9B;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,IAAA,eAAA,CAAgB,IAAI,CAAA,GAAI;AAAA,MACtB,cAAA,EAAgB,WAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,GAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,WAAA;AAAA,UACb,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS,EAAE,gBAAA;AAAiB,SAC9B;AAAA,QACA;AAAA,UACE,WAAA,EAAa,aAAA;AAAA,UACb,MAAA,EAAQ;AAAA;AACV;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,eAAA,CAAgB,MAAM,CAAA,GAAI;AAAA,MACxB,cAAA,EAAgB,aAAA;AAAA,MAChB,SAAA,EAAW,WAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,iBAAA;AAAA,UACb,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,gBAAA;AAAA,YACA,cAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,EAAG;AACnC,IAAA,eAAA,CAAgB,WAAW,CAAA,GAAI;AAAA,MAC7B,cAAA,EAAgB,aAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,KAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL;AAAA,UACE,WAAA,EAAa,iBAAA;AAAA,UACb,MAAA,EAAQ,gBAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,gBAAA;AAAA,YACA,cAAA,EAAgB;AAAA;AAClB;AACF;AACF,KACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,eAAA,CAAgB,MAAM,CAAA,GAAI;AAAA,MACxB,cAAA,EAAgB,IAAA;AAAA,MAChB,SAAA,EAAW,GAAG,mBAAmB,CAAA,KAAA,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,QACL,EAAE,WAAA,EAAa,aAAA,EAAe,MAAA,EAAQ,WAAA,EAAY;AAAA,QAClD,EAAE,WAAA,EAAa,oBAAA,EAAsB,MAAA,EAAQ,aAAA;AAAc;AAC7D,KACF;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,SAAA,GAAY,eAAA;AACnB,EAAA,OAAO,MAAA;AACT;AAsBO,SAAS,WAAA,CACd,EAAA,EACA,OAAA,GAA0C,EAAC,EACrC;AACN,EAAA,MAAM,EAAE,gBAAA,GAAmB,EAAC,EAAG,aAAA,GAAgB,EAAC,EAAG,mBAAA,GAAsB,EAAC,EAAE,GAAI,OAAA;AAGhF,EAAA,kBAAA,CAAmB,IAAI,gBAAgB,CAAA;AACvC,EAAA,uBAAA,CAAwB,EAAE,CAAA;AAC1B,EAAA,eAAA,CAAgB,IAAI,aAAa,CAAA;AACjC,EAAA,qBAAA,CAAsB,IAAI,mBAAmB,CAAA;AAC/C;AAyBO,SAAS,oBAAA,CACd,EAAA,EACA,UAAA,EACA,OAAA,GAA0C,EAAC,EACjC;AACV,EAAA,WAAA,CAAY,IAAI,OAAO,CAAA;AACvB,EAAA,OAAO,2BAAA,CAA4B,YAAY,OAAO,CAAA;AACxD;AC3OA,eAAsB,aAAa,OAAA,EAAgD;AACjF,EAAA,MAAM;AAAA,IACJ,SAAA;AAAA,IACA,OAAA,GAAU,CAAC,UAAU,CAAA;AAAA,IACrB,OAAA,GAAU,CAAC,oBAAA,EAAsB,YAAY;AAAA,GAC/C,GAAI,OAAA;AAGJ,EAAA,MAAM,EAAE,OAAA,EAAS,EAAA,EAAG,GAAI,MAAM,OAAO,WAAW,CAAA;AAGhD,EAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,OAAA,EAAS;AAAA,IAC9B,GAAA,EAAK,SAAA;AAAA,IACL,MAAA,EAAQ,OAAA;AAAA,IACR,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACZ,CAAA;AAGD,EAAA,MAAM,WAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,YAAY,KAAA,EAAO;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU1B,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQI,aAAS,QAAQ,CAAA;AAG/B,MAAA,MAAM,WAAWE,cAAAA,CAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AAEzD,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,QAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,cAAc,KAAA,CAAM;AAAA,OACrB,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAA2B,QAAQ,CAAA,CAAE,CAAA;AAAA,IACpD;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAC,CAAA;AAE5D,EAAA,OAAO,QAAA;AACT;AAQO,SAAS,YAAY,QAAA,EAAqC;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUN,gBAAAA,CAAa,QAAA,EAAU,OAAO,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQI,aAAS,QAAQ,CAAA;AAC/B,IAAA,MAAM,WAAWE,cAAAA,CAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AAEzD,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAc,KAAA,CAAM;AAAA,KACtB;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9EO,SAAS,gBAAgB,KAAA,EAAuB;AAErD,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AACzB,IAAA,SAAA,GAAY,QAAQ,SAAS,CAAA,CAAA;AAAA,EAC/B;AAEA,EAAA,OACE,SAAA,CAEG,KAAA,CAAM,eAAe,CAAA,CAErB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAEhC,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,CAExE,IAAA,CAAK,EAAE,CAAA;AAEd;AAeO,SAAS,WAAW,KAAA,EAAuB;AAChD,EAAA,OACE,MAEG,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CAEzB,QAAQ,QAAA,EAAU,KAAK,CAAA,CAEvB,OAAA,CAAQ,OAAO,GAAG,CAAA,CAElB,QAAQ,IAAA,EAAM,EAAE,EAEhB,WAAA,EAAY;AAEnB;AAQO,SAAS,gBAAgB,IAAA,EAAuB;AAErD,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,EAAG;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,kBAAkB,QAAA,EAA0B;AAC1D,EAAA,OAAO,QAAA,CACJ,QAAQ,gBAAA,EAAkB,GAAG,EAC7B,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,WAAA,EAAY;AACjB;;;AChFO,SAAS,SAAS,GAAA,EAA4B;AACnD,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,GAAA;AAG9B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAA;AAC9C,EAAA,MAAM,aAAA,GAAgB,QAAA,GAAW,CAAC,CAAA,IAAK,EAAA;AAGvC,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,MAAM,SAAA,GAAY,2CAAA;AAElB,EAAA,KAAA,MAAW,SAAA,IAAa,aAAA,CAAc,QAAA,CAAS,SAAS,CAAA,EAAG;AACzD,IAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,UAAU,CAAC,CAAA;AACzB,IAAA,IAAI,GAAA,IAAO,UAAU,MAAA,EAAW;AAC9B,MAAA,MAAA,CAAO,OAAO,UAAA,EAAY,EAAE,CAAC,GAAG,GAAG,OAAO,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAU,UAAA,CAAW,SAAS,CAAA,IAAK,EAAA;AACvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,QAAQ,UAAA,CAAW,OAAO,GAAG,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,IAAK,IAAA;AAC7D,IAAA,MAAM,SAAS,UAAA,CAAW,QAAQ,GAAG,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,IAAK,IAAA;AAC/D,IAAA,OAAA,GAAU,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,KAAA,CAAM,8BAA8B,CAAA;AACtE,EAAA,MAAM,YAAA,GAAe,iBAAA,GAAoB,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAGvD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,0BAA0B,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAG5B,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,wBAAwB,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,YAAY,CAAC,CAAA;AAGjC,EAAA,MAAM,IAAA,GAAO,kBAAkB,QAAQ,CAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,gBAAgB,QAAQ,CAAA;AAE9C,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO,WAAW,OAAO,CAAA;AAAA,IACzB,MAAA,EAAQ,WAAW,QAAQ,CAAA;AAAA,IAC3B,YAAA;AAAA,IACA,WAAA,EAAa,OAAA;AAAA,IACb,UAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAQO,SAAS,cAAc,QAAA,EAAqC;AACjE,EAAA,OAAO,QAAA,CAAS,IAAI,QAAQ,CAAA;AAC9B;AAUO,SAAS,iBAAiB,GAAA,EAAqB;AACpD,EAAA,OACE,GAAA,CAEG,OAAA;AAAA,IACC,kLAAA;AAAA,IACA,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,KAAO,EAAA,GAAK,GAAG,WAAA;AAAY,GACrC,CAEC,QAAQ,UAAA,EAAY,aAAa,EACjC,OAAA,CAAQ,aAAA,EAAe,WAAW,CAAA,CAClC,OAAA,CAAQ,cAAA,EAAgB,YAAY,CAAA,CAEpC,OAAA,CAAQ,kBAAA,EAAoB,uBAAuB,CAAA,CACnD,OAAA,CAAQ,kBAAkB,qBAAqB,CAAA,CAE/C,OAAA,CAAQ,mCAAA,EAAqC,eAAe,CAAA;AAEnE;AAQO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,mBAAmB,CAAA;AAC3C,EAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,IAAK,WAAA;AACvB;;;ACrHA,cAAA,EAAA;ACoBO,IAAM,oBAAA,GAAqC,CAAC,IAAA,KAAS;AAC1D,EAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,IAAA,CAAK,YAAY,CAAA;AAEzD,EAAA,OAAO,CAAA;AAAA,GAAA,EACJ,KAAK,aAAa,CAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA,iBAAA,EASJ,KAAK,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,aAAA,EAOtB,IAAA,CAAK,aAAa,CAAA,mCAAA,EAAsC,IAAA,CAAK,aAAa,CAAA;AAAA,qBAAA,EAClE,KAAK,KAAA,GAAQ,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK,MAAM,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAI5C,KAAK,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EASrB,cAAc;AAAA;AAAA;AAAA;;AAAA,EAKpB,IAAA,CAAK,aAAa,CAAA,gBAAA,EAAmB,IAAA,CAAK,aAAa,CAAA;;AAAA,eAAA,EAExC,KAAK,aAAa,CAAA;AAAA,CAAA;AAEnC;AAOO,IAAM,yBAAA,GAA2C,CAAC,KAAA,KAAU,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAMjE,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,YAAY,IAAA,CAAK,aAAa,CAAA,WAAA,EAAc,IAAA,CAAK,aAAa,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA;AAAA;AAWhG,IAAM,yBAAA,GAA2C,CAAC,KAAA,KAAU,CAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBjE,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,EAMpD,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,GAAA,EAAM,IAAA,CAAK,IAAI,CAAA,iBAAA,CAAmB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAalE,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,WAAA,EAAc,KAAK,IAAI,CAAA,mBAAA,EAAsB,IAAA,CAAK,aAAa,gBAAgB,IAAA,CAAK,OAAO,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAoBnI,eAAsB,kBAAA,CACpB,KAAA,EACA,SAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,oBAAA;AAAA,IACX,aAAA,GAAgB,yBAAA;AAAA,IAChB,aAAA,GAAgB,yBAAA;AAAA,IAChB,MAAA,GAAS;AAAA,GACX,GAAI,OAAA;AAEJ,EAAA,MAAM,YAA6B,EAAC;AAGpC,EAAA,IAAI,CAAC,MAAA,IAAU,CAACL,cAAAA,CAAW,SAAS,CAAA,EAAG;AACrC,IAAAU,aAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1C;AAGA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,SAAS,IAAI,CAAA;AAC1B,IAAA,MAAM,aAAaR,UAAAA,CAAK,SAAA,EAAW,CAAA,EAAG,IAAA,CAAK,aAAa,CAAA,IAAA,CAAM,CAAA;AAE9D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAAU,iBAAAA,CAAc,UAAA,EAAY,IAAA,EAAM,OAAO,CAAA;AAAA,IACzC;AAEA,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,IAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,SAAA,GAAY,cAAc,KAAK,CAAA;AACrC,EAAA,MAAM,SAAA,GAAYV,UAAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAE5C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAAU,iBAAAA,CAAc,SAAA,EAAW,SAAA,EAAW,OAAO,CAAA;AAAA,EAC7C;AAEA,EAAA,SAAA,CAAU,IAAA,CAAK;AAAA,IACb,IAAA,EAAM,OAAA;AAAA,IACN,aAAA,EAAe,OAAA;AAAA,IACf,IAAA,EAAM,SAAA;AAAA,IACN,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,GACT,CAAA;AAGD,EAAA,MAAM,SAAA,GAAY,cAAc,KAAK,CAAA;AACrC,EAAA,MAAM,SAAA,GAAYV,UAAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAE5C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAAU,iBAAAA,CAAc,SAAA,EAAW,SAAA,EAAW,OAAO,CAAA;AAAA,EAC7C;AAEA,EAAA,SAAA,CAAU,IAAA,CAAK;AAAA,IACb,IAAA,EAAM,OAAA;AAAA,IACN,aAAA,EAAe,OAAA;AAAA,IACf,IAAA,EAAM,SAAA;AAAA,IACN,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,OAAO,SAAA;AACT;ACnLA,eAAsB,iBAAA,CACpB,KAAA,EACA,SAAA,EACA,OAAA,GAAyB,EAAC,EACA;AAC1B,EAAA,MAAM,EAAE,QAAA,GAAW,YAAA,EAAc,kBAAkB,IAAA,EAAM,MAAA,GAAS,OAAM,GAAI,OAAA;AAE5E,EAAA,MAAM,YAA6B,EAAC;AAGpC,EAAA,IAAI,CAAC,MAAA,IAAU,CAACZ,cAAAA,CAAW,SAAS,CAAA,EAAG;AACrC,IAAAU,aAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,UAAU,KAAA,CACb,GAAA;AAAA,IACC,CAAC,IAAA,KAAS,CAAA,cAAA,EAAiB,KAAK,IAAI,CAAA,WAAA,EAAc,KAAK,OAAO,CAAA;AAAA,IAAA,EAC9D,KAAK,YAAY;AAAA,WAAA;AAAA,GAEnB,CACC,KAAK,IAAI,CAAA;AAGZ,EAAA,MAAM,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAIR,MAAM,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,OAAO;AAAA;AAAA;AAAA,CAAA;AAKP,EAAA,MAAM,UAAA,GAAaR,UAAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAE3C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAAU,iBAAAA,CAAc,UAAA,EAAY,UAAA,EAAY,OAAO,CAAA;AAAA,EAC/C;AAEA,EAAA,SAAA,CAAU,IAAA,CAAK;AAAA,IACb,IAAA,EAAM,QAAA;AAAA,IACN,aAAA,EAAe,QAAA;AAAA,IACf,IAAA,EAAM,UAAA;AAAA,IACN,UAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACT,CAAA;AAGD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,KAAA,EAAO,QAAQ,CAAA;AACrD,IAAA,MAAM,SAAA,GAAYV,UAAAA,CAAK,SAAA,EAAW,qBAAqB,CAAA;AAEvD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAAU,iBAAAA,CAAc,SAAA,EAAW,SAAA,EAAW,OAAO,CAAA;AAAA,IAC7C;AAEA,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,IAAA,EAAM,SAAA;AAAA,MACN,aAAA,EAAe,SAAA;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,UAAA,EAAY,SAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,mBAAA,CAAoB,OAAuB,cAAA,EAAgC;AAClF,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAsBW,MAAM,MAAM,CAAA;;AAAA;AAAA;AAAA,gBAAA,EAId,cAAc,CAAA;AAAA;;AAAA;AAAA;AAAA,EAK9B,KAAA,CACC,GAAA;AAAA,IACC,CAAC,IAAA,KAAS,CAAA;AAAA,mCAAA,EACuB,cAAc,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA;AAAA,8BAAA,EAChC,KAAK,IAAI,CAAA;AAAA,UAAA;AAAA,GAEvC,CACC,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,CAAA;AAKb;;;ACrHA,eAAsB,UAAA,CACpB,MAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,SAAA,KAAc,UAAU,OAAA,GAAU,YAAA;AACrE,EAAA,MAAM,EAAE,UAAU,CAAC,aAA2B,GAAG,KAAA,EAAO,UAAA,EAAY,MAAA,GAAS,KAAA,EAAM,GAAI,OAAA;AAEvF,EAAA,MAAM,MAAA,GAA0B;AAAA,IAC9B,OAAA,EAAS,KAAA;AAAA,IACT,OAAO,EAAC;AAAA,IACR,UAAA,EAAY,CAAA;AAAA,IACZ,YAAA,EAAc,CAAA;AAAA,IACd,kBAAA,EAAoB,CAAA;AAAA,IACpB,QAAQ,EAAC;AAAA,IACT,UAAU,EAAC;AAAA,IACX,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa;AAAA,MAClC,SAAA,EAAW,OAAO,KAAA,CAAM;AAAA,KACzB,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,SAAS,IAAA,CAAK;AAAA,QACnB,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS,CAAA,sBAAA,EAAyB,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAAA,OACzD,CAAA;AACD,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AACjB,MAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC/B,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,aAAA,GAAgB,UAAA,GAClB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,UAAA,CAAW,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAC,CAAA,GACtD,QAAA;AAGJ,IAAA,MAAM,WAAA,GAAc,cAAc,aAAa,CAAA;AAG/C,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,MAAA,CAAO,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,UAAA,GAAyB;AAAA,QAC7B,SAAA,EAAW;AAAA,OACb;AACA,MAAA,cAAA,GAAiB,MAAM,gBAAA,CAAiB,WAAA,EAAa,aAAA,EAAe,UAAU,CAAA;AAG9E,MAAA,MAAM,cAAA,GAAiB,eAAe,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,aAAA,EAAe,CAAC,CAAA;AACjF,MAAA,MAAA,CAAO,qBACL,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,cAAA,GAAiB,eAAe,MAAA,GAAS,CAAA;AAAA,IACzE,CAAA,MAAO;AAEL,MAAA,MAAM,EAAE,gBAAA,EAAAc,iBAAAA,EAAiB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AACnC,MAAA,cAAA,GAAiB,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AAClD,QAAA,MAAM,OAAA,GAAU,cAAc,KAAK,CAAA;AACnC,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAA,CAAO,QAAQ,CAAA,CAAE,CAAA;AAAA,QAC3D;AACA,QAAA,OAAOA,iBAAAA,CAAiB,QAAQ,OAAO,CAAA;AAAA,MACzC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAA,CAAO,aAAa,cAAA,CAAe,MAAA;AAGnC,IAAA,MAAM,YAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,SAAA,GAAYxB,UAAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAW,MAAM,CAAA;AAErD,MAAA,QAAQ,MAAA;AAAQ,QACd,KAAK,OAAA;AACH,UAAA,SAAA,CAAU,IAAA,CAAK,GAAI,MAAM,kBAAA,CAAmB,gBAAgB,SAAA,EAAW,EAAE,MAAA,EAAQ,CAAE,CAAA;AACnF,UAAA;AAAA,QAEF,KAAK,KAAA;AAAA,QACL,KAAK,YAAA;AACH,UAAA,SAAA,CAAU,IAAA,CAAK,GAAI,MAAM,iBAAA,CAAkB,gBAAgB,SAAA,EAAW,EAAE,MAAA,EAAQ,CAAE,CAAA;AAClF,UAAA;AAAA,QAEF;AACE,UAAA,MAAA,CAAO,SAAS,IAAA,CAAK;AAAA,YACnB,IAAA,EAAM,GAAA;AAAA,YACN,OAAA,EAAS,mBAAmB,MAAM,CAAA;AAAA,WACnC,CAAA;AAAA;AACL,IACF;AAEA,IAAA,MAAA,CAAO,KAAA,GAAQ,SAAA;AACf,IAAA,MAAA,CAAO,YAAA,GAAe,MAAA,GAAS,CAAA,GAAI,SAAA,CAAU,MAAA;AAC7C,IAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,EACnB,SAAS,KAAA,EAAO;AACd,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK;AAAA,MACjB,IAAA,EAAM,GAAA;AAAA,MACN,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,MAClD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC/B,EAAA,OAAO,MAAA;AACT;ACzIO,SAAS,cAAA,GAAyB;AACvC,EAAA,MAAM,WAAA,GAAcyB,iBAAA,CAAc,2PAAe,CAAA;AACjD,EAAA,OAAOb,aAAAA,CAAQL,aAAAA,CAAQ,WAAW,CAAA,EAAG,IAAI,CAAA;AAC3C;AAQO,SAAS,eAAe,QAAA,EAA4B;AACzD,EAAA,OAAOK,aAAAA,CAAQ,OAAA,CAAQ,GAAA,EAAI,EAAG,GAAG,QAAQ,CAAA;AAC3C;AAQO,SAAS,WAAW,UAAA,EAA6B;AACtD,EAAA,IAAI;AAEF,IAAA,OAAOd,eAAW,UAAU,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,YAAY,UAAA,EAA6B;AACvD,EAAA,IAAI;AAEF,IAAA,IAAI,CAACA,cAAAA,CAAW,UAAU,CAAA,EAAG;AAC3B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAOG,YAAAA,CAAS,UAAU,CAAA,CAAE,WAAA,EAAY;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,OAAO,UAAA,EAA6B;AAClD,EAAA,IAAI;AAEF,IAAA,IAAI,CAACH,cAAAA,CAAW,UAAU,CAAA,EAAG;AAC3B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAOG,YAAAA,CAAS,UAAU,CAAA,CAAE,MAAA,EAAO;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,eAAA,CAAgB,SAAA,GAAoB,OAAA,CAAQ,GAAA,EAAI,EAAkB;AAChF,EAAA,IAAI,OAAA,GAAUW,cAAQ,SAAS,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAOL,cAAQ,OAAO,CAAA;AAE5B,EAAA,OAAO,YAAY,IAAA,EAAM;AACvB,IAAA,MAAM,WAAA,GAAcP,UAAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AAEhD,IAAA,IAAIF,cAAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,OAAO,WAAA;AAAA,IACT;AACA,IAAA,OAAA,GAAUS,cAAQ,OAAO,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,IAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA,EAIpB,KAAK,OAAA,EAAuB;AAE1B,IAAA,OAAA,CAAQ,IAAA,CAAKmB,mBAAA,CAAG,IAAA,CAAK,QAAG,GAAG,OAAO,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAuB;AAE7B,IAAA,OAAA,CAAQ,IAAA,CAAKA,mBAAA,CAAG,KAAA,CAAM,QAAG,GAAG,OAAO,CAAA;AAAA,EACrC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,OAAA,EAAuB;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAKA,mBAAA,CAAG,MAAA,CAAO,QAAG,GAAG,OAAO,CAAA;AAAA,EACtC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,EAAuB;AAC3B,IAAA,OAAA,CAAQ,KAAA,CAAMA,mBAAA,CAAG,GAAA,CAAI,QAAG,GAAG,OAAO,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,OAAA,EAAiB,OAAA,GAAU,KAAA,EAAa;AAC5C,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,OAAA,CAAQ,KAAA,CAAMA,mBAAA,CAAG,IAAA,CAAK,QAAG,GAAG,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AACF;AAQO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,KAAK,GAAA,EAAM;AACb,IAAA,OAAO,GAAG,EAAE,CAAA,EAAA,CAAA;AAAA,EACd;AACA,EAAA,IAAI,KAAK,GAAA,EAAO;AACd,IAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAK,CAAA;AACrC,EAAA,MAAM,OAAA,GAAA,CAAY,EAAA,GAAK,GAAA,GAAS,GAAA,EAAM,QAAQ,CAAC,CAAA;AAC/C,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAC/B;AASO,SAASC,UAAAA,CAA6C,QAAW,MAAA,EAAuB;AAC7F,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAC3B,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAE/B,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AAEtB,IAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAE9B,IAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAE9B,IAAA,IACE,eACA,OAAO,WAAA,KAAgB,QAAA,IACvB,CAAC,MAAM,OAAA,CAAQ,WAAW,CAAA,IAC1B,WAAA,IACA,OAAO,WAAA,KAAgB,QAAA,IACvB,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAC1B;AAEA,MAAA,MAAA,CAAO,GAAG,CAAA,GAAIA,UAAAA;AAAA,QACZ,WAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAA,IAAW,gBAAgB,MAAA,EAAW;AAEpC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT","file":"index.cjs","sourcesContent":["/**\n * SVG optimizer (SVGO integration)\n *\n * Optimizes SVG files using SVGO for smaller file sizes.\n *\n * @packageDocumentation\n */\n\nimport type { OptimizedSVG, ParsedSVG, RawSVGData, SVGOConfig } from '../types.js';\n\n/**\n * Default SVGO configuration\n *\n * Provides sensible defaults for icon optimization.\n */\nexport const defaultSVGOConfig: SVGOConfig = {\n multipass: true,\n plugins: [\n { name: 'preset-default' },\n { name: 'removeXMLNS' },\n { name: 'removeDimensions' },\n { name: 'removeStyleElement' },\n { name: 'removeScriptElement' },\n {\n name: 'removeAttrs',\n params: {\n attrs: ['class', 'style', 'data-name', 'xmlns:xlink'],\n },\n },\n {\n name: 'addAttributesToSVGElement',\n params: {\n attributes: [{ 'aria-hidden': 'true' }, { focusable: 'false' }],\n },\n },\n {\n name: 'sortAttrs',\n params: {\n xmlnsOrder: 'alphabetical',\n },\n },\n ],\n};\n\n/**\n * Optimize a single SVG\n *\n * @param parsed - Parsed SVG data\n * @param raw - Raw SVG data (for size comparison)\n * @param config - SVGO configuration\n * @returns Optimized SVG data\n */\nexport async function optimizeSVG(\n parsed: ParsedSVG,\n raw: RawSVGData,\n config: SVGOConfig = defaultSVGOConfig\n): Promise<OptimizedSVG> {\n // Dynamic import of SVGO\n const svgo = await import('svgo');\n\n // Merge plugins with defaults if provided\n const plugins = config.plugins ?? defaultSVGOConfig.plugins ?? [];\n\n // Convert our plugin format to SVGO's expected format\n const svgoPlugins = plugins.map((p) => ({\n name: p.name,\n ...(p.params ? { params: p.params } : {}),\n }));\n\n // Run SVGO optimization\n const result = svgo.optimize(raw.content, {\n multipass: config.multipass ?? true,\n plugins: svgoPlugins as NonNullable<Parameters<typeof svgo.optimize>[1]>['plugins'],\n });\n\n const optimizedContent = result.data;\n const optimizedSize = Buffer.byteLength(optimizedContent, 'utf-8');\n const sizeReduction =\n raw.originalSize > 0 ? ((raw.originalSize - optimizedSize) / raw.originalSize) * 100 : 0;\n\n // Re-parse optimized content to get updated inner content\n const innerContentMatch = optimizedContent.match(/<svg[^>]*>([\\s\\S]*?)<\\/svg>/i);\n const innerContent = innerContentMatch?.[1]?.trim() ?? parsed.innerContent;\n\n // Extract updated viewBox\n const viewBoxMatch = optimizedContent.match(/viewBox=[\"']([^\"']*)[\"']/i);\n const viewBox = viewBoxMatch?.[1] ?? parsed.viewBox;\n\n return {\n ...parsed,\n innerContent,\n fullContent: optimizedContent,\n viewBox,\n optimizedSize,\n sizeReduction,\n };\n}\n\n/**\n * Optimize multiple SVGs\n *\n * @param parsedFiles - Array of parsed SVG data\n * @param rawFiles - Array of raw SVG data\n * @param config - SVGO configuration\n * @returns Array of optimized SVG data\n */\nexport async function optimizeSVGFiles(\n parsedFiles: ParsedSVG[],\n rawFiles: RawSVGData[],\n config: SVGOConfig = defaultSVGOConfig\n): Promise<OptimizedSVG[]> {\n const results: OptimizedSVG[] = [];\n\n for (const parsed of parsedFiles) {\n const raw = rawFiles.find((r) => r.fileName === parsed.fileName);\n if (!raw) {\n throw new Error(`Raw file not found for ${parsed.fileName}`);\n }\n const optimized = await optimizeSVG(parsed, raw, config);\n results.push(optimized);\n }\n\n return results;\n}\n\n/**\n * Skip optimization and just add size metadata\n *\n * Useful when SVGO is not needed but the type structure is required.\n *\n * @param parsed - Parsed SVG data\n * @param raw - Raw SVG data\n * @returns Optimized SVG data (without actual optimization)\n */\nexport function skipOptimization(parsed: ParsedSVG, raw: RawSVGData): OptimizedSVG {\n return {\n ...parsed,\n optimizedSize: raw.originalSize,\n sizeReduction: 0,\n };\n}\n","/**\n * Package version\n */\nexport const version = '0.0.1';\n","/**\n * @fileoverview Zod schemas for DSAI Tools configuration validation\n *\n * Provides comprehensive runtime validation for all configuration options.\n * Schemas mirror the TypeScript types in types.ts for type safety.\n *\n * @module @dsai-io/tools/config/schema\n * @see {@link ./types.ts} for TypeScript type definitions\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Primitive Schemas\n// ============================================================================\n\n/**\n * Log level for CLI output verbosity\n */\nexport const logLevelSchema = z.enum(['silent', 'error', 'warn', 'info', 'debug', 'verbose']);\n\n/**\n * Output format for token/build outputs\n */\nexport const outputFormatSchema = z.enum(['css', 'scss', 'less', 'json', 'js', 'ts', 'esm', 'cjs']);\n\n/**\n * Supported frontend frameworks for generated code\n */\nexport const frameworkSchema = z.enum(['react', 'vue', 'angular', 'svelte', 'vanilla']);\n\n/**\n * File hash type for cache busting\n */\nexport const hashTypeSchema = z.enum(['content', 'timestamp', 'version', 'none']);\n\n// ============================================================================\n// Utility Schemas\n// ============================================================================\n\n/**\n * Glob pattern for file matching\n * Must be a non-empty string\n */\nexport const globPatternSchema = z.string().min(1, 'Glob pattern cannot be empty');\n\n/**\n * File path validation\n * Allows relative or absolute paths\n */\nexport const filePathSchema = z.string().min(1, 'File path cannot be empty');\n\n/**\n * Semantic version validation (loose)\n * Matches x.y.z format with optional pre-release\n */\nexport const versionSchema = z.string().refine(\n (val) => {\n const parts = val.split('-');\n const version = parts[0] ?? '';\n const preRelease = parts[1];\n const versionParts = version.split('.');\n if (versionParts.length !== 3) {\n return false;\n }\n for (const part of versionParts) {\n const num = Number(part);\n if (!Number.isInteger(num) || num < 0) {\n return false;\n }\n }\n if (preRelease !== undefined && preRelease.length === 0) {\n return false;\n }\n return true;\n },\n { message: 'Invalid semantic version format' }\n);\n\n// ============================================================================\n// Transform and Format Schemas\n// ============================================================================\n\n/**\n * Custom transform function schema\n * For token value transformations\n */\nexport const customTransformSchema = z.object({\n name: z.string().min(1, 'Transform name is required'),\n description: z.string().optional(),\n type: z.enum(['value', 'attribute', 'name']).optional().default('value'),\n transform: z.function().args(z.any(), z.any()).returns(z.any()).optional(),\n filter: z.function().args(z.any()).returns(z.boolean()).optional(),\n matcher: z.function().args(z.any()).returns(z.boolean()).optional(),\n});\n\n/**\n * Custom format schema for output generation\n */\nexport const customFormatSchema = z.object({\n name: z.string().min(1, 'Format name is required'),\n description: z.string().optional(),\n formatter: z.function().args(z.any()).returns(z.string()).optional(),\n extension: z.string().min(1).optional(),\n});\n\n// ============================================================================\n// Theme Configuration Schemas\n// ============================================================================\n\n/**\n * Theme mode configuration\n * Controls how themes are generated and applied\n */\nexport const themeModeSchema = z.object({\n selector: z.string().min(1, 'Theme selector is required'),\n mediaQuery: z.string().optional(),\n dataAttribute: z.string().optional(),\n cssVariables: z.boolean().optional().default(true),\n generateSeparateFiles: z.boolean().optional().default(false),\n prefix: z.string().optional(),\n});\n\n/**\n * Themes configuration section\n */\nexport const themesConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n defaultMode: z.enum(['light', 'dark', 'system']).optional().default('light'),\n modes: z\n .record(z.string(), themeModeSchema)\n .optional()\n .default({\n light: { selector: ':root', cssVariables: true, generateSeparateFiles: false },\n dark: {\n selector: '[data-theme=\"dark\"]',\n mediaQuery: '(prefers-color-scheme: dark)',\n cssVariables: true,\n generateSeparateFiles: false,\n },\n }),\n outputFileName: z.string().optional().default('themes'),\n colorScheme: z\n .object({\n light: z.string().optional(),\n dark: z.string().optional(),\n })\n .optional(),\n});\n\n// ============================================================================\n// Icon Configuration Schemas\n// ============================================================================\n\n/**\n * Icon optimization settings\n */\nexport const iconOptimizationSchema = z.object({\n enabled: z.boolean().optional().default(true),\n removeComments: z.boolean().optional().default(true),\n removeDimensions: z.boolean().optional().default(false),\n removeViewBox: z.boolean().optional().default(false),\n removeXMLNS: z.boolean().optional().default(true),\n cleanupIds: z.boolean().optional().default(true),\n minify: z.boolean().optional().default(true),\n});\n\n/**\n * Icon sprite generation settings\n */\nexport const iconSpriteSchema = z.object({\n enabled: z.boolean().optional().default(true),\n fileName: z.string().optional().default('icons'),\n format: z.enum(['symbol', 'stack', 'css']).optional().default('symbol'),\n prefix: z.string().optional().default('icon-'),\n});\n\n/**\n * Icons configuration section\n */\nexport const iconsConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n sourceDir: z.string().optional().default('assets/icons'),\n outputDir: z.string().optional().default('dist/icons'),\n formats: z\n .array(z.enum(['svg', 'react', 'vue', 'sprite', 'font']))\n .optional()\n .default(['svg']),\n optimization: iconOptimizationSchema.optional(),\n sprite: iconSpriteSchema.optional(),\n componentPrefix: z.string().optional().default('Icon'),\n componentSuffix: z.string().optional().default(''),\n generateIndex: z.boolean().optional().default(true),\n generateTypes: z.boolean().optional().default(true),\n});\n\n// ============================================================================\n// Token Configuration Schemas\n// ============================================================================\n\n/**\n * Token build configuration schema\n */\nexport const tokenBuildConfigSchema = z.object({\n format: outputFormatSchema,\n outputDir: z.string().optional(),\n outputFileName: z.string().optional(),\n fileExtension: z.string().optional(),\n prefix: z.string().optional(),\n useVariables: z.boolean().optional(),\n selector: z.string().optional(),\n transforms: z.array(z.string()).optional(),\n customTransforms: z.array(customTransformSchema).optional(),\n filter: z\n .function()\n .args(z.any())\n .returns(z.union([z.boolean(), z.promise(z.boolean())]))\n .optional(),\n header: z.string().optional(),\n footer: z.string().optional(),\n});\n\n/**\n * Token cache configuration\n */\nexport const tokenCacheConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n directory: z.string().optional().default('.cache'),\n hashType: hashTypeSchema.optional().default('content'),\n maxAge: z.number().optional().default(86400000),\n});\n\n/**\n * Token watch mode configuration\n */\nexport const tokenWatchConfigSchema = z.object({\n enabled: z.boolean().optional().default(false),\n debounce: z.number().optional().default(300),\n clearScreen: z.boolean().optional().default(true),\n ignorePatterns: z.array(z.string()).optional().default([]),\n});\n\n/**\n * Token processing hooks\n */\nexport const tokensHooksSchema = z.object({\n onBuildStart: z\n .function()\n .args(z.any())\n .returns(z.union([z.void(), z.promise(z.void())]))\n .optional(),\n onFormatComplete: z\n .function()\n .args(z.any())\n .returns(z.union([z.void(), z.promise(z.void())]))\n .optional(),\n onAllFormatsComplete: z\n .function()\n .args(z.any())\n .returns(z.union([z.void(), z.promise(z.void())]))\n .optional(),\n onBuildComplete: z\n .function()\n .args(z.any())\n .returns(z.union([z.void(), z.promise(z.void())]))\n .optional(),\n onError: z\n .function()\n .args(z.any())\n .returns(z.union([z.void(), z.promise(z.void())]))\n .optional(),\n});\n\n/**\n * Build pipeline step names\n */\nexport const buildPipelineStepSchema = z.enum([\n 'validate',\n 'transform',\n 'style-dictionary',\n 'sync',\n 'sass-theme',\n 'sass-theme-minified',\n 'postprocess',\n 'sass-utilities',\n 'sass-utilities-minified',\n 'bundle',\n]);\n\n/**\n * Build pipeline configuration\n * Controls which steps run and their paths\n */\nexport const tokensBuildPipelineSchema = z.object({\n /**\n * Steps to include in the build.\n * Order matters - steps run in sequence.\n * Default includes all steps for full @dsai-io/tokens build.\n * Simpler packages can use subset like ['validate', 'transform', 'style-dictionary']\n */\n steps: z\n .array(buildPipelineStepSchema)\n .optional()\n .default([\n 'validate',\n 'transform',\n 'style-dictionary',\n 'sync',\n 'sass-theme',\n 'sass-theme-minified',\n 'postprocess',\n 'sass-utilities',\n 'sass-utilities-minified',\n 'bundle',\n ]),\n\n /**\n * Paths configuration for build steps\n */\n paths: z\n .object({\n /** Source file for sync step (Style Dictionary JS output) */\n syncSource: z.string().optional().default('dist/js/tokens.js'),\n /** Target file for sync step */\n syncTarget: z.string().optional().default('src/tokens-flat.ts'),\n /** SCSS theme input file */\n sassThemeInput: z.string().optional().default('src/scss/dsai-theme-bs.scss'),\n /** CSS theme output file */\n sassThemeOutput: z.string().optional().default('dist/css/dsai-theme-bs.css'),\n /** CSS theme minified output file */\n sassThemeMinifiedOutput: z.string().optional().default('dist/css/dsai-theme-bs.min.css'),\n /** SCSS utilities input file */\n sassUtilitiesInput: z.string().optional().default('src/scss/dsai-utilities.scss'),\n /** CSS utilities output file */\n sassUtilitiesOutput: z.string().optional().default('dist/css/dsai.css'),\n /** CSS utilities minified output file */\n sassUtilitiesMinifiedOutput: z.string().optional().default('dist/css/dsai.min.css'),\n })\n .optional(),\n\n /** Style Dictionary config file name */\n styleDictionaryConfig: z.string().optional().default('sd.config.mjs'),\n});\n\n/**\n * Tokens configuration section\n */\nexport const tokensConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n sourcePatterns: z\n .array(z.string())\n .optional()\n .default(['src/tokens/**/*.json', 'src/tokens/**/*.yaml']),\n outputDirs: z\n .object({\n css: z.string().optional().default('dist/css'),\n scss: z.string().optional().default('dist/scss'),\n less: z.string().optional().default('dist/less'),\n js: z.string().optional().default('dist/js'),\n ts: z.string().optional().default('dist/ts'),\n json: z.string().optional().default('dist/json'),\n })\n .optional(),\n additionalScssDirectories: z.array(z.string()).optional().default([]),\n outputFileNames: z\n .object({\n variables: z.string().optional().default('variables'),\n utilities: z.string().optional().default('utilities'),\n mixins: z.string().optional().default('mixins'),\n tokens: z.string().optional().default('tokens'),\n })\n .optional(),\n prefix: z.string().optional().default('dsai'),\n mergeOrder: z.array(z.string()).optional().default(['base', 'semantic', 'component']),\n createBundle: z.boolean().optional().default(true),\n bundleFileName: z.string().optional().default('bundle'),\n formats: z.array(outputFormatSchema).optional().default(['css', 'scss', 'json']),\n platforms: z.record(z.string(), tokenBuildConfigSchema).optional(),\n transforms: z.array(z.string()).optional().default([]),\n customTransforms: z.array(customTransformSchema).optional().default([]),\n customFormats: z.array(customFormatSchema).optional().default([]),\n hooks: tokensHooksSchema.optional(),\n cache: tokenCacheConfigSchema.optional(),\n watch: tokenWatchConfigSchema.optional(),\n verbose: z.boolean().optional().default(false),\n /** Build pipeline configuration */\n pipeline: tokensBuildPipelineSchema.optional(),\n});\n\n// ============================================================================\n// Global Configuration Schemas\n// ============================================================================\n\n/**\n * Global build configuration\n */\nexport const buildConfigSchema = z.object({\n outDir: z.string().optional().default('dist'),\n clean: z.boolean().optional().default(true),\n sourcemap: z.boolean().optional().default(false),\n minify: z.boolean().optional().default(true),\n parallel: z.boolean().optional().default(true),\n maxConcurrency: z.number().optional().default(4),\n});\n\n/**\n * Global configuration section\n */\nexport const globalConfigSchema = z.object({\n logLevel: logLevelSchema.optional().default('info'),\n colors: z.boolean().optional().default(true),\n ci: z.boolean().optional().default(false),\n dryRun: z.boolean().optional().default(false),\n cwd: z.string().optional(),\n configPath: z.string().optional(),\n framework: frameworkSchema.optional(),\n build: buildConfigSchema.optional(),\n});\n\n// ============================================================================\n// Root Configuration Schema\n// ============================================================================\n\n/**\n * DSAI Tools configuration root schema\n *\n * This is the primary schema used for validating configuration files.\n * It combines all section schemas into a complete configuration object.\n */\nexport const dsaiConfigSchema = z.object({\n $schema: z.string().optional(),\n extends: z.union([z.string(), z.array(z.string())]).optional(),\n global: globalConfigSchema.optional(),\n tokens: tokensConfigSchema.optional(),\n themes: themesConfigSchema.optional(),\n icons: iconsConfigSchema.optional(),\n});\n\n// ============================================================================\n// Inferred Types from Schemas\n// ============================================================================\n\n/** Inferred LogLevel type from schema */\nexport type LogLevelFromSchema = z.infer<typeof logLevelSchema>;\n\n/** Inferred OutputFormat type from schema */\nexport type OutputFormatFromSchema = z.infer<typeof outputFormatSchema>;\n\n/** Inferred Framework type from schema */\nexport type FrameworkFromSchema = z.infer<typeof frameworkSchema>;\n\n/** Inferred DsaiConfig type from schema */\nexport type DsaiConfigFromSchema = z.infer<typeof dsaiConfigSchema>;\n\n/** Inferred TokensConfig type from schema */\nexport type TokensConfigFromSchema = z.infer<typeof tokensConfigSchema>;\n\n/** Inferred ThemesConfig type from schema */\nexport type ThemesConfigFromSchema = z.infer<typeof themesConfigSchema>;\n\n/** Inferred IconsConfig type from schema */\nexport type IconsConfigFromSchema = z.infer<typeof iconsConfigSchema>;\n\n/** Inferred GlobalConfig type from schema */\nexport type GlobalConfigFromSchema = z.infer<typeof globalConfigSchema>;\n\n// ============================================================================\n// Validation Functions\n// ============================================================================\n\n/**\n * Validation result with typed data\n */\nexport interface ValidationResult<T> {\n success: boolean;\n data?: T;\n errors?: ValidationError[];\n}\n\n/**\n * Structured validation error\n */\nexport interface ValidationError {\n path: string;\n message: string;\n code: string;\n expected?: string;\n received?: string;\n}\n\n/**\n * Format Zod errors into user-friendly validation errors\n *\n * @param zodError - Zod error object\n * @returns Array of formatted validation errors\n */\nexport function formatValidationErrors(zodError: z.ZodError): ValidationError[] {\n return zodError.errors.map((err) => ({\n path: err.path.join('.') || 'root',\n message: err.message,\n code: err.code,\n expected: 'expected' in err ? String(err.expected) : undefined,\n received: 'received' in err ? String(err.received) : undefined,\n }));\n}\n\n/**\n * Validate configuration object against schema\n *\n * @param config - Configuration object to validate\n * @returns Validation result with typed data or errors\n *\n * @example\n * ```typescript\n * const result = validateConfig({\n * tokens: { enabled: true },\n * themes: { defaultMode: 'dark' }\n * });\n *\n * if (result.success) {\n * console.log(result.data);\n * } else {\n * result.errors?.forEach(err => console.error(err.message));\n * }\n * ```\n */\nexport function validateConfig(config: unknown): ValidationResult<DsaiConfigFromSchema> {\n const result = dsaiConfigSchema.safeParse(config);\n\n if (result.success) {\n return {\n success: true,\n data: result.data,\n };\n }\n\n return {\n success: false,\n errors: formatValidationErrors(result.error),\n };\n}\n\n/**\n * Validate configuration and throw on errors\n *\n * @param config - Configuration object to validate\n * @returns Validated configuration\n * @throws {Error} If validation fails\n *\n * @example\n * ```typescript\n * try {\n * const validConfig = validateConfigOrThrow(rawConfig);\n * // Use validConfig safely\n * } catch (error) {\n * console.error('Invalid configuration:', error.message);\n * }\n * ```\n */\nexport function validateConfigOrThrow(config: unknown): DsaiConfigFromSchema {\n const result = validateConfig(config);\n\n if (!result.success) {\n const errorMessages = result.errors?.map((e) => ` - ${e.path}: ${e.message}`).join('\\n');\n throw new Error(`Configuration validation failed:\\n${errorMessages}`);\n }\n\n return result.data as DsaiConfigFromSchema;\n}\n\n/**\n * Validate a specific section of the configuration\n *\n * @param section - Section name to validate\n * @param config - Section configuration object\n * @returns Validation result for the section\n */\nexport function validateConfigSection<T extends keyof DsaiConfigFromSchema>(\n section: T,\n config: unknown\n): ValidationResult<NonNullable<DsaiConfigFromSchema[T]>> {\n const sectionSchemas = {\n global: globalConfigSchema,\n tokens: tokensConfigSchema,\n themes: themesConfigSchema,\n icons: iconsConfigSchema,\n } as const;\n\n const schema = sectionSchemas[section as keyof typeof sectionSchemas];\n\n if (!schema) {\n return {\n success: false,\n errors: [\n {\n path: section,\n message: `Unknown configuration section: ${section}`,\n code: 'unknown_section',\n },\n ],\n };\n }\n\n const result = schema.safeParse(config);\n\n if (result.success) {\n return {\n success: true,\n data: result.data as NonNullable<DsaiConfigFromSchema[T]>,\n };\n }\n\n return {\n success: false,\n errors: formatValidationErrors(result.error),\n };\n}\n\n/**\n * Create a pretty-printed error message from validation errors\n *\n * @param errors - Array of validation errors\n * @returns Formatted error message string\n */\nexport function formatErrorMessage(errors: ValidationError[]): string {\n const lines = ['Configuration validation failed:', ''];\n\n for (const error of errors) {\n lines.push(` ✗ ${error.path}`);\n lines.push(` ${error.message}`);\n\n if (error.expected && error.received) {\n lines.push(` Expected: ${error.expected}`);\n lines.push(` Received: ${error.received}`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * @fileoverview Default configuration values for DSAI Tools\n *\n * Provides comprehensive default values for all configuration options.\n * These defaults are merged with user configuration during resolution.\n *\n * @module @dsai-io/tools/config/defaults\n */\n\nimport type {\n IconFramework,\n LogLevel,\n OutputFormat,\n ResolvedConfig,\n ResolvedGlobalConfig,\n ResolvedIconsConfig,\n ResolvedThemesConfig,\n ResolvedTokensConfig,\n ThemeSelectorPattern,\n} from './types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default prefix for CSS custom properties\n */\nexport const DEFAULT_PREFIX = '--dsai-';\n\n/**\n * Default log level for CLI output\n */\nexport const DEFAULT_LOG_LEVEL: LogLevel = 'info';\n\n/**\n * Default output directory\n */\nexport const DEFAULT_OUTPUT_DIR = 'dist';\n\n/**\n * Default source directory for tokens (Figma exports)\n */\nexport const DEFAULT_SOURCE_DIR = 'figma-exports';\n\n/**\n * Default collections directory\n */\nexport const DEFAULT_COLLECTIONS_DIR = 'collections';\n\n/**\n * Default icons source directory\n */\nexport const DEFAULT_ICONS_SOURCE_DIR = 'icons';\n\n/**\n * Default icons output directory\n */\nexport const DEFAULT_ICONS_OUTPUT_DIR = 'dist/icons';\n\n// ============================================================================\n// Default Output Configuration\n// ============================================================================\n\n/**\n * Default source patterns for finding Figma exports\n */\nexport const defaultSourcePatterns = ['theme.json', 'tokens.json', '*.tokens.json'];\n\n/**\n * Default output formats for tokens\n */\nexport const defaultFormats: OutputFormat[] = ['css', 'scss', 'js', 'ts', 'json'];\n\n/**\n * Default output file names for each format\n */\nexport const defaultOutputFileNames: Record<OutputFormat, string> = {\n css: 'tokens.css',\n scss: '_tokens.scss',\n js: 'tokens.js',\n ts: 'tokens.ts',\n json: 'tokens.json',\n android: 'tokens.xml',\n ios: 'tokens.h',\n};\n\n// ============================================================================\n// Theme Defaults\n// ============================================================================\n\n/**\n * Default theme selector pattern\n */\nexport const defaultSelectorPattern: Required<ThemeSelectorPattern> = {\n default: ':root',\n others: '[data-dsai-theme=\"{mode}\"]',\n};\n\n/**\n * Default resolved themes configuration\n */\nexport const defaultThemesConfig: ResolvedThemesConfig = {\n autoDetect: true,\n default: 'Light',\n ignoreModes: [],\n selectorPattern: defaultSelectorPattern,\n};\n\n// ============================================================================\n// Icon Defaults\n// ============================================================================\n\n/**\n * Default icon framework\n */\nexport const defaultIconFramework: IconFramework = 'react';\n\n/**\n * Default resolved icons configuration\n */\nexport const defaultIconsConfig: ResolvedIconsConfig = {\n sourceDir: DEFAULT_ICONS_SOURCE_DIR,\n outputDir: DEFAULT_ICONS_OUTPUT_DIR,\n framework: defaultIconFramework,\n typescript: true,\n optimize: true,\n prefix: 'Icon',\n};\n\n// ============================================================================\n// Token Defaults\n// ============================================================================\n\n/**\n * Default resolved tokens configuration\n */\nexport const defaultTokensConfig: ResolvedTokensConfig = {\n source: 'theme',\n sourceDir: DEFAULT_SOURCE_DIR,\n collectionsDir: DEFAULT_COLLECTIONS_DIR,\n sourcePatterns: defaultSourcePatterns,\n collectionMapping: {},\n outputDir: DEFAULT_OUTPUT_DIR,\n outputDirs: {},\n outputFileNames: defaultOutputFileNames,\n prefix: DEFAULT_PREFIX,\n formats: defaultFormats,\n additionalScssDirectories: [],\n additionalCssDirectories: [],\n mergeOrder: 'after',\n createBundle: false,\n themes: defaultThemesConfig,\n transforms: [],\n customFormats: [],\n preprocessors: [],\n filters: [],\n outputReferences: true,\n baseFontSize: 16,\n separateThemeFiles: false,\n watch: false,\n watchDirectories: [],\n};\n\n// ============================================================================\n// Global Defaults\n// ============================================================================\n\n/**\n * Default resolved global configuration\n */\nexport const defaultGlobalConfig: ResolvedGlobalConfig = {\n cwd: process.cwd(),\n debug: false,\n logLevel: DEFAULT_LOG_LEVEL,\n};\n\n// ============================================================================\n// Complete Default Configuration\n// ============================================================================\n\n/**\n * Complete default resolved configuration\n *\n * This is used as the base for merging user configurations.\n * All values have sensible defaults that work for most projects.\n */\nexport const defaultConfig: ResolvedConfig = {\n tokens: defaultTokensConfig,\n icons: defaultIconsConfig,\n global: defaultGlobalConfig,\n configDir: process.cwd(),\n};\n\n// ============================================================================\n// Environment Variable Mappings\n// ============================================================================\n\n/**\n * Mapping of environment variables to configuration paths\n *\n * Format: { ENV_VAR_NAME: 'config.path.to.value' }\n *\n * @example\n * DSAI_LOG_LEVEL=debug → { global: { logLevel: 'debug' } }\n * DSAI_PREFIX=myapp → { tokens: { prefix: 'myapp' } }\n */\nexport const envMappings: Record<string, string> = {\n // Global settings\n DSAI_LOG_LEVEL: 'global.logLevel',\n DSAI_DEBUG: 'global.debug',\n DSAI_CWD: 'global.cwd',\n\n // Token settings\n DSAI_PREFIX: 'tokens.prefix',\n DSAI_SOURCE_DIR: 'tokens.sourceDir',\n DSAI_OUTPUT_DIR: 'tokens.outputDir',\n DSAI_WATCH: 'tokens.watch',\n DSAI_CREATE_BUNDLE: 'tokens.createBundle',\n DSAI_BASE_FONT_SIZE: 'tokens.baseFontSize',\n\n // Theme settings\n DSAI_DEFAULT_THEME: 'tokens.themes.default',\n DSAI_AUTO_DETECT_THEMES: 'tokens.themes.autoDetect',\n\n // Icon settings\n DSAI_ICONS_SOURCE_DIR: 'icons.sourceDir',\n DSAI_ICONS_OUTPUT_DIR: 'icons.outputDir',\n DSAI_ICONS_FRAMEWORK: 'icons.framework',\n DSAI_ICONS_TYPESCRIPT: 'icons.typescript',\n DSAI_ICONS_OPTIMIZE: 'icons.optimize',\n DSAI_ICONS_PREFIX: 'icons.prefix',\n};\n\n/**\n * Environment variables that should be parsed as booleans\n */\nexport const envBooleanKeys: Set<string> = new Set([\n 'DSAI_DEBUG',\n 'DSAI_WATCH',\n 'DSAI_CREATE_BUNDLE',\n 'DSAI_AUTO_DETECT_THEMES',\n 'DSAI_ICONS_TYPESCRIPT',\n 'DSAI_ICONS_OPTIMIZE',\n]);\n\n/**\n * Environment variables that should be parsed as numbers\n */\nexport const envNumberKeys: Set<string> = new Set(['DSAI_BASE_FONT_SIZE']);\n\n/**\n * Environment variables that should be parsed as arrays (comma-separated)\n */\nexport const envArrayKeys: Set<string> = new Set(['DSAI_FORMATS', 'DSAI_IGNORE_MODES']);\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get the output file name for a format with optional theme\n *\n * @param format - Output format\n * @param theme - Optional theme name\n * @returns Output file name\n */\nexport function getOutputFileName(format: OutputFormat, theme?: string): string {\n let baseName: string;\n\n switch (format) {\n case 'css':\n baseName = 'tokens.css';\n break;\n case 'scss':\n baseName = '_tokens.scss';\n break;\n case 'js':\n baseName = 'tokens.js';\n break;\n case 'ts':\n baseName = 'tokens.ts';\n break;\n case 'json':\n baseName = 'tokens.json';\n break;\n case 'android':\n baseName = 'tokens.xml';\n break;\n case 'ios':\n baseName = 'tokens.h';\n break;\n default:\n baseName = 'tokens.txt';\n }\n\n if (!theme) {\n return baseName;\n }\n\n // Insert theme before extension\n const dotIndex = baseName.lastIndexOf('.');\n if (dotIndex === -1) {\n return `${baseName}-${theme}`;\n }\n\n const name = baseName.slice(0, dotIndex);\n const ext = baseName.slice(dotIndex);\n return `${name}-${theme}${ext}`;\n}\n\n/**\n * Get the default output directory for a format\n *\n * @param format - Output format\n * @returns Output directory path\n */\nexport function getDefaultOutputDir(format: OutputFormat): string {\n switch (format) {\n case 'css':\n return `${DEFAULT_OUTPUT_DIR}/css`;\n case 'scss':\n return `${DEFAULT_OUTPUT_DIR}/scss`;\n case 'js':\n case 'ts':\n return `${DEFAULT_OUTPUT_DIR}/js`;\n case 'json':\n return `${DEFAULT_OUTPUT_DIR}/json`;\n case 'android':\n return `${DEFAULT_OUTPUT_DIR}/android`;\n case 'ios':\n return `${DEFAULT_OUTPUT_DIR}/ios`;\n default:\n return DEFAULT_OUTPUT_DIR;\n }\n}\n\n/**\n * Get default extension for a format\n *\n * @param format - Output format\n * @returns File extension including the dot\n */\nexport function getDefaultExtension(format: OutputFormat): string {\n switch (format) {\n case 'css':\n return '.css';\n case 'scss':\n return '.scss';\n case 'js':\n return '.js';\n case 'ts':\n return '.ts';\n case 'json':\n return '.json';\n case 'android':\n return '.xml';\n case 'ios':\n return '.h';\n default:\n return '.txt';\n }\n}\n","/**\n * @fileoverview Configuration resolver for DSAI Tools\n *\n * Merges user configuration with defaults and resolves relative paths.\n * Handles configuration inheritance and validation.\n *\n * @module @dsai-io/tools/config/resolver\n */\n\nimport path from 'node:path';\n\nimport {\n defaultConfig,\n defaultGlobalConfig,\n defaultIconsConfig,\n defaultThemesConfig,\n defaultTokensConfig,\n} from './defaults.js';\n\nimport type {\n DsaiConfig,\n GlobalConfig,\n IconsConfig,\n ResolvedConfig,\n ResolvedGlobalConfig,\n ResolvedIconsConfig,\n ResolvedThemesConfig,\n ResolvedTokensConfig,\n ThemesConfig,\n TokensConfig,\n} from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for resolving configuration\n */\nexport interface ResolveOptions {\n /** Working directory */\n cwd?: string;\n\n /** Directory containing config file (for relative path resolution) */\n configDir?: string;\n\n /** Override values (highest priority) */\n overrides?: Partial<DsaiConfig>;\n}\n\n// ============================================================================\n// Section Resolvers\n// ============================================================================\n\n/**\n * Resolve global configuration section\n */\nfunction resolveGlobalConfig(\n config: GlobalConfig | undefined,\n options: ResolveOptions\n): ResolvedGlobalConfig {\n const base = defaultGlobalConfig;\n const cwd = options.cwd ?? process.cwd();\n\n return {\n cwd: config?.cwd ? path.resolve(cwd, config.cwd) : cwd,\n debug: config?.debug ?? base.debug,\n logLevel: config?.logLevel ?? base.logLevel,\n };\n}\n\n/**\n * Resolve themes configuration section\n */\nfunction resolveThemesConfig(config: ThemesConfig | undefined): ResolvedThemesConfig {\n const base = defaultThemesConfig;\n\n return {\n autoDetect: config?.autoDetect ?? base.autoDetect,\n default: config?.default ?? base.default,\n ignoreModes: config?.ignoreModes ?? [...base.ignoreModes],\n selectorPattern: {\n default: config?.selectorPattern?.default ?? base.selectorPattern.default,\n others: config?.selectorPattern?.others ?? base.selectorPattern.others,\n },\n };\n}\n\n/**\n * Resolve icons configuration section\n */\nfunction resolveIconsConfig(\n config: IconsConfig | undefined,\n options: ResolveOptions\n): ResolvedIconsConfig {\n const base = defaultIconsConfig;\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\n\n return {\n sourceDir: config?.sourceDir ? path.resolve(configDir, config.sourceDir) : base.sourceDir,\n outputDir: config?.outputDir ? path.resolve(configDir, config.outputDir) : base.outputDir,\n framework: config?.framework ?? base.framework,\n typescript: config?.typescript ?? base.typescript,\n optimize: config?.optimize ?? base.optimize,\n prefix: config?.prefix ?? base.prefix,\n };\n}\n\n/**\n * Resolve tokens configuration section\n */\nfunction resolveTokensConfig(\n config: TokensConfig | undefined,\n options: ResolveOptions\n): ResolvedTokensConfig {\n const base = defaultTokensConfig;\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\n\n // Resolve paths relative to config directory\n const resolveDir = (dir: string): string => path.resolve(configDir, dir);\n\n // Resolve output directories using Map to avoid object injection\n const outputDirsMap = new Map(Object.entries(base.outputDirs));\n if (config?.outputDirs) {\n for (const [format, dir] of Object.entries(config.outputDirs)) {\n if (dir !== undefined) {\n outputDirsMap.set(format, resolveDir(dir));\n }\n }\n }\n const outputDirs = Object.fromEntries(outputDirsMap) as ResolvedTokensConfig['outputDirs'];\n\n // Merge collection mapping with resolved paths using Map\n const collectionMappingMap = new Map<string, string>();\n if (config?.collectionMapping) {\n for (const [name, filePath] of Object.entries(config.collectionMapping)) {\n collectionMappingMap.set(name, resolveDir(filePath));\n }\n }\n const collectionMapping = Object.fromEntries(collectionMappingMap);\n\n // Resolve additional directories\n const additionalScssDirectories = (config?.additionalScssDirectories ?? []).map(resolveDir);\n const additionalCssDirectories = (config?.additionalCssDirectories ?? []).map(resolveDir);\n const watchDirectories = (config?.watchDirectories ?? []).map(resolveDir);\n\n return {\n source: config?.source ?? base.source,\n sourceDir: config?.sourceDir ? resolveDir(config.sourceDir) : base.sourceDir,\n collectionsDir: config?.collectionsDir\n ? resolveDir(config.collectionsDir)\n : base.collectionsDir,\n sourcePatterns: config?.sourcePatterns ?? [...base.sourcePatterns],\n collectionMapping,\n outputDir: config?.outputDir ? resolveDir(config.outputDir) : base.outputDir,\n outputDirs,\n outputFileNames: { ...base.outputFileNames, ...config?.outputFileNames },\n prefix: config?.prefix ?? base.prefix,\n formats: config?.formats ?? [...base.formats],\n additionalScssDirectories,\n additionalCssDirectories,\n mergeOrder: config?.mergeOrder ?? base.mergeOrder,\n createBundle: config?.createBundle ?? base.createBundle,\n scssImportHeader: config?.scssImportHeader,\n themes: resolveThemesConfig(config?.themes),\n transforms: config?.transforms ?? [],\n customFormats: config?.customFormats ?? [],\n preprocessors: config?.preprocessors ?? [],\n filters: config?.filters ?? [],\n onBuildStart: config?.onBuildStart,\n onFormatComplete: config?.onFormatComplete,\n onAllFormatsComplete: config?.onAllFormatsComplete,\n onBuildComplete: config?.onBuildComplete,\n outputReferences: config?.outputReferences ?? base.outputReferences,\n baseFontSize: config?.baseFontSize ?? base.baseFontSize,\n separateThemeFiles: config?.separateThemeFiles ?? base.separateThemeFiles,\n watch: config?.watch ?? base.watch,\n watchDirectories,\n pipeline: config?.pipeline,\n };\n}\n\n// ============================================================================\n// Main Resolver\n// ============================================================================\n\n/**\n * Merge config with overrides (simple shallow merge for top-level)\n */\nfunction applyOverrides(config: DsaiConfig, overrides: Partial<DsaiConfig>): DsaiConfig {\n return {\n tokens: overrides.tokens ? { ...config.tokens, ...overrides.tokens } : config.tokens,\n icons: overrides.icons ? { ...config.icons, ...overrides.icons } : config.icons,\n global: overrides.global ? { ...config.global, ...overrides.global } : config.global,\n };\n}\n\n/**\n * Resolve user configuration with defaults\n *\n * Merges user configuration with defaults, resolves relative paths,\n * and applies overrides.\n *\n * Resolution order (later overrides earlier):\n * 1. Default configuration\n * 2. User configuration (from file)\n * 3. Override configuration (from CLI or programmatic)\n *\n * @param config - User configuration object\n * @param options - Resolution options\n * @returns Fully resolved configuration\n *\n * @example\n * ```typescript\n * const resolved = resolveConfig(\n * { tokens: { prefix: '--custom-' } },\n * { cwd: '/path/to/project' }\n * );\n * ```\n */\nexport function resolveConfig(\n config: DsaiConfig = {},\n options: ResolveOptions = {}\n): ResolvedConfig {\n // Merge overrides into config\n const mergedConfig = options.overrides ? applyOverrides(config, options.overrides) : config;\n\n const configDir = options.configDir ?? options.cwd ?? process.cwd();\n\n return {\n global: resolveGlobalConfig(mergedConfig.global, options),\n tokens: resolveTokensConfig(mergedConfig.tokens, options),\n icons: resolveIconsConfig(mergedConfig.icons, options),\n configDir,\n };\n}\n\n/**\n * Merge multiple configurations\n *\n * Useful for extending base configurations.\n *\n * @param configs - Array of configurations to merge (later overrides earlier)\n * @returns Merged configuration\n *\n * @example\n * ```typescript\n * const merged = mergeConfigs(\n * baseConfig,\n * teamConfig,\n * projectConfig\n * );\n * ```\n */\nexport function mergeConfigs(...configs: DsaiConfig[]): DsaiConfig {\n let result: DsaiConfig = {};\n\n for (const config of configs) {\n result = applyOverrides(result, config);\n }\n\n return result;\n}\n\n/**\n * Create a partial resolved config for testing\n *\n * @param partial - Partial configuration to fill\n * @returns Full resolved configuration with defaults\n */\nexport function createResolvedConfig(partial: Partial<ResolvedConfig> = {}): ResolvedConfig {\n return {\n global: partial.global ?? defaultConfig.global,\n tokens: partial.tokens ?? defaultConfig.tokens,\n icons: partial.icons ?? defaultConfig.icons,\n configDir: partial.configDir ?? process.cwd(),\n configPath: partial.configPath,\n };\n}\n","/**\n * @fileoverview Configuration file loader for DSAI Tools\n *\n * Uses cosmiconfig to load configuration from multiple file formats\n * and locations following standard conventions.\n *\n * @module @dsai-io/tools/config/loader\n */\n\nimport path from 'node:path';\n\nimport { cosmiconfig, cosmiconfigSync } from 'cosmiconfig';\n\nimport { resolveConfig } from './resolver.js';\n\nimport type { DsaiConfig, LoadConfigOptions, LoadConfigResult } from './types.js';\nimport type { CosmiconfigResult, PublicExplorer, PublicExplorerSync } from 'cosmiconfig';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Module name for cosmiconfig search\n * This determines the config file naming conventions:\n * - dsai.config.{js,mjs,cjs,ts}\n * - .dsairc\n * - .dsairc.{json,yaml,yml,js,mjs,cjs}\n * - package.json \"dsai\" key\n */\nconst MODULE_NAME = 'dsai';\n\n/**\n * Supported configuration file names (in search order)\n */\nexport const CONFIG_FILE_NAMES = [\n 'dsai.config.ts',\n 'dsai.config.mjs',\n 'dsai.config.js',\n 'dsai.config.cjs',\n '.dsairc.ts',\n '.dsairc.mjs',\n '.dsairc.js',\n '.dsairc.cjs',\n '.dsairc.json',\n '.dsairc.yaml',\n '.dsairc.yml',\n '.dsairc',\n 'package.json',\n];\n\n// ============================================================================\n// Loader Instance\n// ============================================================================\n\n/**\n * Create a cosmiconfig explorer instance\n *\n * @param options - Optional loader options\n * @returns Cosmiconfig explorer\n */\nfunction createExplorer(options?: { stopDir?: string }): PublicExplorer {\n return cosmiconfig(MODULE_NAME, {\n searchPlaces: CONFIG_FILE_NAMES,\n stopDir: options?.stopDir,\n packageProp: MODULE_NAME,\n });\n}\n\n/**\n * Create a synchronous cosmiconfig explorer instance\n *\n * @param options - Optional loader options\n * @returns Cosmiconfig sync explorer\n */\nfunction createExplorerSync(options?: { stopDir?: string }): PublicExplorerSync {\n return cosmiconfigSync(MODULE_NAME, {\n searchPlaces: CONFIG_FILE_NAMES,\n stopDir: options?.stopDir,\n packageProp: MODULE_NAME,\n });\n}\n\n// ============================================================================\n// Loading Functions\n// ============================================================================\n\n/**\n * Load configuration from file and merge with defaults\n *\n * This is the main entry point for loading configuration.\n * It searches for config files, loads them, validates,\n * and resolves with defaults.\n *\n * @param options - Load options\n * @returns Resolved configuration with metadata\n *\n * @example\n * ```typescript\n * // Load from current directory\n * const result = await loadConfig();\n *\n * // Load from specific path\n * const result = await loadConfig({\n * configPath: './my-config.js'\n * });\n *\n * // Load with overrides\n * const result = await loadConfig({\n * overrides: { global: { debug: true } }\n * });\n * ```\n */\nexport async function loadConfig(options: LoadConfigOptions = {}): Promise<LoadConfigResult> {\n const { cwd = process.cwd(), configPath, overrides, skipFile = false } = options;\n const warnings: string[] = [];\n\n let fileConfig: DsaiConfig = {};\n let resolvedConfigPath: string | undefined;\n\n // Load configuration from file unless skipped\n if (!skipFile) {\n const explorer = createExplorer({ stopDir: path.dirname(cwd) });\n let cosmicResult: CosmiconfigResult;\n\n try {\n if (configPath) {\n // Load from explicit path\n const absolutePath = path.isAbsolute(configPath)\n ? configPath\n : path.resolve(cwd, configPath);\n cosmicResult = await explorer.load(absolutePath);\n } else {\n // Search for config file\n cosmicResult = await explorer.search(cwd);\n }\n\n if (cosmicResult && !cosmicResult.isEmpty) {\n fileConfig = cosmicResult.config as DsaiConfig;\n resolvedConfigPath = cosmicResult.filepath;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warnings.push(`Failed to load configuration: ${message}`);\n }\n }\n\n // Resolve configuration with defaults\n const configDir = resolvedConfigPath ? path.dirname(resolvedConfigPath) : cwd;\n\n const resolvedConfig = resolveConfig(fileConfig, {\n cwd,\n configDir,\n overrides,\n });\n\n return {\n config: resolvedConfig,\n configPath: resolvedConfigPath,\n warnings,\n };\n}\n\n/**\n * Search for configuration file without loading\n *\n * Useful for checking if a config file exists before operations.\n *\n * @param cwd - Directory to search from\n * @returns Path to config file if found, undefined otherwise\n */\nexport async function searchConfigFile(cwd: string = process.cwd()): Promise<string | undefined> {\n const explorer = createExplorer();\n\n try {\n const result = await explorer.search(cwd);\n return result?.filepath;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Clear the configuration cache\n *\n * Useful when files have changed and need to be reloaded.\n */\nexport function clearConfigCache(): void {\n const explorer = createExplorer();\n explorer.clearCaches();\n}\n\n/**\n * Load configuration synchronously (limited format support)\n *\n * Note: This only works with JSON and synchronous JS/CJS configs.\n * For full format support including ESM and TypeScript, use loadConfig().\n *\n * @param options - Load options\n * @returns Resolved configuration with metadata\n */\nexport function loadConfigSync(options: LoadConfigOptions = {}): LoadConfigResult {\n const { cwd = process.cwd(), configPath, overrides, skipFile = false } = options;\n const warnings: string[] = [];\n\n let fileConfig: DsaiConfig = {};\n let resolvedConfigPath: string | undefined;\n\n // Load configuration from file unless skipped\n if (!skipFile) {\n const explorer = createExplorerSync({ stopDir: path.dirname(cwd) });\n\n try {\n if (configPath) {\n // Load from explicit path\n const absolutePath = path.isAbsolute(configPath)\n ? configPath\n : path.resolve(cwd, configPath);\n const result = explorer.load(absolutePath);\n\n if (result && !result.isEmpty) {\n fileConfig = result.config as DsaiConfig;\n resolvedConfigPath = result.filepath;\n }\n } else {\n // Search for config file\n const result = explorer.search(cwd);\n\n if (result && !result.isEmpty) {\n fileConfig = result.config as DsaiConfig;\n resolvedConfigPath = result.filepath;\n }\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n warnings.push(`Failed to load configuration: ${message}`);\n }\n }\n\n // Resolve configuration with defaults\n const configDir = resolvedConfigPath ? path.dirname(resolvedConfigPath) : cwd;\n\n const resolvedConfig = resolveConfig(fileConfig, {\n cwd,\n configDir,\n overrides,\n });\n\n return {\n config: resolvedConfig,\n configPath: resolvedConfigPath,\n warnings,\n };\n}\n\n// ============================================================================\n// Config Helper\n// ============================================================================\n\n/**\n * Define configuration with type checking\n *\n * A helper function that provides TypeScript type checking for config files.\n * Use this in your dsai.config.ts or dsai.config.mjs files.\n *\n * @param config - Configuration object\n * @returns The same configuration object with type checking applied\n *\n * @example\n * ```typescript\n * // dsai.config.ts\n * import { defineConfig } from '@dsai-io/tools';\n *\n * export default defineConfig({\n * tokens: {\n * prefix: '--myapp-',\n * formats: ['css', 'scss', 'ts'],\n * },\n * icons: {\n * framework: 'react',\n * },\n * });\n * ```\n */\nexport function defineConfig(config: DsaiConfig): DsaiConfig {\n return config;\n}\n\n/**\n * Define configuration with async function\n *\n * Allows async operations during configuration creation.\n *\n * @param configFn - Async function returning configuration\n * @returns Promise resolving to the configuration\n *\n * @example\n * ```typescript\n * // dsai.config.ts\n * import { defineConfigAsync } from '@dsai-io/tools';\n *\n * export default defineConfigAsync(async () => {\n * const baseConfig = await loadExternalConfig();\n * return {\n * ...baseConfig,\n * tokens: {\n * prefix: '--custom-',\n * },\n * };\n * });\n * ```\n */\nexport function defineConfigAsync(configFn: () => Promise<DsaiConfig>): Promise<DsaiConfig> {\n return configFn();\n}\n","/**\n * @fileoverview Environment variable parsing for DSAI Tools configuration\n *\n * Reads configuration values from environment variables and converts\n * them to the appropriate types.\n *\n * @module @dsai-io/tools/config/env\n */\n\nimport { envArrayKeys, envBooleanKeys, envMappings, envNumberKeys } from './defaults.js';\n\nimport type { DsaiConfig } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for parsing environment variables\n */\nexport interface EnvParseOptions {\n /** Environment object to read from (default: process.env) */\n env?: NodeJS.ProcessEnv;\n\n /** Prefix filter for environment variables */\n prefix?: string;\n}\n\n// ============================================================================\n// Parsing Functions\n// ============================================================================\n\n/**\n * Parse a boolean from environment variable value\n *\n * @param value - Environment variable value\n * @returns Parsed boolean or undefined\n */\nfunction parseBoolean(value: string | undefined): boolean | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const normalized = value.toLowerCase().trim();\n\n if (normalized === 'true' || normalized === '1' || normalized === 'yes') {\n return true;\n }\n\n if (normalized === 'false' || normalized === '0' || normalized === 'no') {\n return false;\n }\n\n return undefined;\n}\n\n/**\n * Parse a number from environment variable value\n *\n * @param value - Environment variable value\n * @returns Parsed number or undefined\n */\nfunction parseNumber(value: string | undefined): number | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n const num = Number(value);\n return Number.isNaN(num) ? undefined : num;\n}\n\n/**\n * Parse an array from environment variable value (comma-separated)\n *\n * @param value - Environment variable value\n * @returns Parsed array or undefined\n */\nfunction parseArray(value: string | undefined): string[] | undefined {\n if (value === undefined || value.trim() === '') {\n return undefined;\n }\n\n return value\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\n/**\n * Set a nested value in an object using dot notation path\n *\n * @param obj - Object to modify\n * @param path - Dot notation path (e.g., 'global.logLevel')\n * @param value - Value to set\n */\nfunction setNestedValue(obj: Record<string, unknown>, path: string, value: unknown): void {\n const parts = path.split('.');\n\n if (parts.length === 1) {\n const key = parts[0];\n if (key !== undefined) {\n Object.defineProperty(obj, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n return;\n }\n\n if (parts.length === 2) {\n const [first, second] = parts;\n if (first !== undefined && second !== undefined) {\n if (!(first in obj)) {\n Object.defineProperty(obj, first, {\n value: {},\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n const nested = obj[first] as Record<string, unknown>;\n Object.defineProperty(nested, second, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n return;\n }\n\n if (parts.length === 3) {\n const [first, second, third] = parts;\n if (first !== undefined && second !== undefined && third !== undefined) {\n if (!(first in obj)) {\n Object.defineProperty(obj, first, {\n value: {},\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n const nested1 = obj[first] as Record<string, unknown>;\n if (!(second in nested1)) {\n Object.defineProperty(nested1, second, {\n value: {},\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n const nested2 = nested1[second] as Record<string, unknown>;\n Object.defineProperty(nested2, third, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n // For paths deeper than 3 levels, we don't support them in config\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Read configuration values from environment variables\n *\n * Parses environment variables according to the mappings defined in defaults.ts.\n * Supports string, boolean, number, and array types.\n *\n * @param options - Parse options\n * @returns Partial configuration object from environment\n *\n * @example\n * ```typescript\n * // Read from process.env\n * const envConfig = getConfigFromEnv();\n *\n * // Read from custom env object\n * const envConfig = getConfigFromEnv({\n * env: { DSAI_LOG_LEVEL: 'debug' }\n * });\n * ```\n */\nexport function getConfigFromEnv(options: EnvParseOptions = {}): Partial<DsaiConfig> {\n const env = options.env ?? process.env;\n const prefix = options.prefix ?? 'DSAI_';\n\n const config: Record<string, unknown> = {};\n\n for (const [envKey, configPath] of Object.entries(envMappings)) {\n // Check prefix filter\n if (!envKey.startsWith(prefix)) {\n continue;\n }\n\n const envValue = env[envKey];\n if (envValue === undefined) {\n continue;\n }\n\n let parsedValue: unknown;\n\n // Parse based on expected type\n if (envBooleanKeys.has(envKey)) {\n parsedValue = parseBoolean(envValue);\n } else if (envNumberKeys.has(envKey)) {\n parsedValue = parseNumber(envValue);\n } else if (envArrayKeys.has(envKey)) {\n parsedValue = parseArray(envValue);\n } else {\n // Default to string\n parsedValue = envValue;\n }\n\n // Only set if we got a valid value\n if (parsedValue !== undefined) {\n setNestedValue(config, configPath, parsedValue);\n }\n }\n\n return config as Partial<DsaiConfig>;\n}\n\n/**\n * Check if running in CI environment\n *\n * Checks common CI environment variables.\n *\n * @param env - Environment object to check\n * @returns True if CI environment detected\n */\nexport function isCI(env: NodeJS.ProcessEnv = process.env): boolean {\n return (\n env['CI'] === 'true' ||\n env['CONTINUOUS_INTEGRATION'] === 'true' ||\n env['GITHUB_ACTIONS'] === 'true' ||\n env['GITLAB_CI'] === 'true' ||\n env['CIRCLECI'] === 'true' ||\n env['TRAVIS'] === 'true' ||\n env['BUILDKITE'] === 'true' ||\n env['JENKINS_URL'] !== undefined ||\n env['TF_BUILD'] === 'True'\n );\n}\n\n/**\n * Check if colors should be disabled based on environment\n *\n * @param env - Environment object to check\n * @returns True if colors should be disabled\n */\nexport function shouldDisableColors(env: NodeJS.ProcessEnv = process.env): boolean {\n return env['NO_COLOR'] !== undefined || env['FORCE_COLOR'] === '0' || env['TERM'] === 'dumb';\n}\n\n/**\n * Get the effective log level from environment\n *\n * Checks DSAI_LOG_LEVEL, DEBUG, and VERBOSE env vars.\n *\n * @param env - Environment object to check\n * @returns Log level string or undefined\n */\nexport function getLogLevelFromEnv(env: NodeJS.ProcessEnv = process.env): string | undefined {\n const dsaiLogLevel = env['DSAI_LOG_LEVEL'];\n const dsaiDebug = env['DSAI_DEBUG'];\n const debug = env['DEBUG'];\n const verbose = env['VERBOSE'];\n\n // Explicit DSAI log level takes precedence\n if (dsaiLogLevel) {\n return dsaiLogLevel;\n }\n\n // Check for debug mode\n if (dsaiDebug === 'true' || debug?.includes('dsai')) {\n return 'debug';\n }\n\n // Check for verbose mode\n if (verbose === 'true') {\n return 'verbose';\n }\n\n return undefined;\n}\n\n/**\n * Get environment-based overrides for configuration\n *\n * This combines all environment-based settings into a single override object.\n *\n * @param env - Environment object to check\n * @returns Configuration overrides from environment\n */\nexport function getEnvOverrides(env: NodeJS.ProcessEnv = process.env): Partial<DsaiConfig> {\n const config = getConfigFromEnv({ env });\n\n // Apply CI detection\n if (isCI(env) && !config.global) {\n config.global = { debug: false };\n }\n\n // Apply log level from various sources\n const logLevel = getLogLevelFromEnv(env);\n if (logLevel) {\n config.global = {\n ...config.global,\n logLevel: logLevel as 'silent' | 'error' | 'warn' | 'info' | 'debug',\n };\n }\n\n return config;\n}\n","/**\n * Legacy configuration migration utilities\n *\n * Provides migration support for older config formats and helps users\n * upgrade to the latest configuration schema.\n *\n * @packageDocumentation\n */\n\nimport type { DsaiConfig, TokensConfig } from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Legacy tokens.config.json format (v0.x)\n */\ninterface LegacyTokensConfig {\n /** Source directory for tokens */\n source?: string;\n /** Output directory */\n output?: string;\n /** CSS prefix */\n prefix?: string;\n /** Output formats */\n formats?: string[];\n /** Theme configuration */\n themes?: {\n default?: string;\n modes?: string[];\n };\n}\n\n/**\n * Result of migration check\n */\nexport interface MigrationCheck {\n /** Whether migration is needed */\n needsMigration: boolean;\n /** Detected config version or format */\n detectedFormat: ConfigFormat;\n /** Warnings about deprecated options */\n warnings: string[];\n /** Suggested migration steps */\n suggestions: string[];\n}\n\n/**\n * Supported configuration formats\n */\nexport type ConfigFormat =\n | 'current' // dsai.config.mjs/js/ts\n | 'legacy-tokens' // tokens.config.json (v0.x)\n | 'unknown';\n\n// ============================================================================\n// Migration Detection\n// ============================================================================\n\n/**\n * Check if a configuration needs migration\n *\n * @param config - Raw configuration object\n * @param filename - Optional filename for format detection\n * @returns Migration check result\n *\n * @example\n * ```typescript\n * const check = checkMigrationNeeded(oldConfig, 'tokens.config.json');\n * if (check.needsMigration) {\n * console.log('Migration needed:', check.suggestions);\n * }\n * ```\n */\nexport function checkMigrationNeeded(config: unknown, filename?: string): MigrationCheck {\n const warnings: string[] = [];\n const suggestions: string[] = [];\n\n // Check filename for legacy format\n if (filename?.includes('tokens.config.json')) {\n warnings.push('tokens.config.json is deprecated. Please migrate to dsai.config.mjs.');\n suggestions.push('Run: npx @dsai-io/tools migrate to automatically migrate your config.');\n\n return {\n needsMigration: true,\n detectedFormat: 'legacy-tokens',\n warnings,\n suggestions,\n };\n }\n\n // Check for legacy structure\n if (isLegacyTokensConfig(config)) {\n warnings.push('Legacy configuration format detected. Some options may be deprecated.');\n suggestions.push('Consider updating to the new configuration format.');\n\n return {\n needsMigration: true,\n detectedFormat: 'legacy-tokens',\n warnings,\n suggestions,\n };\n }\n\n return {\n needsMigration: false,\n detectedFormat: 'current',\n warnings,\n suggestions,\n };\n}\n\n/**\n * Type guard for legacy tokens config\n */\nfunction isLegacyTokensConfig(config: unknown): config is LegacyTokensConfig {\n if (typeof config !== 'object' || config === null) {\n return false;\n }\n\n const obj = config as Record<string, unknown>;\n\n // Legacy format has 'output' instead of 'outputDir'\n // and 'source' as a string path instead of structured source config\n return (\n typeof obj['output'] === 'string' ||\n (typeof obj['source'] === 'string' && !('sourceDir' in obj))\n );\n}\n\n// ============================================================================\n// Migration Functions\n// ============================================================================\n\n/**\n * Migrate legacy tokens.config.json to new format\n *\n * @param legacy - Legacy configuration object\n * @returns Migrated configuration\n *\n * @example\n * ```typescript\n * const oldConfig = require('./tokens.config.json');\n * const newConfig = migrateLegacyTokensConfig(oldConfig);\n * ```\n */\nexport function migrateLegacyTokensConfig(legacy: LegacyTokensConfig): DsaiConfig {\n const tokens: TokensConfig = {};\n\n // Migrate source → sourceDir\n if (legacy.source !== undefined && legacy.source !== null) {\n tokens.sourceDir = legacy.source;\n }\n\n // Migrate output → outputDir\n if (legacy.output !== undefined && legacy.output !== null) {\n tokens.outputDir = legacy.output;\n }\n\n // Direct migrations\n if (legacy.prefix !== undefined && legacy.prefix !== null) {\n tokens.prefix = legacy.prefix;\n }\n\n if (Array.isArray(legacy.formats)) {\n // Filter to only valid formats\n const validFormats = ['css', 'scss', 'js', 'ts', 'json', 'android', 'ios'] as const;\n tokens.formats = legacy.formats.filter((f): f is (typeof validFormats)[number] =>\n validFormats.includes(f as (typeof validFormats)[number])\n );\n }\n\n // Migrate themes\n if (legacy.themes !== undefined && legacy.themes !== null) {\n tokens.themes = {\n default: legacy.themes.default ?? 'Light',\n // ignoreModes can be derived from modes if needed\n };\n }\n\n return { tokens };\n}\n\n/**\n * Migrate any legacy configuration to current format\n *\n * @param config - Raw configuration (any format)\n * @param filename - Optional filename for format detection\n * @returns Migrated configuration and warnings\n *\n * @example\n * ```typescript\n * const { config, warnings } = migrateConfig(rawConfig, 'tokens.config.json');\n * if (warnings.length > 0) {\n * warnings.forEach(w => console.warn(w));\n * }\n * ```\n */\nexport function migrateConfig(\n config: unknown,\n filename?: string\n): { config: DsaiConfig; warnings: string[] } {\n const check = checkMigrationNeeded(config, filename);\n\n if (!check.needsMigration) {\n return {\n config: config as DsaiConfig,\n warnings: check.warnings,\n };\n }\n\n switch (check.detectedFormat) {\n case 'legacy-tokens':\n return {\n config: migrateLegacyTokensConfig(config as LegacyTokensConfig),\n warnings: check.warnings,\n };\n\n default:\n return {\n config: config as DsaiConfig,\n warnings: [...check.warnings, 'Unknown config format - using as-is.'],\n };\n }\n}\n\n// ============================================================================\n// Deprecation Warnings\n// ============================================================================\n\n/**\n * Check for deprecated options in a configuration\n *\n * @param config - Configuration to check\n * @returns Array of deprecation warnings\n */\nexport function checkDeprecatedOptions(config: DsaiConfig): string[] {\n const warnings: string[] = [];\n\n // Check tokens.output (legacy)\n const configAny = config as Record<string, unknown>;\n const tokens = configAny['tokens'] as Record<string, unknown> | undefined;\n\n if (tokens !== undefined) {\n if ('output' in tokens) {\n warnings.push(\n `Deprecated: Use 'tokens.outputDir' instead of 'tokens.output' (tokens.outputDir)`\n );\n }\n if ('source' in tokens && typeof tokens['source'] === 'string') {\n warnings.push(\n `Deprecated: Use 'tokens.sourceDir' instead of 'tokens.source' for directory paths (tokens.sourceDir)`\n );\n }\n }\n\n return warnings;\n}\n\n/**\n * Generate migration script content\n *\n * @param _oldConfig - Old configuration (unused, reserved for future use)\n * @param newConfig - Migrated configuration\n * @returns String content for new config file\n */\nexport function generateMigrationScript(_oldConfig: unknown, newConfig: DsaiConfig): string {\n const configJson = JSON.stringify(newConfig, null, '\\t');\n\n return `// @ts-check\n/**\n * DSAI Configuration\n *\n * Migrated from legacy format.\n * Please review and adjust as needed.\n *\n * @type {import('@dsai-io/tools').DsaiConfig}\n */\nimport { defineConfig } from '@dsai-io/tools';\n\nexport default defineConfig(${configJson.replace(/\"([^\"]+)\":/g, '$1:')});\n`;\n}\n","/**\n * Token-specific type definitions\n *\n * Defines types for DTCG-compliant tokens, validation, transformation,\n * and build processes.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// DTCG Token Types\n// ============================================================================\n\n/**\n * DTCG-compliant token value\n * @see https://www.designtokens.org/\n */\nexport interface DTCGToken {\n /** The resolved value of the token */\n $value: unknown;\n\n /** Token type (color, dimension, etc.) */\n $type?: TokenType;\n\n /** Human-readable description */\n $description?: string;\n\n /** Extension data */\n $extensions?: Record<string, unknown>;\n}\n\n/**\n * Legacy Style Dictionary token format\n */\nexport interface LegacyToken {\n /** The resolved value of the token */\n value: unknown;\n\n /** Token type */\n type?: string;\n\n /** Human-readable description */\n description?: string;\n\n /** Comment (older format) */\n comment?: string;\n}\n\n/**\n * Combined token type supporting both DTCG and legacy formats\n */\nexport type Token = DTCGToken | LegacyToken;\n\n/**\n * Token collection (nested structure of tokens or groups)\n */\nexport interface TokenCollection {\n [key: string]: Token | TokenCollection | unknown;\n}\n\n/**\n * Figma export format (from Tokens Studio)\n */\nexport interface FigmaExport {\n [collectionName: string]: FigmaCollection;\n}\n\n/**\n * Single Figma collection with optional modes\n */\nexport interface FigmaCollection {\n /** Mode-specific token values */\n modes?: Record<string, TokenCollection>;\n\n /** Direct tokens if no modes */\n [key: string]: unknown;\n}\n\n// ============================================================================\n// Token Type Constants\n// ============================================================================\n\n/**\n * Valid token types per DTCG specification\n */\nexport const VALID_TOKEN_TYPES = [\n 'color',\n 'dimension',\n 'fontFamily',\n 'fontWeight',\n 'fontStyle',\n 'shadow',\n 'number',\n 'string',\n 'duration',\n 'cubicBezier',\n 'strokeStyle',\n 'border',\n 'transition',\n 'gradient',\n 'typography',\n 'letterSpacing',\n 'lineHeight',\n 'paragraphSpacing',\n 'textDecoration',\n 'textCase',\n] as const;\n\n/**\n * Token type (DTCG specification)\n */\nexport type TokenType = (typeof VALID_TOKEN_TYPES)[number];\n\n// ============================================================================\n// Validation Types\n// ============================================================================\n\n/**\n * Severity level for validation issues\n */\nexport type ValidationSeverity = 'error' | 'warning' | 'info';\n\n/**\n * A single validation issue\n */\nexport interface ValidationIssue {\n /** Token path (e.g., \"color.brand.primary\") */\n path: string;\n\n /** Human-readable message */\n message: string;\n\n /** Issue severity */\n severity: ValidationSeverity;\n\n /** The problematic value (if applicable) */\n value?: unknown;\n\n /** Suggested fix (if applicable) */\n suggestion?: string;\n}\n\n/**\n * Result of token validation\n */\nexport interface ValidationResult {\n /** Whether validation passed (no errors) */\n valid: boolean;\n\n /** Validation errors (blocking issues) */\n errors: ValidationIssue[];\n\n /** Validation warnings (non-blocking) */\n warnings: ValidationIssue[];\n\n /** Total number of tokens validated */\n tokenCount: number;\n\n /** Number of files validated */\n fileCount: number;\n\n /** Validation duration in milliseconds */\n duration?: number;\n}\n\n/**\n * Options for validation\n */\nexport interface ValidateOptions {\n /** Directory containing token files */\n collectionsDir?: string;\n\n /** File patterns to validate */\n patterns?: string[];\n\n /** Enable verbose output */\n verbose?: boolean;\n\n /** Suppress output */\n quiet?: boolean;\n\n /** Treat warnings as errors */\n strict?: boolean;\n}\n\n// ============================================================================\n// Transform Types\n// ============================================================================\n\n/**\n * Options for Figma token transformation\n */\nexport interface TransformOptions {\n /** Source directory with Figma exports */\n sourceDir: string;\n\n /** Output directory for collections */\n collectionsDir: string;\n\n /**\n * Glob patterns for finding source files\n * @example ['theme.json', '*.tokens.json', 'figma-variables-*.json']\n */\n sourcePatterns?: string[];\n\n /**\n * Map of collection names to specific file paths\n * @example { 'primitives': './colors.json', 'semantic': './semantic.json' }\n */\n collectionMapping?: Record<string, string>;\n\n /** Preserve $codeSyntax references from Figma */\n preserveCodeSyntax?: boolean;\n\n /** Modes to ignore during transformation */\n ignoreModes?: string[];\n\n /** Default mode name */\n defaultMode?: string;\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of token transformation\n */\nexport interface TransformResult {\n /** Whether transformation succeeded */\n success: boolean;\n\n /** Files written during transformation */\n filesWritten: string[];\n\n /** Number of tokens processed */\n tokensProcessed: number;\n\n /** Modes detected in Figma export */\n modesDetected: string[];\n\n /** Errors encountered */\n errors: string[];\n\n /** Warnings generated */\n warnings: string[];\n\n /** Duration in milliseconds */\n duration?: number;\n}\n\n// ============================================================================\n// Build Types\n// ============================================================================\n\n/**\n * A single build step\n */\nexport interface BuildStep {\n /** Step name for display */\n name: string;\n\n /** Shell command to run (if external) */\n command?: string;\n\n /** Function to execute (if internal). Returns boolean for success/failure, or undefined */\n fn?: () => boolean | undefined | Promise<boolean | undefined>;\n\n /** Whether to skip this step */\n skip?: boolean;\n\n /** Working directory for command */\n cwd?: string;\n}\n\n/**\n * Options for token build\n */\nexport interface BuildOptions {\n /** Skip validation step */\n skipValidate?: boolean;\n\n /** Skip transformation step */\n skipTransform?: boolean;\n\n /** Only build theme CSS */\n onlyTheme?: boolean;\n\n /** Enable watch mode */\n watch?: boolean;\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n\n /** Suppress output */\n quiet?: boolean;\n\n /** Output directory for all formats */\n outputDir?: string;\n\n /** Per-format output directories */\n outputDirs?: Partial<Record<string, string>>;\n\n /** Per-format output file names */\n outputFileNames?: Partial<Record<string, string>>;\n\n /** Additional SCSS directories to merge */\n additionalScssDirectories?: string[];\n\n /** Additional CSS directories to merge */\n additionalCssDirectories?: string[];\n\n /** Merge order for additional styles */\n mergeOrder?: 'before' | 'after';\n\n /** Create combined bundle files */\n createBundle?: boolean;\n\n /** Custom SCSS import header */\n scssImportHeader?: string;\n\n /** Additional directories to watch */\n watchDirectories?: string[];\n\n /** Build pipeline configuration */\n pipeline?: {\n /** Steps to include in the build */\n steps?: Array<\n | 'validate'\n | 'transform'\n | 'style-dictionary'\n | 'sync'\n | 'sass-theme'\n | 'sass-theme-minified'\n | 'postprocess'\n | 'sass-utilities'\n | 'sass-utilities-minified'\n | 'bundle'\n >;\n /** Paths configuration for build steps */\n paths?: {\n syncSource?: string;\n syncTarget?: string;\n sassThemeInput?: string;\n sassThemeOutput?: string;\n sassThemeMinifiedOutput?: string;\n sassUtilitiesInput?: string;\n sassUtilitiesOutput?: string;\n sassUtilitiesMinifiedOutput?: string;\n };\n /** Style Dictionary config file name */\n styleDictionaryConfig?: string;\n };\n}\n\n/**\n * Result of token build\n */\nexport interface BuildResult {\n /** Whether build succeeded */\n success: boolean;\n\n /** Steps that completed successfully */\n stepsCompleted: string[];\n\n /** Steps that failed */\n stepsFailed: string[];\n\n /** Total duration in milliseconds */\n duration: number;\n\n /** Errors encountered */\n errors: string[];\n\n /** Warnings generated */\n warnings: string[];\n\n /** Generated output files */\n outputFiles?: string[];\n}\n\n// ============================================================================\n// Sync Types\n// ============================================================================\n\n/**\n * Options for token sync\n */\nexport interface SyncOptions {\n /** Source file (Style Dictionary output) */\n sourceFile: string;\n\n /** Target file (TypeScript source) */\n targetFile: string;\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of token sync\n */\nexport interface SyncResult {\n /** Whether sync succeeded */\n success: boolean;\n\n /** Number of tokens synced */\n tokensCount: number;\n\n /** Whether file was changed */\n changed: boolean;\n\n /** Errors encountered */\n errors?: string[];\n}\n\n// ============================================================================\n// Postprocess Types\n// ============================================================================\n\n/**\n * A text replacement rule\n */\nexport interface ReplacementRule {\n /** Pattern to search for (string or regex) */\n from: string | RegExp;\n\n /** Replacement string */\n to: string;\n\n /** Optional description */\n description?: string;\n}\n\n/**\n * Options for CSS post-processing\n */\nexport interface PostprocessOptions {\n /** Input CSS file */\n inputFile: string;\n\n /** Output CSS file (defaults to input) */\n outputFile?: string;\n\n /** Replacements to make */\n replacements?: ReplacementRule[];\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of post-processing\n */\nexport interface PostprocessResult {\n /** Whether post-processing succeeded */\n success: boolean;\n\n /** Number of replacements made */\n replacementsMade: number;\n\n /** Output file path */\n outputFile: string;\n\n /** Errors encountered */\n errors?: string[];\n}\n\n// ============================================================================\n// Merge Types\n// ============================================================================\n\n/**\n * Options for merging collections\n */\nexport interface MergeOptions {\n /** Source files to merge */\n sourceFiles: string[];\n\n /** Output file path */\n outputFile: string;\n\n /** Merge strategy for conflicts */\n strategy?: 'first' | 'last' | 'error';\n\n /** Dry run (don't write files) */\n dryRun?: boolean;\n\n /** Enable verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of collection merge\n */\nexport interface MergeResult {\n /** Whether merge succeeded */\n success: boolean;\n\n /** Number of collections merged */\n collectionsCount: number;\n\n /** Number of tokens in result */\n tokensCount: number;\n\n /** Output file path */\n outputFile: string;\n\n /** Conflicts detected */\n conflicts?: string[];\n\n /** Errors encountered */\n errors?: string[];\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if an object is a DTCG token\n */\nexport function isDTCGToken(obj: unknown): obj is DTCGToken {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n return '$value' in obj;\n}\n\n/**\n * Check if an object is a legacy token\n */\nexport function isLegacyToken(obj: unknown): obj is LegacyToken {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n return 'value' in obj && !('$value' in obj);\n}\n\n/**\n * Check if an object is any token type\n */\nexport function isToken(obj: unknown): obj is Token {\n return isDTCGToken(obj) || isLegacyToken(obj);\n}\n\n/**\n * Check if a string is a valid token type\n */\nexport function isValidTokenType(type: string): type is TokenType {\n return VALID_TOKEN_TYPES.includes(type as TokenType);\n}\n\n/**\n * Check if a value is a token reference\n */\nexport function isTokenReference(value: unknown): boolean {\n return typeof value === 'string' && value.startsWith('{') && value.endsWith('}');\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Get the value from a token regardless of format\n */\nexport function getTokenValue(token: Token): unknown {\n return isDTCGToken(token) ? token.$value : token.value;\n}\n\n/**\n * Get the type from a token regardless of format\n */\nexport function getTokenType(token: Token): string | undefined {\n if (isDTCGToken(token)) {\n return token.$type;\n }\n return (token as LegacyToken).type;\n}\n\n/**\n * Get the description from a token regardless of format\n */\nexport function getTokenDescription(token: Token): string | undefined {\n if (isDTCGToken(token)) {\n return token.$description;\n }\n const legacy = token as LegacyToken;\n return legacy.description ?? legacy.comment;\n}\n\n/**\n * Convert a legacy token to DTCG format\n */\nexport function toDTCGToken(token: LegacyToken): DTCGToken {\n const dtcg: DTCGToken = {\n $value: token.value,\n };\n\n if (token.type && isValidTokenType(token.type)) {\n dtcg.$type = token.type;\n }\n\n const desc = token.description ?? token.comment;\n if (desc) {\n dtcg.$description = desc;\n }\n\n return dtcg;\n}\n\n/**\n * Parse a token reference string\n * @param ref - Reference string like \"{color.brand.primary}\"\n * @returns Path segments like [\"color\", \"brand\", \"primary\"]\n */\nexport function parseTokenReference(ref: string): string[] | null {\n if (!isTokenReference(ref)) {\n return null;\n }\n const inner = ref.slice(1, -1);\n return inner.split('.');\n}\n","/**\n * Token validation module\n *\n * Validates design tokens for DTCG compliance and structural integrity.\n *\n * @packageDocumentation\n */\n\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\nimport {\n getTokenType,\n getTokenValue,\n isDTCGToken,\n isToken,\n isTokenReference,\n isValidTokenType,\n VALID_TOKEN_TYPES,\n} from './types.js';\n\nimport type {\n Token,\n TokenCollection,\n TokenType,\n ValidateOptions,\n ValidationIssue,\n ValidationResult,\n} from './types.js';\nimport type { ResolvedConfig } from '../config/types.js';\n\n// ============================================================================\n// Color Validation\n// ============================================================================\n\n/** Hex color pattern */\nconst HEX_COLOR_PATTERN = /^#(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n\n/** RGB/RGBA pattern */\nconst RGB_PATTERN = /^rgba?\\s*\\(/i;\n\n/** HSL/HSLA pattern */\nconst HSL_PATTERN = /^hsla?\\s*\\(/i;\n\n/** Named colors (common subset) */\nconst NAMED_COLORS = new Set([\n 'transparent',\n 'currentcolor',\n 'inherit',\n 'initial',\n 'unset',\n 'black',\n 'white',\n 'red',\n 'green',\n 'blue',\n 'yellow',\n 'orange',\n 'purple',\n 'pink',\n 'gray',\n 'grey',\n]);\n\n/**\n * Check if a value is a valid color\n */\nfunction isValidColor(value: string): boolean {\n // Hex colors\n if (HEX_COLOR_PATTERN.test(value)) {\n return true;\n }\n // RGB/RGBA\n if (RGB_PATTERN.test(value)) {\n return true;\n }\n // HSL/HSLA\n if (HSL_PATTERN.test(value)) {\n return true;\n }\n // Token references\n if (isTokenReference(value)) {\n return true;\n }\n // Named colors\n if (NAMED_COLORS.has(value.toLowerCase())) {\n return true;\n }\n return false;\n}\n\n// ============================================================================\n// Dimension Validation\n// ============================================================================\n\n/** Valid dimension units */\nconst VALID_UNITS = new Set([\n 'px',\n 'rem',\n 'em',\n '%',\n 'vh',\n 'vw',\n 'vmin',\n 'vmax',\n 'pt',\n 'cm',\n 'mm',\n 'in',\n 'ch',\n 'ex',\n]);\n\n/**\n * Check if a value is a valid dimension\n */\nfunction isValidDimension(value: string): boolean {\n // Zero without unit\n if (value === '0') {\n return true;\n }\n // Token reference\n if (isTokenReference(value)) {\n return true;\n }\n // Parse numeric value and unit manually (safer than regex)\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return false;\n }\n // Find where the numeric part ends\n let i = 0;\n const firstChar = trimmed.charAt(0);\n if (firstChar === '-' || firstChar === '+') {\n i = 1;\n }\n let hasDigits = false;\n let hasDot = false;\n while (i < trimmed.length) {\n const char = trimmed.charAt(i);\n if (char >= '0' && char <= '9') {\n hasDigits = true;\n i++;\n } else if (char === '.' && !hasDot) {\n hasDot = true;\n i++;\n } else {\n break;\n }\n }\n if (!hasDigits) {\n return false;\n }\n // Extract unit part\n const unit = trimmed.slice(i).toLowerCase();\n // Pure number (for unitless values like line-height)\n if (unit === '') {\n return true;\n }\n // Check valid units\n return VALID_UNITS.has(unit);\n}\n\n// ============================================================================\n// Token Validation\n// ============================================================================\n\n/**\n * Validate a single token\n */\nfunction validateSingleToken(\n path: string,\n token: Token,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): void {\n const value = getTokenValue(token);\n const type = getTokenType(token);\n const isDtcg = isDTCGToken(token);\n\n // Warn if not using DTCG format\n if (!isDtcg) {\n warnings.push({\n path,\n message: 'Token uses legacy format. Consider migrating to DTCG ($value, $type).',\n severity: 'warning',\n suggestion: 'Use $value instead of value, $type instead of type',\n });\n }\n\n // Check for missing value\n if (value === undefined || value === null) {\n errors.push({\n path,\n message: 'Token has no value',\n severity: 'error',\n });\n return;\n }\n\n // Check for empty string value\n if (value === '') {\n warnings.push({\n path,\n message: 'Token has empty string value',\n severity: 'warning',\n value,\n });\n }\n\n // Check for missing type\n if (!type) {\n warnings.push({\n path,\n message: 'Token has no type specified',\n severity: 'warning',\n suggestion: `Add $type property with one of: ${VALID_TOKEN_TYPES.slice(0, 5).join(', ')}...`,\n });\n } else if (!isValidTokenType(type)) {\n warnings.push({\n path,\n message: `Unknown token type: \"${type}\"`,\n severity: 'warning',\n value: type,\n suggestion: `Valid types: ${VALID_TOKEN_TYPES.join(', ')}`,\n });\n }\n\n // Type-specific validation\n if (type && typeof value === 'string') {\n validateTypedValue(path, value, type as TokenType, errors);\n }\n}\n\n/**\n * Validate a typed value\n */\nfunction validateTypedValue(\n path: string,\n value: string,\n type: TokenType,\n errors: ValidationIssue[]\n): void {\n switch (type) {\n case 'color':\n if (!isValidColor(value)) {\n errors.push({\n path,\n message: `Invalid color value: \"${value}\"`,\n severity: 'error',\n value,\n suggestion: 'Use hex (#fff), rgb(), hsl(), or token reference',\n });\n }\n break;\n\n case 'dimension':\n if (!isValidDimension(value)) {\n errors.push({\n path,\n message: `Invalid dimension value: \"${value}\"`,\n severity: 'error',\n value,\n suggestion: 'Use value with unit (16px, 1rem) or token reference',\n });\n }\n break;\n\n case 'fontWeight':\n if (!isValidFontWeight(value)) {\n errors.push({\n path,\n message: `Invalid fontWeight value: \"${value}\"`,\n severity: 'error',\n value,\n suggestion: 'Use numeric (100-900) or keyword (normal, bold)',\n });\n }\n break;\n\n // Add more type-specific validations as needed\n default:\n // Other types pass through\n break;\n }\n}\n\n/**\n * Check if a value is a valid font weight\n */\nfunction isValidFontWeight(value: string): boolean {\n // Numeric weights\n const numeric = parseInt(value, 10);\n if (!Number.isNaN(numeric) && numeric >= 1 && numeric <= 1000) {\n return true;\n }\n // Keywords\n const keywords = ['normal', 'bold', 'lighter', 'bolder'];\n if (keywords.includes(value.toLowerCase())) {\n return true;\n }\n // Token reference\n if (isTokenReference(value)) {\n return true;\n }\n return false;\n}\n\n// ============================================================================\n// Collection Validation\n// ============================================================================\n\n/**\n * Recursively validate a token collection\n */\nfunction validateCollection(\n collection: TokenCollection,\n basePath: string,\n errors: ValidationIssue[],\n warnings: ValidationIssue[],\n tokenCount: { count: number }\n): void {\n for (const [key, value] of Object.entries(collection)) {\n // Skip metadata keys\n if (key.startsWith('$')) {\n continue;\n }\n\n const path = basePath ? `${basePath}.${key}` : key;\n\n if (isToken(value)) {\n tokenCount.count += 1;\n validateSingleToken(path, value, errors, warnings);\n } else if (typeof value === 'object' && value !== null) {\n validateCollection(value as TokenCollection, path, errors, warnings, tokenCount);\n }\n }\n}\n\n/**\n * Validate a JSON token file\n */\nfunction validateFile(\n filePath: string,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): number {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const data = JSON.parse(content) as TokenCollection;\n const tokenCount = { count: 0 };\n\n validateCollection(data, '', errors, warnings, tokenCount);\n\n return tokenCount.count;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n errors.push({\n path: filePath,\n message: `Failed to parse file: ${errorMessage}`,\n severity: 'error',\n });\n return 0;\n }\n}\n\n/**\n * Find all JSON files recursively in a directory\n */\nfunction findJsonFiles(dir: string, files: string[] = []): string[] {\n if (!existsSync(dir)) {\n return files;\n }\n\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const stat = statSync(fullPath);\n\n if (stat.isDirectory()) {\n findJsonFiles(fullPath, files);\n } else if (entry.endsWith('.json')) {\n files.push(fullPath);\n }\n }\n\n return files;\n}\n\n// ============================================================================\n// Main Validation Function\n// ============================================================================\n\n/**\n * Validate all tokens in a directory\n *\n * @param config - Resolved configuration\n * @param options - Validation options\n * @returns Validation result\n *\n * @example\n * ```typescript\n * import { validateTokens, loadConfig } from '@dsai-io/tools';\n *\n * const { config } = await loadConfig();\n * const result = await validateTokens(config);\n *\n * if (!result.valid) {\n * console.error('Validation failed:', result.errors);\n * }\n * ```\n */\nexport async function validateTokens(\n config: ResolvedConfig,\n options: ValidateOptions = {}\n): Promise<ValidationResult> {\n const startTime = Date.now();\n const { verbose = false, quiet = false, strict = false } = options;\n\n const errors: ValidationIssue[] = [];\n const warnings: ValidationIssue[] = [];\n let totalTokens = 0;\n let fileCount = 0;\n\n // Use provided directory or config\n const collectionsDir = options.collectionsDir ?? config.tokens.collectionsDir;\n\n if (!existsSync(collectionsDir)) {\n return {\n valid: false,\n errors: [\n {\n path: collectionsDir,\n message: 'Collections directory does not exist',\n severity: 'error',\n },\n ],\n warnings: [],\n tokenCount: 0,\n fileCount: 0,\n duration: Date.now() - startTime,\n };\n }\n\n // Find all JSON files\n const jsonFiles = findJsonFiles(collectionsDir);\n\n if (!quiet) {\n logInfo(`Validating ${jsonFiles.length} token files...`);\n }\n\n // Validate each file\n for (const file of jsonFiles) {\n fileCount += 1;\n const relativePath = relative(collectionsDir, file);\n\n if (verbose) {\n logDebug(`Validating: ${relativePath}`);\n }\n\n const tokenCount = validateFile(file, errors, warnings);\n totalTokens += tokenCount;\n }\n\n // Determine validity\n const valid = strict ? errors.length === 0 && warnings.length === 0 : errors.length === 0;\n\n // Report results\n if (!quiet) {\n if (valid) {\n logSuccess(`Validated ${totalTokens} tokens in ${fileCount} files`);\n if (warnings.length > 0) {\n logWarn(`${warnings.length} warnings found`);\n }\n } else {\n logError(`Validation failed with ${errors.length} errors`);\n }\n }\n\n return {\n valid,\n errors,\n warnings,\n tokenCount: totalTokens,\n fileCount,\n duration: Date.now() - startTime,\n };\n}\n\n/**\n * Validate tokens and exit with code (for CLI usage)\n *\n * @param config - Resolved configuration\n * @param options - Validation options\n */\nexport async function validateTokensCLI(\n config: ResolvedConfig,\n options: ValidateOptions = {}\n): Promise<void> {\n const result = await validateTokens(config, { ...options, verbose: true });\n\n if (!result.valid) {\n for (const error of result.errors) {\n console.error(`❌ ${error.path}: ${error.message}`);\n }\n process.exit(1);\n }\n\n for (const warning of result.warnings) {\n console.warn(`⚠️ ${warning.path}: ${warning.message}`);\n }\n}\n\n// ============================================================================\n// Simple Logging (will be replaced with proper logger in future)\n// ============================================================================\n\nfunction logInfo(message: string): void {\n console.info(`ℹ️ ${message}`);\n}\n\nfunction logDebug(message: string): void {\n console.info(`🔍 ${message}`);\n}\n\nfunction logSuccess(message: string): void {\n console.info(`✅ ${message}`);\n}\n\nfunction logWarn(message: string): void {\n console.warn(`⚠️ ${message}`);\n}\n\nfunction logError(message: string): void {\n console.error(`❌ ${message}`);\n}\n","/**\n * Figma Export Validation module\n *\n * Validates Figma token exports before transformation to ensure\n * they meet the expected structure and format requirements.\n *\n * @packageDocumentation\n */\n\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { basename, extname, join } from 'node:path';\n\nimport { isDTCGToken, isLegacyToken, isToken, isValidTokenType } from './types.js';\n\nimport type { FigmaCollection, FigmaExport, ValidationIssue, ValidationResult } from './types.js';\nimport type { ResolvedConfig } from '../config/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Expected structure for a Figma collection\n */\ninterface ExpectedCollection {\n /** File name for this collection */\n input: string;\n /** Whether the collection has mode variants (Light/Dark) */\n modeAware: boolean;\n /** Expected mode names */\n modes?: string[];\n}\n\n/**\n * Expected collections configuration\n */\ninterface ExpectedCollections {\n [key: string]: ExpectedCollection;\n}\n\n/**\n * Figma validation options\n */\nexport interface ValidateFigmaOptions {\n /** Path to the figma-exports directory */\n exportsDir?: string;\n /** Expected collection definitions */\n collections?: ExpectedCollections;\n /** Strict mode - treat warnings as errors */\n strict?: boolean;\n /** Skip missing files */\n skipMissing?: boolean;\n /** Configuration object */\n config?: ResolvedConfig;\n}\n\n/**\n * Figma validation result\n */\nexport interface ValidateFigmaResult extends ValidationResult {\n /** Per-file validation results */\n files: Map<string, ValidationResult>;\n /** Detected modes across all files */\n detectedModes: Set<string>;\n /** Missing expected files */\n missingFiles: string[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default expected collections configuration\n */\nconst DEFAULT_COLLECTIONS: ExpectedCollections = {\n foundation: {\n input: 'foundation.json',\n modeAware: true,\n modes: ['Light', 'Dark'],\n },\n typography: {\n input: 'typography.json',\n modeAware: false,\n modes: ['Base'],\n },\n spacing: {\n input: 'spacing.json',\n modeAware: false,\n modes: ['Base'],\n },\n radius: {\n input: 'radius.json',\n modeAware: false,\n modes: ['Base'],\n },\n layout: {\n input: 'layout.json',\n modeAware: false,\n modes: ['Base'],\n },\n shadows: {\n input: 'shadows.json',\n modeAware: false,\n modes: ['Base'],\n },\n};\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\n/**\n * Validate a single token from Figma export\n */\nfunction validateFigmaToken(\n path: string,\n token: unknown,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): void {\n if (!isToken(token)) {\n // Not a token object, might be a nested group\n return;\n }\n\n // Check for required $value\n if (isDTCGToken(token)) {\n if (token.$value === undefined || token.$value === null) {\n errors.push({\n path,\n message: 'Token has $value property but value is undefined or null',\n severity: 'error',\n });\n }\n\n // Validate token type if present\n if (token.$type !== undefined) {\n if (!isValidTokenType(token.$type)) {\n warnings.push({\n path,\n message: `Unknown token type: ${token.$type}`,\n severity: 'warning',\n });\n }\n }\n } else if (isLegacyToken(token)) {\n if (token.value === undefined || token.value === null) {\n errors.push({\n path,\n message: 'Token has value property but value is undefined or null',\n severity: 'error',\n });\n }\n\n // Suggest migrating to DTCG format\n warnings.push({\n path,\n message: 'Token uses legacy format (value instead of $value), consider migrating to DTCG',\n severity: 'warning',\n });\n }\n}\n\n/**\n * Recursively validate a token tree\n */\nfunction validateTokenTree(\n obj: unknown,\n basePath: string,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): void {\n if (obj === null || typeof obj !== 'object') {\n return;\n }\n\n for (const [key, value] of Object.entries(obj)) {\n const path = basePath ? `${basePath}.${key}` : key;\n\n // Check if this is a token\n if (isToken(value)) {\n validateFigmaToken(path, value, errors, warnings);\n } else if (typeof value === 'object' && value !== null) {\n // Recursively validate nested objects\n validateTokenTree(value, path, errors, warnings);\n }\n }\n}\n\n/**\n * Validate a Figma collection structure\n */\nfunction validateCollectionStructure(\n data: FigmaExport,\n collectionName: string,\n expectedCollection: ExpectedCollection,\n errors: ValidationIssue[],\n warnings: ValidationIssue[]\n): Set<string> {\n const detectedModes = new Set<string>();\n\n // Find the collection in the data\n const collection = Object.entries(data).find(\n ([key]) => key.toLowerCase() === collectionName.toLowerCase()\n )?.[1] as FigmaCollection | undefined;\n\n if (!collection) {\n errors.push({\n path: collectionName,\n message: `Expected collection \"${collectionName}\" not found in export`,\n severity: 'error',\n });\n return detectedModes;\n }\n\n // Validate modes structure\n if (collection.modes) {\n const modes = Object.keys(collection.modes);\n\n for (const mode of modes) {\n detectedModes.add(mode);\n }\n\n // Check if expected modes are present\n if (expectedCollection.modeAware && expectedCollection.modes) {\n for (const expectedMode of expectedCollection.modes) {\n if (!modes.includes(expectedMode)) {\n warnings.push({\n path: `${collectionName}.modes`,\n message: `Expected mode \"${expectedMode}\" not found, available modes: ${modes.join(', ')}`,\n severity: 'warning',\n });\n }\n }\n }\n\n // Validate tokens in each mode\n for (const [modeName, modeData] of Object.entries(collection.modes)) {\n if (modeData && typeof modeData === 'object') {\n validateTokenTree(modeData, `${collectionName}.modes.${modeName}`, errors, warnings);\n }\n }\n } else {\n // No modes structure, validate at collection level\n validateTokenTree(collection, collectionName, errors, warnings);\n }\n\n return detectedModes;\n}\n\n// ============================================================================\n// Main Validation Functions\n// ============================================================================\n\n/**\n * Validate a single Figma export file\n */\nexport function validateFigmaFile(\n filePath: string,\n expectedCollection?: ExpectedCollection\n): ValidationResult & { detectedModes: Set<string> } {\n const errors: ValidationIssue[] = [];\n const warnings: ValidationIssue[] = [];\n const detectedModes = new Set<string>();\n let tokenCount = 0;\n\n // Check file exists\n if (!existsSync(filePath)) {\n errors.push({\n path: filePath,\n message: 'File not found',\n severity: 'error',\n });\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 0 };\n }\n\n // Parse JSON\n let data: FigmaExport;\n try {\n const content = readFileSync(filePath, 'utf-8');\n data = JSON.parse(content) as FigmaExport;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n errors.push({\n path: filePath,\n message: `Failed to parse JSON: ${message}`,\n severity: 'error',\n });\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 1 };\n }\n\n // Validate basic structure\n if (data === null || typeof data !== 'object' || Array.isArray(data)) {\n errors.push({\n path: filePath,\n message: 'Figma export must be a JSON object',\n severity: 'error',\n });\n return { valid: false, errors, warnings, detectedModes, tokenCount: 0, fileCount: 1 };\n }\n\n // Get collection name from filename\n const fileName = basename(filePath, extname(filePath));\n const collectionName = fileName.charAt(0).toUpperCase() + fileName.slice(1);\n\n // Count tokens helper\n const countTokens = (obj: unknown): number => {\n if (obj === null || typeof obj !== 'object') {\n return 0;\n }\n if (isToken(obj)) {\n return 1;\n }\n let count = 0;\n for (const value of Object.values(obj)) {\n count += countTokens(value);\n }\n return count;\n };\n\n // Validate collection structure if expected collection provided\n if (expectedCollection) {\n const modes = validateCollectionStructure(\n data,\n collectionName,\n expectedCollection,\n errors,\n warnings\n );\n for (const mode of modes) {\n detectedModes.add(mode);\n }\n } else {\n // General validation without expected structure\n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'object' && value !== null) {\n const collection = value as FigmaCollection;\n if (collection.modes) {\n for (const mode of Object.keys(collection.modes)) {\n detectedModes.add(mode);\n }\n }\n validateTokenTree(value, key, errors, warnings);\n }\n }\n }\n\n tokenCount = countTokens(data);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n detectedModes,\n tokenCount,\n fileCount: 1,\n };\n}\n\n/**\n * Validate all Figma exports in a directory\n */\nexport function validateFigmaExports(options: ValidateFigmaOptions = {}): ValidateFigmaResult {\n const {\n exportsDir,\n collections = DEFAULT_COLLECTIONS,\n strict = false,\n skipMissing = false,\n } = options;\n\n const errors: ValidationIssue[] = [];\n const warnings: ValidationIssue[] = [];\n const files = new Map<string, ValidationResult>();\n const detectedModes = new Set<string>();\n const missingFiles: string[] = [];\n let totalTokenCount = 0;\n let totalFileCount = 0;\n\n // Resolve exports directory\n const targetDir = exportsDir ?? options.config?.tokens.sourceDir;\n\n if (!targetDir) {\n errors.push({\n path: 'config',\n message: 'Figma exports directory not specified',\n severity: 'error',\n });\n return {\n valid: false,\n errors,\n warnings,\n files,\n detectedModes,\n missingFiles,\n tokenCount: 0,\n fileCount: 0,\n };\n }\n\n // Check directory exists\n if (!existsSync(targetDir)) {\n errors.push({\n path: targetDir,\n message: 'Figma exports directory not found',\n severity: 'error',\n });\n return {\n valid: false,\n errors,\n warnings,\n files,\n detectedModes,\n missingFiles,\n tokenCount: 0,\n fileCount: 0,\n };\n }\n\n // Validate each expected collection\n for (const [_name, expectedCollection] of Object.entries(collections)) {\n const filePath = join(targetDir, expectedCollection.input);\n\n if (!existsSync(filePath)) {\n missingFiles.push(expectedCollection.input);\n if (!skipMissing) {\n errors.push({\n path: filePath,\n message: `Expected Figma export \"${expectedCollection.input}\" not found`,\n severity: 'error',\n });\n }\n continue;\n }\n\n const result = validateFigmaFile(filePath, expectedCollection);\n files.set(expectedCollection.input, {\n valid: result.valid,\n errors: result.errors,\n warnings: result.warnings,\n tokenCount: result.tokenCount,\n fileCount: result.fileCount,\n });\n\n // Aggregate results\n errors.push(...result.errors);\n warnings.push(...result.warnings);\n totalTokenCount += result.tokenCount;\n totalFileCount += result.fileCount;\n for (const mode of result.detectedModes) {\n detectedModes.add(mode);\n }\n }\n\n // Check for unexpected files in the exports directory\n try {\n const existingFiles = readdirSync(targetDir).filter(\n (f) => f.endsWith('.json') && statSync(join(targetDir, f)).isFile()\n );\n const expectedFiles = new Set(Object.values(collections).map((c) => c.input));\n\n for (const file of existingFiles) {\n if (!expectedFiles.has(file)) {\n warnings.push({\n path: join(targetDir, file),\n message: `Unexpected file in exports directory: ${file}`,\n severity: 'warning',\n });\n }\n }\n } catch {\n // Ignore read errors\n }\n\n // In strict mode, treat warnings as errors\n const effectiveErrors = strict ? [...errors, ...warnings] : errors;\n\n return {\n valid: effectiveErrors.length === 0,\n errors,\n warnings,\n files,\n detectedModes,\n missingFiles,\n tokenCount: totalTokenCount,\n fileCount: totalFileCount,\n };\n}\n\n/**\n * Detect modes from Figma export data\n */\nexport function detectModes(data: FigmaExport, collectionName?: string): string[] {\n if (!data || typeof data !== 'object') {\n return ['Base'];\n }\n\n // If collection name is specified, look for that collection\n if (collectionName) {\n const collection = Object.entries(data).find(\n ([key]) => key.toLowerCase() === collectionName.toLowerCase()\n )?.[1] as FigmaCollection | undefined;\n\n if (collection?.modes) {\n return Object.keys(collection.modes);\n }\n return ['Base'];\n }\n\n // Otherwise, look for modes in any collection\n for (const [, value] of Object.entries(data)) {\n if (typeof value === 'object' && value !== null) {\n const collection = value as FigmaCollection;\n if (collection.modes) {\n return Object.keys(collection.modes);\n }\n }\n }\n\n return ['Base'];\n}\n\n// ============================================================================\n// CLI Support\n// ============================================================================\n\n/**\n * CLI entry point for Figma validation\n */\nexport function validateFigmaCLI(\n exportsDir: string,\n options: Omit<ValidateFigmaOptions, 'exportsDir'> = {}\n): boolean {\n console.info(`\\n🔍 Validating Figma exports in: ${exportsDir}\\n`);\n\n const result = validateFigmaExports({ ...options, exportsDir });\n\n // Report results per file\n for (const [file, fileResult] of result.files) {\n if (fileResult.errors.length === 0 && fileResult.warnings.length === 0) {\n console.info(`✅ ${file}`);\n } else {\n console.info(`\\n📄 ${file}`);\n for (const error of fileResult.errors) {\n console.error(` ❌ ${error.path}: ${error.message}`);\n }\n for (const warning of fileResult.warnings) {\n console.warn(` ⚠️ ${warning.path}: ${warning.message}`);\n }\n }\n }\n\n // Report missing files\n if (result.missingFiles.length > 0) {\n console.warn(`\\n⚠️ Missing files: ${result.missingFiles.join(', ')}`);\n }\n\n // Report detected modes\n if (result.detectedModes.size > 0) {\n console.info(`\\n📊 Detected modes: ${[...result.detectedModes].join(', ')}`);\n }\n\n // Summary\n console.info(`\\n${'─'.repeat(50)}`);\n if (result.valid) {\n console.info('✅ All Figma exports are valid');\n } else {\n console.error(\n `❌ Validation failed: ${result.errors.length} error(s), ${result.warnings.length} warning(s)`\n );\n }\n\n return result.valid;\n}\n","/**\n * Token Transformation module\n *\n * Transforms Figma token exports to Style Dictionary format with DTCG compliance.\n *\n * @packageDocumentation\n */\n\n/* eslint-disable no-console, security/detect-non-literal-fs-filename */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, extname, join } from 'node:path';\n\nimport type {\n DTCGToken,\n FigmaExport,\n TokenType,\n TransformOptions,\n TransformResult,\n} from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extractor function type\n */\ntype ExtractorFn = (data: FigmaExport, mode?: string) => Record<string, unknown>;\n\n/**\n * Collection output configuration\n */\ninterface CollectionOutput {\n /** Output file path relative to output directory */\n file: string;\n /** Extractor function for this output */\n extractor: ExtractorFn;\n}\n\n/**\n * Collection configuration\n */\ninterface CollectionConfig {\n /** Input filename */\n input: string;\n /** Whether collection has mode variants (Light/Dark) */\n modeAware: boolean;\n /** Output configurations */\n outputs: CollectionOutput[];\n}\n\n/**\n * Collections configuration map\n */\ninterface CollectionsConfig {\n [key: string]: CollectionConfig;\n}\n\n/**\n * Transform options specific to token values\n */\ninterface TokenTransformOptions {\n /** Font stack to prepend font name to */\n fontStack?: string;\n /** Token path for context-aware transformations */\n tokenPath?: string;\n /** Token scopes from Figma */\n scopes?: string[];\n /** Whether value represents a circle (50%) */\n isCircle?: boolean;\n /** Whether value represents a pill (9999px) */\n isPill?: boolean;\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/** Keys that could cause prototype pollution */\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** Check if a key is safe from prototype pollution */\nfunction isSafeKey(key: string): boolean {\n return !UNSAFE_KEYS.has(key);\n}\n\n/**\n * Safe nested property access for objects with index signatures\n */\nfunction getNestedValue(obj: unknown, ...keys: string[]): unknown {\n let current: unknown = obj;\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n if (!isSafeKey(key)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\n// ============================================================================\n// Value Transformation\n// ============================================================================\n\n/**\n * Check if a token should remain unitless\n */\nfunction shouldKeepUnitless(_type: string, scopes: string[] = [], tokenPath = ''): boolean {\n // Font weights must be unitless (300, 400, 700, etc.)\n if (scopes.includes('FONT_WEIGHT')) {\n return true;\n }\n\n // Line heights should be unitless for proper inheritance (1, 1.5, 2, etc.)\n if (scopes.includes('LINE_HEIGHT')) {\n return true;\n }\n\n // Grid configuration values should be unitless (12 columns, 6 row-columns, etc.)\n const pathLower = tokenPath.toLowerCase();\n if (pathLower.includes('columns') || pathLower.includes('row-columns')) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Check if px units should be added to a number value\n */\nfunction shouldAddUnit(type: string, scopes: string[] = [], tokenPath = ''): boolean {\n // Don't add units to font-weights, line-heights, or grid configuration\n if (shouldKeepUnitless(type, scopes, tokenPath)) {\n return false;\n }\n\n return type === 'number';\n}\n\n/**\n * Transform value based on type\n */\nexport function transformValue(\n value: unknown,\n type: string | undefined,\n options: TokenTransformOptions = {}\n): unknown {\n // Handle font family special case - prepend font name to font stack\n if (type === 'string' && options.fontStack && typeof value === 'string') {\n const fontName = value;\n const stack = options.fontStack;\n\n // Check if font name is already in the stack (avoid duplicates)\n if (stack.toLowerCase().includes(fontName.toLowerCase())) {\n return stack;\n }\n\n // Prepend font name to stack\n return `${fontName}, ${stack}`;\n }\n\n // Handle line-height: keep as unitless number (CSS best practice)\n if (\n typeof value === 'number' &&\n shouldKeepUnitless(type ?? '', options.scopes, options.tokenPath)\n ) {\n return value;\n }\n\n // Handle numbers that should be dimensions\n if (typeof value === 'number' && shouldAddUnit(type ?? '', options.scopes, options.tokenPath)) {\n // Special case for circle radius (percentage)\n if (options.isCircle) {\n return '50%';\n }\n // Special case for pill radius\n if (options.isPill) {\n return '9999px';\n }\n return `${value}px`;\n }\n\n // Return value as-is for colors, strings, etc.\n return value;\n}\n\n/**\n * Transform type from Figma to DTCG standard\n */\nexport function transformType(figmaType: string | undefined): TokenType | undefined {\n if (!figmaType) {\n return undefined;\n }\n\n const typeMap: Record<string, TokenType> = {\n number: 'dimension',\n string: 'fontFamily',\n color: 'color',\n };\n\n return typeMap[figmaType] ?? (figmaType as TokenType);\n}\n\n/**\n * Transform a single token from Figma format to DTCG-compliant format\n */\nexport function transformToken(\n figmaToken: unknown,\n options: TokenTransformOptions = {}\n): DTCGToken | null {\n if (!figmaToken || typeof figmaToken !== 'object') {\n return null;\n }\n\n const tokenObj = figmaToken as Record<string, unknown>;\n\n // Skip if this is not a leaf token (no $value property)\n if (!Object.hasOwn(tokenObj, '$value')) {\n return null;\n }\n\n // Pass scopes to transformValue for type-specific handling\n const transformOptions: TokenTransformOptions = {\n ...options,\n scopes: (tokenObj['$scopes'] as string[] | undefined) ?? [],\n };\n\n const rawType = tokenObj['$type'] as string | undefined;\n const transformedType = transformType(rawType);\n\n // DTCG Format: Keep $ prefix for all properties\n const token: DTCGToken = {\n $value: transformValue(tokenObj['$value'], rawType, transformOptions),\n $type: transformedType ?? 'string',\n };\n\n // Add description if present (DTCG property)\n if (tokenObj['$description'] && typeof tokenObj['$description'] === 'string') {\n token.$description = tokenObj['$description'];\n }\n\n // Preserve extensions (DTCG property) - keeps all metadata\n if (tokenObj['$extensions'] && typeof tokenObj['$extensions'] === 'object') {\n token.$extensions = tokenObj['$extensions'] as Record<string, unknown>;\n }\n\n return token;\n}\n\n/**\n * Recursively transform nested token objects\n */\nexport function transformTokenTree(\n obj: unknown,\n parentKey = '',\n options: Record<string, TokenTransformOptions> = {}\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) {\n return result;\n }\n\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n // Build the full path for this token\n const currentPath = parentKey ? `${parentKey}.${key}` : key;\n\n // Try to transform as a token\n const tokenOptions: TokenTransformOptions = {\n ...(options[key] ?? {}),\n tokenPath: currentPath,\n };\n const transformed = transformToken(value, tokenOptions);\n\n if (transformed) {\n result[key] = transformed;\n } else if (typeof value === 'object' && value !== null) {\n // Recursively process nested objects\n const nested = transformTokenTree(\n value,\n currentPath,\n (options[key] as Record<string, TokenTransformOptions>) ?? {}\n );\n if (Object.keys(nested).length > 0) {\n result[key] = nested;\n }\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Extractors\n// ============================================================================\n\n/**\n * Extract brand colors from foundation collection\n */\nfunction extractBrandColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const brandData = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'brand');\n\n if (!brandData) {\n console.warn(`No brand colors found in ${mode} mode`);\n return {};\n }\n\n return {\n color: transformTokenTree(brandData),\n };\n}\n\n/**\n * Extract theme colors from foundation collection\n */\nfunction extractThemeColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const themeData = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'theme');\n\n if (!themeData) {\n console.warn(`No theme colors found in ${mode} mode`);\n return {};\n }\n\n return {\n theme: transformTokenTree(themeData),\n };\n}\n\n/**\n * Extract semantic/component colors from foundation collection\n */\nfunction extractSemanticColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const semantic = getNestedValue(data, 'Foundation', 'modes', mode, 'semantic');\n\n if (!semantic) {\n console.warn(`No semantic colors found in ${mode} mode`);\n return {};\n }\n\n return {\n semantic: transformTokenTree(semantic),\n };\n}\n\n/**\n * Extract neutral colors (black, white, grays)\n */\nfunction extractNeutralColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const neutral = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'neutral');\n\n if (!neutral) {\n console.warn(`No neutral colors found in ${mode} mode`);\n return {};\n }\n\n return {\n neutral: transformTokenTree(neutral),\n };\n}\n\n/**\n * Extract background colors\n */\nfunction extractBackgroundColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const background = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'background');\n\n if (!background) {\n console.warn(`No background colors found in ${mode} mode`);\n return {};\n }\n\n return {\n background: transformTokenTree(background),\n };\n}\n\n/**\n * Extract opacity scale\n */\nfunction extractOpacityColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const opacity = getNestedValue(data, 'Foundation', 'modes', mode, 'colors', 'opacity');\n\n if (!opacity) {\n console.warn(`No opacity tokens found in ${mode} mode`);\n return {};\n }\n\n return {\n opacity: transformTokenTree(opacity),\n };\n}\n\n/**\n * Extract border colors\n */\nfunction extractBorderColors(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const borderColor = getNestedValue(data, 'Foundation', 'modes', mode, 'borders', 'color');\n\n if (!borderColor) {\n console.warn(`No border color tokens found in ${mode} mode`);\n return {};\n }\n\n return {\n border: {\n color: transformTokenTree(borderColor),\n },\n };\n}\n\n/**\n * Extract border widths\n */\nfunction extractBorderWidths(data: FigmaExport, mode = 'Light'): Record<string, unknown> {\n const borderWidth = getNestedValue(data, 'Foundation', 'modes', mode, 'borders', 'width');\n\n if (!borderWidth) {\n console.warn(`No border width tokens found in ${mode} mode`);\n return {};\n }\n\n return {\n border: {\n width: transformTokenTree(borderWidth),\n },\n };\n}\n\n/**\n * Extract typography tokens\n */\nfunction extractTypography(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Typography', 'modes', 'Base') as\n | Record<string, unknown>\n | undefined;\n\n if (!base) {\n console.warn('No typography tokens found');\n return {};\n }\n\n // Special handling for font families - use font stacks from extensions\n const options: Record<string, TokenTransformOptions> = {};\n const fontFamily = base['fontFamily'] as Record<string, Record<string, unknown>> | undefined;\n if (fontFamily) {\n for (const key of Object.keys(fontFamily)) {\n const fontToken = fontFamily[key];\n const extensions = fontToken?.['$extensions'] as\n | Record<string, Record<string, string>>\n | undefined;\n const fontStack = extensions?.['platform']?.['fontStack'];\n if (fontStack) {\n options[key] = { fontStack };\n }\n }\n }\n\n return {\n typography: transformTokenTree(base, '', { fontFamily: options } as Record<\n string,\n TokenTransformOptions\n >),\n };\n}\n\n/**\n * Extract spacing tokens\n */\nfunction extractSpacing(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Spacing', 'modes', 'Base', 'spacing');\n\n if (!base) {\n console.warn('No spacing tokens found');\n return {};\n }\n\n return {\n spacing: transformTokenTree(base),\n };\n}\n\n/**\n * Extract border radius tokens\n */\nfunction extractRadius(data: FigmaExport): Record<string, unknown> {\n // Support both 'border-radius' (Bootstrap naming) and 'radius' (legacy Figma naming)\n const base =\n getNestedValue(data, 'Radius', 'modes', 'Base', 'border-radius') ||\n getNestedValue(data, 'Radius', 'modes', 'Base', 'radius');\n\n if (!base) {\n console.warn('No radius tokens found');\n return {};\n }\n\n // Special handling for circle and pill\n const options: Record<string, TokenTransformOptions> = {\n circle: { isCircle: true },\n pill: { isPill: true },\n };\n\n return {\n border: {\n radius: transformTokenTree(base, '', options),\n },\n };\n}\n\n/**\n * Extract breakpoint tokens\n */\nfunction extractBreakpoints(data: FigmaExport): Record<string, unknown> {\n const breakpoints = getNestedValue(data, 'Layout', 'modes', 'Base', 'breakpoints');\n\n if (!breakpoints) {\n console.warn('No breakpoint tokens found');\n return {};\n }\n\n return {\n layout: {\n breakpoints: transformTokenTree(breakpoints),\n },\n };\n}\n\n/**\n * Extract container tokens\n */\nfunction extractContainers(data: FigmaExport): Record<string, unknown> {\n const container = getNestedValue(data, 'Layout', 'modes', 'Base', 'container');\n\n if (!container) {\n console.warn('No container tokens found');\n return {};\n }\n\n return {\n layout: {\n container: transformTokenTree(container),\n },\n };\n}\n\n/**\n * Extract grid tokens\n */\nfunction extractGrid(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Layout', 'modes', 'Base') as\n | Record<string, unknown>\n | undefined;\n const grid = base?.['grid'];\n const gutters = base?.['gutters'];\n\n if (!grid) {\n console.warn('No grid tokens found');\n return {};\n }\n\n const result: { layout: { grid: Record<string, unknown>; gutters?: Record<string, unknown> } } = {\n layout: {\n grid: transformTokenTree(grid),\n },\n };\n\n if (gutters) {\n result.layout.gutters = transformTokenTree(gutters);\n }\n\n return result;\n}\n\n/**\n * Extract shadow tokens (use composite values)\n */\nfunction extractShadows(data: FigmaExport): Record<string, unknown> {\n const base = getNestedValue(data, 'Shadows', 'modes', 'Base', 'shadows') as\n | Record<string, Record<string, unknown>>\n | undefined;\n\n if (!base) {\n console.warn('No shadow tokens found');\n return {};\n }\n\n const result: { shadow: Record<string, DTCGToken> } = { shadow: {} };\n\n for (const [key, value] of Object.entries(base)) {\n const composite = value?.['composite'] as Record<string, unknown> | undefined;\n if (composite) {\n const token: DTCGToken = {\n $value: composite['$value'],\n $type: 'shadow',\n };\n\n if (composite['$description'] && typeof composite['$description'] === 'string') {\n token.$description = composite['$description'];\n }\n\n if (composite['$extensions'] && typeof composite['$extensions'] === 'object') {\n token.$extensions = composite['$extensions'] as Record<string, unknown>;\n }\n\n result.shadow[key] = token;\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Default Collections Configuration\n// ============================================================================\n\n/**\n * Default collections configuration matching the original script\n */\nconst DEFAULT_COLLECTIONS: CollectionsConfig = {\n foundation: {\n input: 'foundation.json',\n modeAware: true,\n outputs: [\n { file: 'collections/color/primitive.json', extractor: extractBrandColors },\n { file: 'collections/color/neutral.json', extractor: extractNeutralColors },\n { file: 'collections/color/background.json', extractor: extractBackgroundColors },\n { file: 'collections/color/opacity.json', extractor: extractOpacityColors },\n { file: 'collections/color/semantic.json', extractor: extractThemeColors },\n { file: 'collections/color/component.json', extractor: extractSemanticColors },\n { file: 'collections/border/color.json', extractor: extractBorderColors },\n { file: 'collections/border/width.json', extractor: extractBorderWidths },\n ],\n },\n typography: {\n input: 'typography.json',\n modeAware: false,\n outputs: [{ file: 'collections/typography/base.json', extractor: extractTypography }],\n },\n spacing: {\n input: 'spacing.json',\n modeAware: false,\n outputs: [{ file: 'collections/spacing/base.json', extractor: extractSpacing }],\n },\n radius: {\n input: 'radius.json',\n modeAware: false,\n outputs: [{ file: 'collections/border/radius.json', extractor: extractRadius }],\n },\n layout: {\n input: 'layout.json',\n modeAware: false,\n outputs: [\n { file: 'collections/layout/breakpoints.json', extractor: extractBreakpoints },\n { file: 'collections/layout/containers.json', extractor: extractContainers },\n { file: 'collections/layout/grid.json', extractor: extractGrid },\n ],\n },\n shadows: {\n input: 'shadows.json',\n modeAware: false,\n outputs: [{ file: 'collections/shadow/base.json', extractor: extractShadows }],\n },\n};\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Ensure directory exists\n */\nfunction ensureDir(filePath: string): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\n/**\n * Detect modes from Figma export data\n */\nexport function detectModes(data: FigmaExport, collectionPath?: string): string[] {\n if (!data || typeof data !== 'object') {\n return ['Base'];\n }\n\n // If collection path is specified, look for that collection\n if (collectionPath) {\n const collection = getNestedValue(data, collectionPath) as Record<string, unknown> | undefined;\n const modes = collection?.['modes'] as Record<string, unknown> | undefined;\n if (modes) {\n return Object.keys(modes);\n }\n return ['Base'];\n }\n\n // Otherwise, look for modes in any collection\n for (const value of Object.values(data)) {\n if (typeof value === 'object' && value !== null) {\n const collection = value as Record<string, unknown>;\n const modes = collection['modes'] as Record<string, unknown> | undefined;\n if (modes) {\n return Object.keys(modes);\n }\n }\n }\n\n return ['Base'];\n}\n\n/**\n * Get input source based on configuration with automatic fallback\n */\nfunction getInputSource(\n collectionConfig: CollectionConfig,\n exportsDir: string,\n buildSource: string\n): string {\n const themeFile = join(exportsDir, 'theme.json');\n const collectionFile = join(exportsDir, collectionConfig.input);\n\n if (buildSource === 'theme') {\n // Prefer theme.json, fallback to collection file\n if (existsSync(themeFile)) {\n return themeFile;\n }\n if (existsSync(collectionFile)) {\n console.warn(` ⚠️ theme.json not found, using ${collectionConfig.input}`);\n return collectionFile;\n }\n return themeFile;\n }\n\n // Prefer collection file, fallback to theme.json\n if (existsSync(collectionFile)) {\n return collectionFile;\n }\n if (existsSync(themeFile)) {\n console.warn(` ⚠️ ${collectionConfig.input} not found, using theme.json`);\n return themeFile;\n }\n return collectionFile;\n}\n\n// ============================================================================\n// Main Transformation\n// ============================================================================\n\n/**\n * Transform Figma tokens to Style Dictionary format\n */\nexport function transformTokens(options: TransformOptions): TransformResult {\n const {\n sourceDir,\n collectionsDir,\n ignoreModes = [],\n defaultMode = 'Light',\n dryRun = false,\n verbose = false,\n } = options;\n\n const startTime = Date.now();\n const errors: string[] = [];\n const warnings: string[] = [];\n const filesWritten: string[] = [];\n const allModesDetected: Set<string> = new Set();\n let tokensProcessed = 0;\n\n if (verbose) {\n console.info('🎨 Transforming Figma tokens to Style Dictionary format...\\n');\n console.info('📋 Configuration:');\n console.info(` Source directory: ${sourceDir}`);\n console.info(` Output directory: ${collectionsDir}`);\n console.info(` Default mode: ${defaultMode}`);\n if (ignoreModes.length > 0) {\n console.info(` Ignored modes: ${ignoreModes.join(', ')}`);\n }\n if (dryRun) {\n console.info(' DRY RUN - no files will be written');\n }\n console.info('');\n }\n\n // Detect modes from theme.json\n const detectedModes: Record<string, string[]> = {};\n const themeFile = join(sourceDir, 'theme.json');\n if (existsSync(themeFile)) {\n try {\n const content = readFileSync(themeFile, 'utf-8');\n const themeData = JSON.parse(content) as FigmaExport;\n\n // Detect modes for each collection\n for (const [name, collectionConfig] of Object.entries(DEFAULT_COLLECTIONS)) {\n const typedConfig = collectionConfig as CollectionConfig;\n if (typedConfig.modeAware) {\n const collectionPath = name.charAt(0).toUpperCase() + name.slice(1);\n const modes = detectModes(themeData, collectionPath);\n if (modes.length > 0) {\n detectedModes[collectionPath] = modes;\n for (const mode of modes) {\n allModesDetected.add(mode);\n }\n }\n }\n }\n } catch (error) {\n warnings.push(\n `Failed to read theme.json for mode detection: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n // Process each collection\n for (const [collectionName, collectionConfig] of Object.entries(DEFAULT_COLLECTIONS)) {\n const typedConfig = collectionConfig as CollectionConfig;\n if (verbose) {\n console.info(`Processing ${collectionName} collection...`);\n }\n\n // Get input path based on configuration\n const inputPath = getInputSource(typedConfig, sourceDir, 'theme');\n\n // Check if input file exists\n if (!existsSync(inputPath)) {\n warnings.push(`Input file not found: ${inputPath}`);\n continue;\n }\n\n // Read input file\n let data: FigmaExport;\n try {\n const content = readFileSync(inputPath, 'utf-8');\n data = JSON.parse(content) as FigmaExport;\n } catch (error) {\n errors.push(\n `Failed to read ${inputPath}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n continue;\n }\n\n // Determine which modes to process for this collection\n let modesToProcess = [defaultMode];\n if (typedConfig.modeAware) {\n const collectionPath = collectionName.charAt(0).toUpperCase() + collectionName.slice(1);\n if (detectedModes[collectionPath]) {\n modesToProcess = detectedModes[collectionPath].filter((m) => !ignoreModes.includes(m));\n } else {\n const modes = detectModes(data, collectionPath);\n if (modes.length > 1 || !modes.includes('Base')) {\n modesToProcess = modes.filter((m) => !ignoreModes.includes(m));\n }\n }\n }\n\n // Process each output\n for (const output of typedConfig.outputs) {\n for (const mode of modesToProcess) {\n // Generate the output file path\n let outputFile = output.file;\n if (typedConfig.modeAware && modesToProcess.length > 1) {\n const ext = extname(output.file);\n const base = basename(output.file, ext);\n const dir = dirname(output.file);\n\n if (mode !== defaultMode) {\n outputFile = join(dir, `${base}-${mode.toLowerCase()}${ext}`);\n }\n }\n\n const outputPath = join(collectionsDir, outputFile);\n\n try {\n // Extract and transform tokens\n const tokens = typedConfig.modeAware\n ? output.extractor(data, mode)\n : output.extractor(data);\n\n const tokenCount = Object.keys(tokens).length;\n if (tokenCount === 0) {\n warnings.push(`No tokens extracted for ${outputFile} (${mode} mode)`);\n continue;\n }\n\n tokensProcessed += tokenCount;\n\n if (!dryRun) {\n // Ensure output directory exists\n ensureDir(outputPath);\n\n // Write output file\n writeFileSync(outputPath, `${JSON.stringify(tokens, null, 2)}\\n`, 'utf-8');\n }\n\n filesWritten.push(outputFile);\n\n if (verbose) {\n const dryRunLabel = dryRun ? ' (dry run)' : '';\n console.info(\n ` ✅ Created ${outputFile}${modesToProcess.length > 1 ? ` (${mode})` : ''}${dryRunLabel}`\n );\n }\n } catch (error) {\n errors.push(\n `Error processing ${outputFile}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n }\n }\n\n const duration = Date.now() - startTime;\n\n if (verbose) {\n console.info('\\n✨ Transformation complete!');\n console.info(`\\n📁 Output directory: ${collectionsDir}`);\n console.info(`⏱️ Duration: ${duration}ms`);\n }\n\n return {\n success: errors.length === 0,\n filesWritten,\n tokensProcessed,\n modesDetected: Array.from(allModesDetected),\n errors,\n warnings,\n duration,\n };\n}\n\n/**\n * CLI entry point for token transformation\n */\nexport function transformTokensCLI(\n sourceDir: string,\n collectionsDir: string,\n options: Partial<Omit<TransformOptions, 'sourceDir' | 'collectionsDir'>> = {}\n): boolean {\n const result = transformTokens({\n sourceDir,\n collectionsDir,\n verbose: true,\n ...options,\n });\n\n // Report errors\n for (const error of result.errors) {\n console.error(`❌ ${error}`);\n }\n\n // Report warnings\n for (const warning of result.warnings) {\n console.warn(`⚠️ ${warning}`);\n }\n\n return result.success;\n}\n","/**\n * @file Token Sync Module\n * @description Synchronizes generated tokens from Style Dictionary output to TypeScript source\n *\n * This module handles syncing the generated tokens from dist/js/tokens.js\n * to src/tokens-flat.ts so that tsup can bundle them correctly.\n *\n * This ensures that when font families or other tokens change in Figma,\n * the changes automatically propagate to the TypeScript source.\n *\n * @module @dsai-io/tools/tokens/sync\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\n\nimport type { SyncOptions, SyncResult } from './types';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default source file relative path from tokens package */\nconst DEFAULT_SOURCE_RELATIVE = 'dist/js/tokens.js';\n\n/** Default target file relative path from tokens package */\nconst DEFAULT_TARGET_RELATIVE = 'src/tokens-flat.ts';\n\n/** TypeScript header template for generated file */\nconst TS_HEADER = `/**\n * Do not edit directly, this file was auto-generated.\n * Generated from Style Dictionary output (dist/js/tokens.js)\n *\n * To update: run \\`pnpm tokens:build\\` which will:\n * 1. Transform Figma tokens\n * 2. Build with Style Dictionary\n * 3. Sync this file automatically\n */\n\n`;\n\n/** Font families to verify in output */\nconst EXPECTED_FONTS = ['Inter', 'Roboto Mono'] as const;\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Verify that expected font families are present in the content\n */\nfunction verifyFontFamilies(content: string): { found: string[]; missing: string[] } {\n const found: string[] = [];\n const missing: string[] = [];\n\n for (const font of EXPECTED_FONTS) {\n // Check for font in various formats: \"'Inter,\" or \"Inter,\"\n const pattern = `'${font},`;\n if (content.includes(pattern) || content.includes(`\"${font},`)) {\n found.push(font);\n } else {\n missing.push(font);\n }\n }\n\n return { found, missing };\n}\n\n/**\n * Count token exports in content\n */\nfunction countTokenExports(content: string): number {\n // Count export const declarations\n const exportPattern = /export\\s+const\\s+\\w+/g;\n const matches = content.match(exportPattern);\n return matches ? matches.length : 0;\n}\n\n/**\n * Compute default file paths from tokens directory\n */\nexport function getDefaultSyncPaths(tokensDir: string): { sourceFile: string; targetFile: string } {\n return {\n sourceFile: join(tokensDir, DEFAULT_SOURCE_RELATIVE),\n targetFile: join(tokensDir, DEFAULT_TARGET_RELATIVE),\n };\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Sync tokens from Style Dictionary output to TypeScript source\n *\n * @example\n * ```typescript\n * // Sync with explicit paths\n * const result = syncTokens({\n * sourceFile: './packages/@dsai-io/tokens/dist/js/tokens.js',\n * targetFile: './packages/@dsai-io/tokens/src/tokens-flat.ts',\n * });\n *\n * // Sync with paths computed from tokens directory\n * const paths = getDefaultSyncPaths('./packages/@dsai-io/tokens');\n * const result = syncTokens(paths);\n * ```\n */\nexport function syncTokens(options: SyncOptions): SyncResult {\n const { sourceFile, targetFile, dryRun = false, verbose = false } = options;\n\n const errors: string[] = [];\n\n if (verbose) {\n console.info('🔄 Syncing tokens from Style Dictionary output...');\n console.info(` Source: ${sourceFile}`);\n console.info(` Target: ${targetFile}`);\n if (dryRun) {\n console.info(' DRY RUN - no files will be written');\n }\n }\n\n // Check if source file exists\n if (!existsSync(sourceFile)) {\n const error = `Source file not found: ${sourceFile}`;\n if (verbose) {\n console.error(`❌ ${error}`);\n }\n return {\n success: false,\n tokensCount: 0,\n changed: false,\n errors: [error],\n };\n }\n\n // Read source content\n let sourceContent: string;\n try {\n sourceContent = readFileSync(sourceFile, 'utf-8');\n } catch (err) {\n const error = `Failed to read source file: ${err instanceof Error ? err.message : 'Unknown error'}`;\n if (verbose) {\n console.error(`❌ ${error}`);\n }\n return {\n success: false,\n tokensCount: 0,\n changed: false,\n errors: [error],\n };\n }\n\n // Generate TypeScript content\n const tsContent = `${TS_HEADER}${sourceContent}`;\n\n // Verify font families\n const fontFamilies = verifyFontFamilies(sourceContent);\n if (fontFamilies.missing.length > 0) {\n for (const font of fontFamilies.missing) {\n errors.push(`Font family may be missing: ${font}`);\n }\n }\n\n // Count tokens\n const tokensCount = countTokenExports(sourceContent);\n\n // Check if target already exists and has same content\n let changed = true;\n if (existsSync(targetFile)) {\n try {\n const existingContent = readFileSync(targetFile, 'utf-8');\n if (existingContent === tsContent) {\n changed = false;\n if (verbose) {\n console.info('✅ Target file is already up to date');\n }\n }\n } catch {\n // Ignore read errors, will overwrite\n }\n }\n\n // Write target file if changed\n if (changed && !dryRun) {\n try {\n // Ensure target directory exists\n const targetDir = dirname(targetFile);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n writeFileSync(targetFile, tsContent, 'utf-8');\n } catch (err) {\n const error = `Failed to write target file: ${err instanceof Error ? err.message : 'Unknown error'}`;\n if (verbose) {\n console.error(`❌ ${error}`);\n }\n return {\n success: false,\n tokensCount,\n changed: false,\n errors: [error],\n };\n }\n }\n\n if (verbose) {\n if (changed) {\n console.info('✅ Successfully synced tokens');\n }\n console.info(` Tokens exported: ${tokensCount}`);\n if (fontFamilies.found.length > 0) {\n console.info(` Font families found: ${fontFamilies.found.join(', ')}`);\n }\n if (fontFamilies.missing.length > 0) {\n console.warn(` ⚠️ Missing fonts: ${fontFamilies.missing.join(', ')}`);\n }\n }\n\n return {\n success: errors.length === 0 || errors.every((e) => e.includes('Font family')),\n tokensCount,\n changed,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n/**\n * CLI entry point for token sync\n */\nexport function syncTokensCLI(tokensDir: string): boolean {\n const paths = getDefaultSyncPaths(tokensDir);\n const result = syncTokens({\n ...paths,\n verbose: true,\n });\n\n // Report errors (non-critical ones like missing fonts)\n if (result.errors) {\n for (const error of result.errors) {\n if (error.includes('Font family')) {\n console.warn(`⚠️ ${error}`);\n } else {\n console.error(`❌ ${error}`);\n }\n }\n }\n\n return result.success;\n}\n","/**\n * @file CSS Post-processing Module\n * @description Post-processes CSS files after SASS compilation\n *\n * This module applies DSAi-specific transformations to compiled CSS:\n * - Replaces `data-bs-theme` with `data-dsai-theme` for custom theme attribute\n * - Applies configurable text replacements\n *\n * @module @dsai-io/tools/tokens/postprocess\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { PostprocessOptions, PostprocessResult, ReplacementRule } from './types';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default CSS distribution directory relative to tokens package */\nconst DEFAULT_CSS_DIR = 'dist/css';\n\n/** Default files to process */\nconst DEFAULT_FILES = ['dsai-theme-bs.css', 'dsai-theme-bs.min.css'];\n\n/** Default transformations to apply */\nconst DEFAULT_TRANSFORMATIONS: ReplacementRule[] = [\n {\n description: 'Theme attribute',\n from: /data-bs-theme/g,\n to: 'data-dsai-theme',\n },\n];\n\n// ============================================================================\n// Core Functions\n// ============================================================================\n\n/**\n * Apply all replacements to content\n */\nfunction applyReplacements(\n content: string,\n replacements: ReplacementRule[],\n verbose: boolean\n): { result: string; count: number } {\n let result = content;\n let totalCount = 0;\n\n for (const rule of replacements) {\n // Count matches first\n let matchCount = 0;\n\n if (typeof rule.from === 'string') {\n // For string patterns, count occurrences manually\n let pos = 0;\n const searchStr = rule.from;\n while (pos < result.length) {\n const idx = result.indexOf(searchStr, pos);\n if (idx === -1) {\n break;\n }\n matchCount++;\n pos = idx + 1;\n }\n // Replace all occurrences using split/join (safe, no regex)\n if (matchCount > 0) {\n result = result.split(rule.from).join(rule.to);\n }\n } else {\n // For regex patterns, use as-is\n const matches = result.match(rule.from);\n matchCount = matches ? matches.length : 0;\n if (matchCount > 0) {\n result = result.replace(rule.from, rule.to);\n }\n }\n\n if (matchCount > 0) {\n totalCount += matchCount;\n if (verbose) {\n const desc =\n rule.description ?? (typeof rule.from === 'string' ? rule.from : String(rule.from));\n console.info(` ✓ ${desc}: ${matchCount} replacement(s)`);\n }\n }\n }\n\n return { result, count: totalCount };\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Post-process a single CSS file\n *\n * @example\n * ```typescript\n * const result = postprocessCss({\n * inputFile: './dist/css/theme.css',\n * replacements: [\n * { from: /data-bs-theme/g, to: 'data-dsai-theme', description: 'Theme attribute' }\n * ],\n * });\n * ```\n */\nexport function postprocessCss(options: PostprocessOptions): PostprocessResult {\n const {\n inputFile,\n outputFile = inputFile,\n replacements = DEFAULT_TRANSFORMATIONS,\n dryRun = false,\n verbose = false,\n } = options;\n\n // Check if input file exists\n if (!existsSync(inputFile)) {\n return {\n success: false,\n replacementsMade: 0,\n outputFile,\n errors: [`File not found: ${inputFile}`],\n };\n }\n\n // Read input content\n let content: string;\n try {\n content = readFileSync(inputFile, 'utf-8');\n } catch (err) {\n return {\n success: false,\n replacementsMade: 0,\n outputFile,\n errors: [`Failed to read file: ${err instanceof Error ? err.message : 'Unknown error'}`],\n };\n }\n\n // Apply replacements\n const { result, count } = applyReplacements(content, replacements, verbose);\n\n // Write output if changed and not dry run\n if (count > 0 && !dryRun) {\n try {\n writeFileSync(outputFile, result, 'utf-8');\n } catch (err) {\n return {\n success: false,\n replacementsMade: count,\n outputFile,\n errors: [`Failed to write file: ${err instanceof Error ? err.message : 'Unknown error'}`],\n };\n }\n }\n\n return {\n success: true,\n replacementsMade: count,\n outputFile,\n };\n}\n\n/**\n * Post-process multiple CSS files in a directory\n *\n * @example\n * ```typescript\n * const results = postprocessCssFiles({\n * cssDir: './packages/@dsai-io/tokens/dist/css',\n * files: ['dsai-theme-bs.css', 'dsai-theme-bs.min.css'],\n * });\n * ```\n */\nexport function postprocessCssFiles(options: {\n cssDir: string;\n files?: string[];\n replacements?: ReplacementRule[];\n dryRun?: boolean;\n verbose?: boolean;\n}): { success: boolean; filesModified: number; totalReplacements: number; errors: string[] } {\n const {\n cssDir,\n files = DEFAULT_FILES,\n replacements = DEFAULT_TRANSFORMATIONS,\n dryRun = false,\n verbose = false,\n } = options;\n\n let filesModified = 0;\n let totalReplacements = 0;\n const errors: string[] = [];\n\n if (verbose) {\n console.info('🔧 Post-processing CSS files...\\n');\n }\n\n for (const fileName of files) {\n const filePath = join(cssDir, fileName);\n\n if (verbose) {\n console.info(`📄 ${fileName}`);\n }\n\n const result = postprocessCss({\n inputFile: filePath,\n replacements,\n dryRun,\n verbose,\n });\n\n if (result.success) {\n if (result.replacementsMade > 0) {\n filesModified++;\n totalReplacements += result.replacementsMade;\n } else if (verbose) {\n console.info(' (no changes needed)');\n }\n } else if (result.errors) {\n errors.push(...result.errors);\n if (verbose) {\n for (const err of result.errors) {\n console.warn(` ⚠️ ${err}`);\n }\n }\n }\n }\n\n if (verbose) {\n console.info(`\\n✅ Post-processing complete. ${filesModified} file(s) modified.`);\n if (totalReplacements > 0) {\n console.info(` Total replacements: ${totalReplacements}`);\n }\n }\n\n return {\n success: errors.length === 0,\n filesModified,\n totalReplacements,\n errors,\n };\n}\n\n/**\n * CLI entry point for CSS post-processing\n */\nexport function postprocessCLI(tokensDir: string): boolean {\n const cssDir = join(tokensDir, DEFAULT_CSS_DIR);\n\n const result = postprocessCssFiles({\n cssDir,\n verbose: true,\n });\n\n return result.success;\n}\n\n/**\n * Get the default CSS distribution directory path\n */\nexport function getDefaultCssDir(tokensDir: string): string {\n return join(tokensDir, DEFAULT_CSS_DIR);\n}\n\n/**\n * Get the default files to process\n */\nexport function getDefaultFiles(): string[] {\n return [...DEFAULT_FILES];\n}\n\n/**\n * Get the default transformation rules\n */\nexport function getDefaultTransformations(): ReplacementRule[] {\n return [...DEFAULT_TRANSFORMATIONS];\n}\n","/**\n * @file Token Build Module\n * @description Orchestrates the complete token build pipeline\n *\n * Runs all token build steps in sequence with clear logging:\n * 1. Validate tokens\n * 2. Transform Figma tokens\n * 3. Build Style Dictionary outputs (CSS, JS, TS, SCSS, JSON)\n * 4. Sync tokens-flat.ts\n * 5. Compile Bootstrap theme SCSS → CSS\n * 6. Post-process theme CSS (data-bs-theme → data-dsai-theme)\n * 7. Compile DSAi utilities SCSS → CSS\n * 8. Bundle with tsup (ESM + CJS)\n *\n * The pipeline is configurable via dsai.config.mjs tokens.pipeline section.\n * Packages can specify which steps to run and customize paths.\n *\n * @module @dsai-io/tools/tokens/build\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport { execSync } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { postprocessCLI } from './postprocess.js';\nimport { syncTokensCLI } from './sync.js';\nimport { transformTokens } from './transform.js';\n\nimport type { BuildOptions, BuildResult, BuildStep } from './types';\nimport type {\n BuildPipelinePaths,\n BuildPipelineStep,\n TokensBuildPipeline,\n} from '../config/types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Default SASS deprecation silencing flags */\nconst SASS_FLAGS = [\n '--quiet-deps',\n '--silence-deprecation=import',\n '--silence-deprecation=global-builtin',\n '--silence-deprecation=color-functions',\n].join(' ');\n\n/** Minimal SASS flags (no color functions deprecation) */\nconst SASS_FLAGS_MINIMAL = ['--quiet-deps', '--silence-deprecation=import'].join(' ');\n\n/** Default build pipeline steps (full @dsai-io/tokens build) */\nconst DEFAULT_PIPELINE_STEPS: BuildPipelineStep[] = [\n 'validate',\n 'transform',\n 'style-dictionary',\n 'sync',\n 'sass-theme',\n 'sass-theme-minified',\n 'postprocess',\n 'sass-utilities',\n 'sass-utilities-minified',\n 'bundle',\n];\n\n/** Default pipeline paths */\nconst DEFAULT_PIPELINE_PATHS: Required<BuildPipelinePaths> = {\n syncSource: 'dist/js/tokens.js',\n syncTarget: 'src/tokens-flat.ts',\n sassThemeInput: 'src/scss/dsai-theme-bs.scss',\n sassThemeOutput: 'dist/css/dsai-theme-bs.css',\n sassThemeMinifiedOutput: 'dist/css/dsai-theme-bs.min.css',\n sassUtilitiesInput: 'src/scss/dsai-utilities.scss',\n sassUtilitiesOutput: 'dist/css/dsai.css',\n sassUtilitiesMinifiedOutput: 'dist/css/dsai.min.css',\n};\n\n// ============================================================================\n// Build Step Runner\n// ============================================================================\n\n/**\n * Run a single build step\n */\nfunction runStep(step: BuildStep, index: number, total: number, verbose: boolean): boolean {\n const stepNum = `[${index + 1}/${total}]`;\n\n if (step.skip) {\n if (verbose) {\n console.info(`${stepNum} ⏭️ ${step.name} (skipped)`);\n }\n return true;\n }\n\n if (verbose) {\n console.info(`\\n${stepNum} 🔧 ${step.name}`);\n }\n\n // If step has a function, run it\n if (step.fn) {\n try {\n // Run function and check return value\n const result = step.fn();\n if (result instanceof Promise) {\n // We need to handle this synchronously in the build context\n console.warn(` ⚠️ Async step ${step.name} - running synchronously`);\n }\n // Check if function returned false (failure)\n if (result === false) {\n console.error(` ❌ Failed: Step returned false`);\n return false;\n }\n if (verbose) {\n console.info(' ✅ Done');\n }\n return true;\n } catch (error) {\n console.error(` ❌ Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n return false;\n }\n }\n\n // Otherwise run command\n if (step.command) {\n if (verbose) {\n const shortCmd = step.command.split(' ').slice(0, 4).join(' ');\n console.info(` $ ${shortCmd}...`);\n }\n\n try {\n execSync(step.command, {\n cwd: step.cwd ?? process.cwd(),\n stdio: verbose ? 'inherit' : 'pipe',\n env: { ...process.env, FORCE_COLOR: '1' },\n });\n if (verbose) {\n console.info(' ✅ Done');\n }\n return true;\n } catch (error) {\n console.error(` ❌ Failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n return false;\n }\n }\n\n console.warn(` ⚠️ Step ${step.name} has no command or function`);\n return true;\n}\n\n// ============================================================================\n// Build Steps Configuration\n// ============================================================================\n\n/**\n * Get merged pipeline paths with defaults\n */\nfunction getPipelinePaths(customPaths?: BuildPipelinePaths): Required<BuildPipelinePaths> {\n return {\n ...DEFAULT_PIPELINE_PATHS,\n ...customPaths,\n };\n}\n\n/**\n * Map of step names to human-readable names\n */\nconst STEP_DISPLAY_NAMES: Record<BuildPipelineStep, string> = {\n validate: 'Validate Tokens',\n transform: 'Transform Figma Tokens',\n 'style-dictionary': 'Build Style Dictionary',\n sync: 'Sync tokens-flat.ts',\n 'sass-theme': 'Compile Bootstrap Theme (unminified)',\n 'sass-theme-minified': 'Compile Bootstrap Theme (minified)',\n postprocess: 'Post-process Theme CSS',\n 'sass-utilities': 'Compile DSAi Utilities (unminified)',\n 'sass-utilities-minified': 'Compile DSAi Utilities (minified)',\n bundle: 'Bundle with tsup',\n};\n\n/**\n * Create a single build step from step name\n */\nfunction createStepFromName(\n stepName: BuildPipelineStep,\n tokensPackageDir: string,\n figmaExportsDir: string,\n tokensDir: string,\n paths: Required<BuildPipelinePaths>,\n sdConfigFile: string\n): BuildStep {\n const displayName = STEP_DISPLAY_NAMES[stepName];\n\n switch (stepName) {\n case 'validate':\n // Use dsai CLI for validation - this uses the native TypeScript implementation\n return {\n name: displayName,\n command: 'dsai tokens validate',\n cwd: tokensPackageDir,\n };\n\n case 'transform':\n return {\n name: displayName,\n fn: () => {\n const result = transformTokens({\n sourceDir: figmaExportsDir,\n collectionsDir: tokensDir,\n verbose: true,\n });\n if (!result.success) {\n for (const error of result.errors) {\n console.error(`❌ ${error}`);\n }\n }\n return result.success;\n },\n };\n\n case 'style-dictionary':\n return {\n name: displayName,\n command: `style-dictionary build --config ${sdConfigFile}`,\n cwd: tokensPackageDir,\n };\n\n case 'sync':\n return {\n name: displayName,\n fn: () => syncTokensCLI(tokensPackageDir),\n };\n\n case 'sass-theme':\n return {\n name: displayName,\n command: `sass ${SASS_FLAGS} ${paths.sassThemeInput} ${paths.sassThemeOutput}`,\n cwd: tokensPackageDir,\n };\n\n case 'sass-theme-minified':\n return {\n name: displayName,\n command: `sass ${SASS_FLAGS} ${paths.sassThemeInput} ${paths.sassThemeMinifiedOutput} --style=compressed`,\n cwd: tokensPackageDir,\n };\n\n case 'postprocess':\n return {\n name: displayName,\n fn: () => postprocessCLI(tokensPackageDir),\n };\n\n case 'sass-utilities':\n return {\n name: displayName,\n command: `sass ${SASS_FLAGS_MINIMAL} ${paths.sassUtilitiesInput} ${paths.sassUtilitiesOutput}`,\n cwd: tokensPackageDir,\n };\n\n case 'sass-utilities-minified':\n return {\n name: displayName,\n command: `sass ${SASS_FLAGS_MINIMAL} ${paths.sassUtilitiesInput} ${paths.sassUtilitiesMinifiedOutput} --style=compressed`,\n cwd: tokensPackageDir,\n };\n\n case 'bundle':\n return {\n name: displayName,\n command: 'tsup',\n cwd: tokensPackageDir,\n };\n\n default:\n return {\n name: `Unknown step: ${stepName}`,\n fn: () => {\n console.warn(`⚠️ Unknown pipeline step: ${stepName}`);\n return true;\n },\n };\n }\n}\n\n/**\n * Create build steps based on options and pipeline configuration\n */\nfunction createBuildSteps(\n tokensDir: string,\n _toolsDir: string,\n options: BuildOptions,\n pipeline?: TokensBuildPipeline\n): BuildStep[] {\n const { skipValidate, skipTransform, onlyTheme } = options;\n\n // Get the tokens package root directory\n // tokensDir is typically the collections dir (e.g., packages/@dsai-io/tokens/collections)\n // We need the package root for running commands\n const tokensPackageDir = tokensDir.endsWith('/collections')\n ? dirname(tokensDir)\n : dirname(tokensDir);\n\n // Path to figma-exports source directory (sibling to collections)\n const figmaExportsDir = `${tokensPackageDir}/figma-exports`;\n\n // Get pipeline configuration\n const pipelineSteps = pipeline?.steps ?? DEFAULT_PIPELINE_STEPS;\n const paths = getPipelinePaths(pipeline?.paths);\n const sdConfigFile = pipeline?.styleDictionaryConfig ?? 'sd.config.mjs';\n\n // Build steps based on pipeline configuration\n const steps: BuildStep[] = [];\n\n for (const stepName of pipelineSteps) {\n const step = createStepFromName(\n stepName,\n tokensPackageDir,\n figmaExportsDir,\n tokensDir,\n paths,\n sdConfigFile\n );\n\n // Apply skip flags based on legacy options\n if (stepName === 'validate' && skipValidate) {\n step.skip = true;\n }\n if (stepName === 'transform' && (skipTransform || onlyTheme)) {\n step.skip = true;\n }\n if (onlyTheme && !['sass-theme', 'sass-theme-minified', 'postprocess'].includes(stepName)) {\n // Only run theme-related steps when onlyTheme is true\n if (!['validate'].includes(stepName)) {\n step.skip = true;\n }\n }\n\n steps.push(step);\n }\n\n return steps;\n}\n\n// ============================================================================\n// Main Build Function\n// ============================================================================\n\n/**\n * Run the complete token build pipeline\n *\n * @example\n * ```typescript\n * // Full build\n * const result = buildTokens({\n * tokensDir: './packages/@dsai-io/tokens',\n * toolsDir: './tools/scripts/tokens',\n * });\n *\n * // Skip validation\n * const result = buildTokens({\n * tokensDir: './packages/@dsai-io/tokens',\n * toolsDir: './tools/scripts/tokens',\n * skipValidate: true,\n * });\n *\n * // Only build theme CSS\n * const result = buildTokens({\n * tokensDir: './packages/@dsai-io/tokens',\n * toolsDir: './tools/scripts/tokens',\n * onlyTheme: true,\n * });\n * ```\n */\nexport function buildTokens(\n tokensDir: string,\n toolsDir: string,\n options: BuildOptions = {}\n): BuildResult {\n const { skipValidate, onlyTheme, verbose = true, quiet = false } = options;\n\n const startTime = Date.now();\n const stepsCompleted: string[] = [];\n const stepsFailed: string[] = [];\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Verify directories exist\n try {\n if (!existsSync(tokensDir)) {\n return {\n success: false,\n stepsCompleted,\n stepsFailed: ['Directory Check'],\n duration: Date.now() - startTime,\n errors: [`Tokens directory not found: ${tokensDir}`],\n warnings,\n };\n }\n } catch {\n return {\n success: false,\n stepsCompleted,\n stepsFailed: ['Directory Check'],\n duration: Date.now() - startTime,\n errors: [`Failed to check tokens directory: ${tokensDir}`],\n warnings,\n };\n }\n\n try {\n if (!existsSync(toolsDir)) {\n return {\n success: false,\n stepsCompleted,\n stepsFailed: ['Directory Check'],\n duration: Date.now() - startTime,\n errors: [`Tools directory not found: ${toolsDir}`],\n warnings,\n };\n }\n } catch {\n return {\n success: false,\n stepsCompleted,\n stepsFailed: ['Directory Check'],\n duration: Date.now() - startTime,\n errors: [`Failed to check tools directory: ${toolsDir}`],\n warnings,\n };\n }\n\n // Print header\n if (verbose && !quiet) {\n console.info('╔════════════════════════════════════════════════════════════╗');\n console.info('║ DSAi Tokens - Complete Build ║');\n console.info('╚════════════════════════════════════════════════════════════╝');\n\n if (skipValidate) {\n console.info('⚠️ Skipping validation (--skip-validate)');\n }\n if (onlyTheme) {\n console.info('⚠️ Building only theme CSS (--only-theme)');\n }\n }\n\n // Create and run build steps\n const steps = createBuildSteps(tokensDir, toolsDir, options, options.pipeline);\n\n for (const step of steps) {\n const stepIndex = steps.indexOf(step);\n const success = runStep(step, stepIndex, steps.length, verbose && !quiet);\n\n if (success) {\n if (!step.skip) {\n stepsCompleted.push(step.name);\n }\n } else {\n stepsFailed.push(step.name);\n errors.push(`Build failed at step: ${step.name}`);\n\n // Stop on first failure\n const failDuration = Date.now() - startTime;\n\n if (verbose && !quiet) {\n console.error(`\\n💥 Build failed at step: ${step.name}`);\n }\n\n return {\n success: false,\n stepsCompleted,\n stepsFailed,\n duration: failDuration,\n errors,\n warnings,\n };\n }\n }\n\n const duration = Date.now() - startTime;\n const durationSec = (duration / 1000).toFixed(2);\n\n // Print footer\n if (verbose && !quiet) {\n console.info('\\n╔════════════════════════════════════════════════════════════╗');\n console.info('║ ✅ Build Complete ║');\n console.info(\n `║ 📊 ${stepsCompleted.length} steps passed in ${durationSec}s ║`\n );\n console.info('╚════════════════════════════════════════════════════════════╝');\n }\n\n return {\n success: true,\n stepsCompleted,\n stepsFailed,\n duration,\n errors,\n warnings,\n };\n}\n\n/**\n * CLI entry point for token build\n */\nexport function buildTokensCLI(tokensDir: string, toolsDir: string, args: string[] = []): boolean {\n const skipValidate = args.includes('--skip-validate');\n const skipTransform = args.includes('--skip-transform');\n const onlyTheme = args.includes('--only-theme');\n const quiet = args.includes('--quiet') || args.includes('-q');\n\n const result = buildTokens(tokensDir, toolsDir, {\n skipValidate,\n skipTransform,\n onlyTheme,\n verbose: !quiet,\n quiet,\n });\n\n return result.success;\n}\n\n/**\n * Parse CLI arguments and run build\n * Used as the main entry point when called directly\n */\nexport function runBuildCLI(tokensDir: string, toolsDir: string): void {\n const args = process.argv.slice(2);\n const success = buildTokensCLI(tokensDir, toolsDir, args);\n process.exit(success ? 0 : 1);\n}\n","/**\n * @file Token Clean Module\n * @description Provides functionality to clean token output directories before builds.\n *\n * This module supports:\n * - Cleaning individual output directories (dist/css, dist/js, etc.)\n * - Cleaning all build outputs\n * - Dry-run mode to preview what would be deleted\n * - Safe deletion with directory validation\n *\n * @module @dsai-io/tools/tokens/clean\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n/* eslint-disable security/detect-non-literal-regexp */\n\nimport { existsSync, readdirSync, rmSync } from 'node:fs';\nimport { basename, join, resolve } from 'node:path';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Clean operation options\n */\nexport interface CleanOptions {\n /**\n * Base directory for cleaning (typically the package root)\n * @default process.cwd()\n */\n baseDir?: string;\n\n /**\n * Directories to clean relative to baseDir\n * @default ['dist']\n */\n directories?: string[];\n\n /**\n * Show what would be deleted without actually deleting\n * @default false\n */\n dryRun?: boolean;\n\n /**\n * Enable verbose logging\n * @default false\n */\n verbose?: boolean;\n\n /**\n * File patterns to preserve (glob patterns)\n * Files matching these patterns will not be deleted\n * @example ['.gitkeep', 'README.md']\n */\n preserve?: string[];\n}\n\n/**\n * Information about a cleaned directory\n */\nexport interface CleanedDirectory {\n /** Path to the cleaned directory */\n path: string;\n\n /** Number of files removed */\n filesRemoved: number;\n\n /** Number of directories removed */\n directoriesRemoved: number;\n\n /** Whether the directory existed before cleaning */\n existed: boolean;\n}\n\n/**\n * Result of a clean operation\n */\nexport interface CleanResult {\n /** Whether the clean operation completed successfully */\n success: boolean;\n\n /** List of cleaned directories with details */\n cleaned: CleanedDirectory[];\n\n /** Total number of files removed */\n totalFilesRemoved: number;\n\n /** Total number of directories removed */\n totalDirectoriesRemoved: number;\n\n /** Any errors encountered */\n errors: string[];\n\n /** Any warnings (non-blocking issues) */\n warnings: string[];\n\n /** Whether this was a dry run */\n dryRun: boolean;\n\n /** Duration of the operation in milliseconds */\n duration: number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default directories to clean for token builds\n */\nexport const DEFAULT_CLEAN_DIRECTORIES = ['dist'] as const;\n\n/**\n * Files to always preserve\n */\nconst ALWAYS_PRESERVE = ['.gitkeep', '.gitignore'] as const;\n\n/**\n * Directories that should never be cleaned (safety check)\n */\nconst PROTECTED_DIRECTORIES = [\n 'src',\n 'node_modules',\n '.git',\n '.github',\n 'test',\n 'tests',\n '__tests__',\n 'docs',\n 'config',\n] as const;\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate that a directory is safe to clean\n *\n * @param dirPath - Absolute path to the directory\n * @param baseDir - Base directory for relative validation\n * @returns Validation result with error message if invalid\n */\nfunction validateCleanTarget(dirPath: string, baseDir: string): { valid: boolean; error?: string } {\n // Ensure path is within baseDir (prevent directory traversal)\n const resolvedDir = resolve(dirPath);\n const resolvedBase = resolve(baseDir);\n\n if (!resolvedDir.startsWith(resolvedBase)) {\n return {\n valid: false,\n error: `Directory \"${dirPath}\" is outside base directory \"${baseDir}\"`,\n };\n }\n\n // Check for protected directories\n const dirName = basename(resolvedDir);\n if (PROTECTED_DIRECTORIES.includes(dirName as (typeof PROTECTED_DIRECTORIES)[number])) {\n return {\n valid: false,\n error: `Directory \"${dirName}\" is protected and cannot be cleaned`,\n };\n }\n\n // Don't allow cleaning the base directory itself\n if (resolvedDir === resolvedBase) {\n return {\n valid: false,\n error: 'Cannot clean the base directory itself',\n };\n }\n\n return { valid: true };\n}\n\n/**\n * Escape special regex characters in a string\n * @param str - String to escape\n * @returns Escaped string safe for regex\n */\nfunction escapeRegexChars(str: string): string {\n // Escape all regex special chars except * and ? which we handle separately\n return str.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Convert a simple glob pattern to a safe regex pattern\n * Only supports * (any chars) and ? (single char) wildcards\n *\n * @param pattern - Glob pattern like \"*.json\" or \"file?.txt\"\n * @returns Safe regex pattern string\n */\nfunction globToSafePattern(pattern: string): string {\n // First escape any regex special characters (except our wildcards)\n const escaped = escapeRegexChars(pattern);\n // Then convert our wildcards to regex equivalents\n // Use non-greedy matching to prevent catastrophic backtracking\n return escaped.replace(/\\*/g, '.*?').replace(/\\?/g, '.');\n}\n\n/**\n * Match a filename against a glob pattern safely\n * Uses character-by-character matching for simple patterns to avoid ReDoS\n *\n * @param fileName - Name of the file to match\n * @param pattern - Glob pattern (supports * and ? wildcards)\n * @returns Whether the filename matches the pattern\n */\nfunction matchGlobPattern(fileName: string, pattern: string): boolean {\n // For patterns without wildcards, use exact match\n if (!pattern.includes('*') && !pattern.includes('?')) {\n return fileName === pattern;\n }\n\n // For simple extension patterns like \"*.json\", use endsWith for safety\n if (pattern.startsWith('*.') && !pattern.slice(2).includes('*') && !pattern.includes('?')) {\n const extension = pattern.slice(1); // \".json\"\n return fileName.endsWith(extension);\n }\n\n // For simple prefix patterns like \"file*\", use startsWith for safety\n if (pattern.endsWith('*') && !pattern.slice(0, -1).includes('*') && !pattern.includes('?')) {\n const prefix = pattern.slice(0, -1);\n return fileName.startsWith(prefix);\n }\n\n // For more complex patterns, use a safe regex with non-greedy matching\n // nosemgrep: javascript.lang.security.audit.detect-non-literal-regexp.detect-non-literal-regexp\n const safePattern = globToSafePattern(pattern);\n const regex = new RegExp(`^${safePattern}$`);\n return regex.test(fileName);\n}\n\n/**\n * Check if a file should be preserved\n *\n * @param fileName - Name of the file\n * @param preservePatterns - Additional patterns to preserve\n * @returns Whether the file should be preserved\n */\nfunction shouldPreserve(fileName: string, preservePatterns: string[]): boolean {\n const allPatterns = [...ALWAYS_PRESERVE, ...preservePatterns];\n return allPatterns.some((pattern) => matchGlobPattern(fileName, pattern));\n}\n\n// ============================================================================\n// Directory Cleaning\n// ============================================================================\n\n/**\n * Count files and directories in a path recursively\n *\n * @param dirPath - Path to count\n * @returns Object with file and directory counts\n */\nfunction countContents(dirPath: string): { files: number; dirs: number } {\n if (!existsSync(dirPath)) {\n return { files: 0, dirs: 0 };\n }\n\n let files = 0;\n let dirs = 0;\n\n const entries = readdirSync(dirPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n dirs++;\n const subCounts = countContents(join(dirPath, entry.name));\n files += subCounts.files;\n dirs += subCounts.dirs;\n } else {\n files++;\n }\n }\n\n return { files, dirs };\n}\n\n/**\n * Clean a single directory\n *\n * @param dirPath - Absolute path to the directory to clean\n * @param options - Clean options\n * @returns Cleaned directory info\n */\nfunction cleanDirectory(\n dirPath: string,\n options: Required<Pick<CleanOptions, 'dryRun' | 'verbose' | 'preserve'>>\n): CleanedDirectory {\n const existed = existsSync(dirPath);\n\n if (!existed) {\n if (options.verbose) {\n console.info(` ℹ️ Directory does not exist: ${dirPath}`);\n }\n return {\n path: dirPath,\n filesRemoved: 0,\n directoriesRemoved: 0,\n existed: false,\n };\n }\n\n // Count contents before deletion\n const counts = countContents(dirPath);\n\n if (options.dryRun) {\n if (options.verbose) {\n console.info(\n ` 🔍 Would remove: ${dirPath} (${counts.files} files, ${counts.dirs} directories)`\n );\n }\n return {\n path: dirPath,\n filesRemoved: counts.files,\n directoriesRemoved: counts.dirs,\n existed: true,\n };\n }\n\n // Check for files to preserve\n const entries = readdirSync(dirPath, { withFileTypes: true });\n const toPreserve = entries.filter((e) => shouldPreserve(e.name, options.preserve));\n\n if (toPreserve.length > 0) {\n // Delete contents except preserved files\n for (const entry of entries) {\n if (shouldPreserve(entry.name, options.preserve)) {\n if (options.verbose) {\n console.info(` 📌 Preserving: ${entry.name}`);\n }\n continue;\n }\n\n const entryPath = join(dirPath, entry.name);\n rmSync(entryPath, { recursive: true, force: true });\n }\n } else {\n // Delete entire directory\n rmSync(dirPath, { recursive: true, force: true });\n }\n\n if (options.verbose) {\n console.info(` ✅ Cleaned: ${dirPath} (${counts.files} files, ${counts.dirs} directories)`);\n }\n\n return {\n path: dirPath,\n filesRemoved: counts.files,\n directoriesRemoved: counts.dirs,\n existed: true,\n };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Clean token output directories\n *\n * Removes build artifacts from output directories to ensure a fresh build.\n * Supports dry-run mode, preserve patterns, and safety validation.\n *\n * @param options - Clean operation options\n * @returns Clean operation result\n *\n * @example\n * // Clean default dist directory\n * const result = cleanTokenOutputs();\n *\n * @example\n * // Clean specific directories with dry-run\n * const result = cleanTokenOutputs({\n * directories: ['dist/css', 'dist/js'],\n * dryRun: true,\n * verbose: true,\n * });\n *\n * @example\n * // Clean with preserved files\n * const result = cleanTokenOutputs({\n * preserve: ['README.md', '*.d.ts'],\n * });\n */\nexport function cleanTokenOutputs(options: CleanOptions = {}): CleanResult {\n const startTime = Date.now();\n\n // Normalize options with defaults\n const normalizedOptions = {\n baseDir: options.baseDir ?? process.cwd(),\n directories: options.directories ?? [...DEFAULT_CLEAN_DIRECTORIES],\n dryRun: options.dryRun ?? false,\n verbose: options.verbose ?? false,\n preserve: options.preserve ?? [],\n };\n\n const result: CleanResult = {\n success: true,\n cleaned: [],\n totalFilesRemoved: 0,\n totalDirectoriesRemoved: 0,\n errors: [],\n warnings: [],\n dryRun: normalizedOptions.dryRun,\n duration: 0,\n };\n\n if (normalizedOptions.verbose) {\n const modeStr = normalizedOptions.dryRun ? '(dry-run)' : '';\n console.info(`\\n🧹 Cleaning token outputs ${modeStr}`);\n console.info(` Base: ${normalizedOptions.baseDir}`);\n }\n\n // Validate and clean each directory\n for (const dir of normalizedOptions.directories) {\n const absolutePath = resolve(normalizedOptions.baseDir, dir);\n\n // Validate target\n const validation = validateCleanTarget(absolutePath, normalizedOptions.baseDir);\n if (!validation.valid && validation.error) {\n result.errors.push(validation.error);\n result.success = false;\n continue;\n }\n\n // Clean directory\n try {\n const cleaned = cleanDirectory(absolutePath, {\n dryRun: normalizedOptions.dryRun,\n verbose: normalizedOptions.verbose,\n preserve: normalizedOptions.preserve,\n });\n\n result.cleaned.push(cleaned);\n result.totalFilesRemoved += cleaned.filesRemoved;\n result.totalDirectoriesRemoved += cleaned.directoriesRemoved;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n result.errors.push(`Failed to clean \"${dir}\": ${errorMessage}`);\n result.success = false;\n }\n }\n\n result.duration = Date.now() - startTime;\n\n if (normalizedOptions.verbose) {\n console.info('');\n if (result.success) {\n const actionStr = normalizedOptions.dryRun ? 'Would remove' : 'Removed';\n console.info(\n `✅ ${actionStr} ${result.totalFilesRemoved} files, ` +\n `${result.totalDirectoriesRemoved} directories in ${result.duration}ms`\n );\n } else {\n console.error('❌ Clean failed with errors:');\n for (const error of result.errors) {\n console.error(` - ${error}`);\n }\n }\n }\n\n return result;\n}\n\n/**\n * CLI wrapper for cleanTokenOutputs\n *\n * Provides formatted output suitable for CLI usage.\n *\n * @param baseDir - Base directory for the clean operation\n * @param options - Clean options\n * @returns Whether the clean was successful\n */\nexport function cleanTokensCLI(\n baseDir: string,\n options: Omit<CleanOptions, 'baseDir'> = {}\n): boolean {\n const result = cleanTokenOutputs({\n ...options,\n baseDir,\n verbose: options.verbose ?? true,\n });\n\n return result.success;\n}\n","/**\n * @file Token Collections Merge Module\n * @description Merge multiple Figma Tokens Studio collection files into one unified collection\n *\n * Features:\n * - Intelligently merges nested token structures\n * - Preserves all metadata ($codeSyntax, $scopes, $type, etc.)\n * - Maintains token references and aliases\n * - Handles mode-based tokens (Light Mode, Dark Mode)\n * - Deep merges sections without overwriting\n * - Normalizes reference format to lowercase {colors.path}\n * - Adds $libraryName and $collectionName to aliased tokens\n * - Sorts properties alphabetically for consistency\n * - Removes duplicate sections (like \"hue\" that duplicates \"brand\")\n *\n * @module @dsai-io/tools/tokens/merge\n */\n\n/* eslint-disable no-console */\n/* eslint-disable security/detect-non-literal-fs-filename */\n/* eslint-disable security/detect-object-injection */\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport type { MergeOptions, MergeResult } from './types';\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype TokenValue = string | number | boolean | null | TokenObject | TokenValue[];\n\ninterface TokenObject {\n [key: string]: TokenValue;\n}\n\ntype CollectionData = TokenObject[];\n\n// ============================================================================\n// Token Detection\n// ============================================================================\n\n/**\n * Check if an object is a token (has $type or $value)\n */\nfunction isToken(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n const record = obj as Record<string, unknown>;\n return '$type' in record || '$value' in record;\n}\n\n/**\n * Check if an object has child tokens\n */\nfunction hasChildTokens(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n const record = obj as Record<string, unknown>;\n for (const key of Object.keys(record)) {\n if (!key.startsWith('$') && typeof record[key] === 'object') {\n return true;\n }\n }\n return false;\n}\n\n// ============================================================================\n// Deep Merge\n// ============================================================================\n\n/**\n * Deep merge two objects, preserving all properties\n * Special handling: If target has child tokens and source is a token,\n * or vice versa, prioritize the structure with children\n */\nfunction deepMerge(\n target: TokenObject | undefined,\n source: TokenObject,\n verbose = false\n): TokenObject {\n const result: TokenObject = target ? { ...target } : {};\n\n // Check for conflict: one is a token, the other has child tokens\n const targetIsToken = isToken(target);\n const sourceIsToken = isToken(source);\n const targetHasChildren = hasChildTokens(target);\n const sourceHasChildren = hasChildTokens(source);\n\n if (targetHasChildren && sourceIsToken) {\n if (verbose) {\n console.info(' ⚠️ Skipping single token in favor of children structure');\n }\n return result;\n }\n\n if (sourceHasChildren && targetIsToken) {\n if (verbose) {\n console.info(' ⚠️ Replacing single token with children structure');\n }\n return { ...source };\n }\n\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = result[key];\n\n if (sourceValue && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\n // Recursively merge nested objects\n result[key] = deepMerge(\n targetValue as TokenObject | undefined,\n sourceValue as TokenObject,\n verbose\n );\n } else if (Array.isArray(sourceValue)) {\n // Concatenate arrays\n const existingArray = Array.isArray(targetValue) ? targetValue : [];\n result[key] = [...existingArray, ...sourceValue];\n } else if (sourceValue !== undefined) {\n // Overwrite primitive values (source takes precedence)\n result[key] = sourceValue;\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Token Counting\n// ============================================================================\n\n/**\n * Count tokens recursively in a nested structure\n */\nfunction countTokens(obj: unknown): number {\n if (!obj || typeof obj !== 'object') {\n return 0;\n }\n\n let count = 0;\n const record = obj as Record<string, unknown>;\n\n for (const key of Object.keys(record)) {\n const value = record[key];\n\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const valueRecord = value as Record<string, unknown>;\n // Check if this is a token\n if ('$type' in valueRecord || '$value' in valueRecord) {\n count++;\n } else {\n // Recursively count nested tokens\n count += countTokens(value);\n }\n }\n }\n\n return count;\n}\n\n// ============================================================================\n// Reference Normalization\n// ============================================================================\n\n/**\n * Update token references to match new collection name\n * Normalizes to lowercase format: {colors.path} instead of {Colors.path}\n */\nfunction updateReferences(\n obj: TokenObject,\n oldName: string,\n newName: string,\n collectionName: string\n): void {\n const normalizedOld = oldName.toLowerCase().replace(/\\s+/g, '');\n const normalizedNew = newName.toLowerCase().replace(/\\s+/g, '');\n\n // Build patterns to match (case-insensitive)\n const patternsLower = [`{${oldName.toLowerCase()}.`, `{${normalizedOld}.`];\n\n for (const key of Object.keys(obj)) {\n const value = obj[key];\n\n if (typeof value === 'string' && value.startsWith('{') && value.endsWith('}')) {\n // This is a token reference - normalize to lowercase\n let newValue = value;\n const valueLower = value.toLowerCase();\n\n for (const pattern of patternsLower) {\n if (valueLower.startsWith(pattern)) {\n // Replace the prefix with the normalized version\n const suffix = value.slice(pattern.length);\n newValue = `{${normalizedNew}.${suffix}`;\n break;\n }\n }\n obj[key] = newValue;\n\n // Add metadata for aliased tokens\n if ((obj[key] as string).startsWith('{')) {\n if (!('$libraryName' in obj)) {\n obj['$libraryName'] = '';\n }\n if (!('$collectionName' in obj)) {\n obj['$collectionName'] = collectionName;\n }\n }\n } else if (value && typeof value === 'object' && !Array.isArray(value)) {\n updateReferences(value as TokenObject, oldName, newName, collectionName);\n }\n }\n}\n\n// ============================================================================\n// Property Sorting\n// ============================================================================\n\n/**\n * Sort object properties alphabetically, with $ properties first\n */\nfunction sortProperties(obj: unknown): unknown {\n if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {\n return obj;\n }\n\n const record = obj as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n const keys = Object.keys(record).sort((a, b) => {\n // $ properties first, then alphabetically\n const aIsMeta = a.startsWith('$');\n const bIsMeta = b.startsWith('$');\n if (aIsMeta && !bIsMeta) {\n return -1;\n }\n if (!aIsMeta && bIsMeta) {\n return 1;\n }\n return a.localeCompare(b);\n });\n\n for (const key of keys) {\n sorted[key] = sortProperties(record[key]);\n }\n\n return sorted;\n}\n\n// ============================================================================\n// Duplicate Detection\n// ============================================================================\n\n/**\n * Check if a section is a duplicate/alias section\n * (e.g., \"hue\" that just references \"brand\")\n */\nfunction isDuplicateSection(obj: unknown): boolean {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n let hasOnlyReferences = true;\n let referenceCount = 0;\n\n function checkReferences(item: Record<string, unknown>): void {\n for (const key of Object.keys(item)) {\n if (key.startsWith('$')) {\n continue;\n }\n\n const value = item[key];\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const valueRecord = value as Record<string, unknown>;\n if ('$value' in valueRecord) {\n referenceCount++;\n if (\n typeof valueRecord['$value'] === 'string' &&\n (valueRecord['$value'] as string).startsWith('{')\n ) {\n continue;\n } else {\n hasOnlyReferences = false;\n return;\n }\n }\n checkReferences(valueRecord);\n }\n }\n }\n\n checkReferences(obj as Record<string, unknown>);\n return hasOnlyReferences && referenceCount > 10;\n}\n\n/**\n * Get collection name from file structure\n */\nfunction getCollectionName(data: CollectionData): string | null {\n if (Array.isArray(data) && data[0]) {\n const keys = Object.keys(data[0]);\n return keys[0] ?? null;\n }\n return null;\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Load and parse JSON file\n */\nfunction loadJSON(filePath: string, verbose: boolean): CollectionData | null {\n try {\n const fullPath = resolve(filePath);\n if (verbose) {\n console.info(`📖 Reading: ${fullPath}`);\n }\n const content = readFileSync(fullPath, 'utf-8');\n return JSON.parse(content) as CollectionData;\n } catch {\n return null;\n }\n}\n\n/**\n * Save JSON to file with pretty formatting\n */\nfunction saveJSON(filePath: string, data: unknown, verbose: boolean): boolean {\n try {\n const fullPath = resolve(filePath);\n const content = JSON.stringify(data, null, 2);\n writeFileSync(fullPath, content, 'utf-8');\n if (verbose) {\n console.info(`✅ Saved: ${fullPath}`);\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Merge multiple collection files into one\n *\n * @example\n * ```typescript\n * const result = mergeCollections({\n * sourceFiles: ['colors-scales.json', 'colors.json'],\n * outputFile: 'merged-colors.json',\n * });\n * ```\n */\nexport function mergeCollections(options: MergeOptions): MergeResult {\n const { sourceFiles, outputFile, strategy = 'last', dryRun = false, verbose = false } = options;\n\n const errors: string[] = [];\n const conflicts: string[] = [];\n\n if (sourceFiles.length < 2) {\n return {\n success: false,\n collectionsCount: 0,\n tokensCount: 0,\n outputFile,\n errors: ['At least two source files are required'],\n };\n }\n\n // Validate files exist\n for (const file of sourceFiles) {\n if (!existsSync(file)) {\n errors.push(`Source file not found: ${file}`);\n }\n }\n\n if (errors.length > 0) {\n return {\n success: false,\n collectionsCount: 0,\n tokensCount: 0,\n outputFile,\n errors,\n };\n }\n\n if (verbose) {\n console.info('🔄 Starting merge process...\\n');\n }\n\n // Load all source files\n const collections: { name: string | null; data: TokenObject; tokenCount: number }[] = [];\n\n for (const file of sourceFiles) {\n const data = loadJSON(file, verbose);\n if (!data || !Array.isArray(data) || !data[0]) {\n errors.push(`Invalid collection structure in: ${file}`);\n continue;\n }\n\n const name = getCollectionName(data);\n const collectionData = name\n ? (data[0][name] as TokenObject)\n : (data[0] as unknown as TokenObject);\n const tokenCount = countTokens(collectionData);\n\n if (verbose) {\n console.info(`📦 Collection: \"${name ?? 'unknown'}\" (${tokenCount} tokens)`);\n }\n\n collections.push({ name, data: collectionData, tokenCount });\n }\n\n if (collections.length < 2) {\n return {\n success: false,\n collectionsCount: collections.length,\n tokensCount: 0,\n outputFile,\n errors: errors.length > 0 ? errors : ['Not enough valid collections to merge'],\n };\n }\n\n // Determine unified collection name\n const collectionNames = collections.map((c) => c.name).filter((n): n is string => n !== null);\n const defaultName = collectionNames[0] ?? 'Tokens';\n const unifiedName = collectionNames.includes('Colors')\n ? 'Colors'\n : collectionNames.reduce((a, b) => (a.length <= b.length ? a : b), defaultName);\n\n if (verbose) {\n console.info(`\\n🎯 Unified collection name: \"${unifiedName}\"`);\n console.info('\\n🔀 Merging structures...');\n }\n\n // Merge collections based on strategy\n const firstCollection = collections[0];\n if (!firstCollection) {\n return {\n success: false,\n collectionsCount: 0,\n tokensCount: 0,\n outputFile,\n errors: ['No collections to merge'],\n };\n }\n\n let merged: TokenObject = firstCollection.data;\n for (let i = 1; i < collections.length; i++) {\n const source = collections[i];\n if (!source) {\n continue;\n }\n if (strategy === 'first') {\n // First wins - merge source into target but target takes precedence\n merged = deepMerge(source.data, merged, verbose);\n } else {\n // Last wins (default) - source overwrites target\n merged = deepMerge(merged, source.data, verbose);\n }\n }\n\n // Remove duplicate sections\n if (verbose) {\n console.info('🗑️ Checking for duplicate sections...');\n }\n const modes = merged['modes'] as TokenObject | undefined;\n if (modes) {\n for (const modeName of Object.keys(modes)) {\n const mode = modes[modeName] as TokenObject | undefined;\n const colors = mode?.['colors'] as TokenObject | undefined;\n\n if (colors) {\n for (const sectionName of Object.keys(colors)) {\n if (isDuplicateSection(colors[sectionName])) {\n if (verbose) {\n console.info(` ⚠️ Removing duplicate section: ${sectionName}`);\n }\n delete colors[sectionName];\n }\n }\n }\n }\n }\n\n // Normalize references\n if (verbose) {\n const normalized = unifiedName.toLowerCase().replace(/\\s+/g, '');\n console.info(`🔗 Normalizing references to lowercase \"{${normalized}.\" format...`);\n }\n for (const coll of collections) {\n if (coll.name) {\n updateReferences(merged, coll.name, unifiedName, unifiedName);\n }\n }\n\n // Sort properties\n if (verbose) {\n console.info('📋 Sorting properties alphabetically...');\n }\n const sorted = sortProperties(merged) as TokenObject;\n\n // Count final tokens\n const tokensCount = countTokens(sorted);\n\n if (verbose) {\n console.info(`✨ Merged collection: ${tokensCount} tokens\\n`);\n }\n\n // Create output structure\n const output = [{ [unifiedName]: sorted }];\n\n // Save if not dry run\n if (!dryRun) {\n if (!saveJSON(outputFile, output, verbose)) {\n errors.push(`Failed to write output file: ${outputFile}`);\n return {\n success: false,\n collectionsCount: collections.length,\n tokensCount,\n outputFile,\n errors,\n conflicts: conflicts.length > 0 ? conflicts : undefined,\n };\n }\n }\n\n if (verbose) {\n console.info('\\n✅ Merge complete!');\n console.info('📊 Summary:');\n for (const coll of collections) {\n console.info(` Source: ${coll.tokenCount} tokens`);\n }\n console.info(` Merged: ${tokensCount} tokens`);\n }\n\n return {\n success: true,\n collectionsCount: collections.length,\n tokensCount,\n outputFile,\n conflicts: conflicts.length > 0 ? conflicts : undefined,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n/**\n * CLI entry point for merging collections\n */\nexport function mergeCollectionsCLI(source1: string, source2: string, output: string): boolean {\n const result = mergeCollections({\n sourceFiles: [source1, source2],\n outputFile: output,\n verbose: true,\n });\n\n if (result.errors) {\n for (const error of result.errors) {\n console.error(`❌ ${error}`);\n }\n }\n\n return result.success;\n}\n","/**\n * Scanner for finding stylesheet files in directories\n *\n * @packageDocumentation\n */\n\n/* eslint-disable security/detect-non-literal-regexp */\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { StyleScannerOptions, StyleScannerResult, StyleScannedFile } from './types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default ignore patterns\n */\nconst DEFAULT_IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/.git/**',\n '**/_index.scss',\n '**/*.test.scss',\n '**/*.spec.scss',\n '**/test/**',\n '**/tests/**',\n];\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Convert a glob pattern to a regular expression\n */\nfunction globToRegex(pattern: string): RegExp {\n const regex = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special regex chars (except * and ?)\n .replace(/\\*\\*/g, '<<<GLOBSTAR>>>') // Temporarily replace **\n .replace(/\\*/g, '[^/]*') // * matches anything except /\n .replace(/\\?/g, '.') // ? matches single char\n .replace(/<<<GLOBSTAR>>>/g, '.*'); // ** matches anything including /\n return new RegExp(`^${regex}$`);\n}\n\n/**\n * Check if a path matches any of the ignore patterns\n */\nfunction matchesIgnorePattern(relativePath: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n const regex = globToRegex(pattern);\n if (regex.test(relativePath)) {\n return true;\n }\n // Also check just the filename\n const fileName = path.basename(relativePath);\n if (regex.test(fileName)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Recursively scan a directory for files\n */\nasync function scanDirectory(\n dir: string,\n rootDir: string,\n extension: string,\n ignorePatterns: string[],\n maxDepth: number,\n currentDepth: number,\n followSymlinks: boolean\n): Promise<StyleScannedFile[]> {\n const files: StyleScannedFile[] = [];\n\n if (currentDepth > maxDepth) {\n return files;\n }\n\n try {\n const entries = await fs.promises.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n const relativePath = path.relative(rootDir, entryPath);\n\n // Check ignore patterns\n if (matchesIgnorePattern(relativePath, ignorePatterns)) {\n continue;\n }\n\n if (entry.isDirectory() || (followSymlinks && entry.isSymbolicLink())) {\n // Recurse into directory\n const subFiles = await scanDirectory(\n entryPath,\n rootDir,\n extension,\n ignorePatterns,\n maxDepth,\n currentDepth + 1,\n followSymlinks\n );\n files.push(...subFiles);\n } else if (entry.isFile() && entry.name.endsWith(`.${extension}`)) {\n // Add file\n const stat = await fs.promises.stat(entryPath);\n files.push({\n absolutePath: entryPath,\n relativePath,\n name: path.basename(entry.name, `.${extension}`),\n extension: extension as 'scss' | 'css',\n size: stat.size,\n mtime: stat.mtime,\n depth: currentDepth,\n });\n }\n }\n } catch (error) {\n // Directory read error - skip silently\n console.warn(`Warning: Could not read directory ${dir}: ${(error as Error).message}`);\n }\n\n return files;\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Scan directories for stylesheet files\n *\n * @param options Scanner options\n * @returns Scanner result with found files\n *\n * @example\n * ```typescript\n * const result = await scanDirectories({\n * directories: ['src/styles/overrides', 'src/styles/custom'],\n * extension: 'scss',\n * });\n *\n * console.log(`Found ${result.totalFiles} files`);\n * ```\n */\nexport async function scanDirectories(options: StyleScannerOptions): Promise<StyleScannerResult> {\n const {\n directories,\n extension,\n ignorePatterns = DEFAULT_IGNORE_PATTERNS,\n followSymlinks = false,\n maxDepth = 10,\n } = options;\n\n const files: StyleScannedFile[] = [];\n const scannedDirs: string[] = [];\n const missingDirs: string[] = [];\n\n for (const dir of directories) {\n const absoluteDir = path.resolve(dir);\n\n // Check if directory exists\n try {\n const stat = await fs.promises.stat(absoluteDir);\n if (!stat.isDirectory()) {\n missingDirs.push(absoluteDir);\n continue;\n }\n } catch {\n missingDirs.push(absoluteDir);\n continue;\n }\n\n scannedDirs.push(absoluteDir);\n\n // Scan directory recursively\n const foundFiles = await scanDirectory(\n absoluteDir,\n absoluteDir,\n extension,\n ignorePatterns,\n maxDepth,\n 0,\n followSymlinks\n );\n\n files.push(...foundFiles);\n }\n\n // Calculate totals\n const totalSize = files.reduce((sum, file) => sum + file.size, 0);\n\n return {\n files,\n directories: scannedDirs,\n missingDirectories: missingDirs,\n totalFiles: files.length,\n totalSize,\n };\n}\n\n/**\n * Sort scanned files according to specified order\n *\n * @param files Files to sort\n * @param order Sort order\n * @returns Sorted files\n */\nexport function sortFiles(\n files: StyleScannedFile[],\n order: 'alphabetical' | 'directory-first' = 'alphabetical'\n): StyleScannedFile[] {\n const sorted = [...files];\n\n if (order === 'alphabetical') {\n sorted.sort((a, b) => a.name.localeCompare(b.name));\n } else if (order === 'directory-first') {\n sorted.sort((a, b) => {\n // First by directory\n const dirA = path.dirname(a.relativePath);\n const dirB = path.dirname(b.relativePath);\n if (dirA !== dirB) {\n return dirA.localeCompare(dirB);\n }\n // Then by name\n return a.name.localeCompare(b.name);\n });\n }\n\n return sorted;\n}\n\n/**\n * Filter files matching patterns\n *\n * @param files Files to filter\n * @param patterns Glob patterns to match\n * @param include If true, keep matching files; if false, exclude matching\n * @returns Filtered files\n */\nexport function filterFiles(\n files: StyleScannedFile[],\n patterns: string[],\n include = false\n): StyleScannedFile[] {\n return files.filter((file) => {\n const matches = matchesIgnorePattern(file.relativePath, patterns);\n return include ? matches : !matches;\n });\n}\n\n/**\n * Get default ignore patterns\n */\nexport function getDefaultIgnorePatterns(): string[] {\n return [...DEFAULT_IGNORE_PATTERNS];\n}\n","/**\n * Merge stylesheet content\n *\n * @packageDocumentation\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { MergeConfig, MergeContent, StyleMergeResult } from './types.js';\n\n// ============================================================================\n// Content Generation\n// ============================================================================\n\n/**\n * Generate header comment for merged file\n */\nfunction generateHeaderComment(_format: 'scss' | 'css'): string {\n const timestamp = new Date().toISOString();\n const comment = `/**\n * DSAi Design Tokens - Merged Bundle\n * Generated: ${timestamp}\n *\n * This file was automatically generated and includes:\n * - Generated design tokens\n * - Merged additional stylesheets\n *\n * DO NOT EDIT DIRECTLY - changes will be overwritten on rebuild\n */`;\n\n return comment;\n}\n\n/**\n * Generate source comment for section\n */\nfunction generateSourceComment(source: string, _format: 'scss' | 'css'): string {\n return `/* ========== Source: ${source} ========== */`;\n}\n\n// ============================================================================\n// Issue Detection\n// ============================================================================\n\n/**\n * Detect potential issues in merged content\n */\nfunction detectMergeIssues(content: string, format: 'scss' | 'css'): string[] {\n const warnings: string[] = [];\n\n // Check for duplicate :root selectors\n const rootMatches = content.match(/:root\\s*\\{/g);\n const rootCount = rootMatches ? rootMatches.length : 0;\n if (rootCount > 1) {\n warnings.push(\n `Found ${rootCount} :root selectors. Consider consolidating for better performance.`\n );\n }\n\n // Check for duplicate CSS custom properties (simplified check)\n const customProps = content.match(/--[\\w-]+:/g) ?? [];\n const uniqueProps = new Set(customProps);\n if (customProps.length > uniqueProps.size) {\n warnings.push(\n `Found duplicate CSS custom properties. Later definitions will override earlier ones.`\n );\n }\n\n // SCSS-specific checks\n if (format === 'scss') {\n // Check for @import after content\n const importAfterContent = /@import\\s+['\"][^'\"]+['\"];?\\s*$/gm;\n if (importAfterContent.test(content)) {\n warnings.push(`Found @import statements that may not be at the top of the file.`);\n }\n }\n\n return warnings;\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Merge stylesheet content in specified order\n *\n * @param tokenContent Generated token content\n * @param userContent User stylesheet content\n * @param config Merge configuration\n * @returns Merged result\n *\n * @example\n * ```typescript\n * const result = await mergeContent(\n * { content: ':root { --color-primary: blue; }', format: 'css' },\n * [{ source: 'overrides.css', content: ':root { --color-bg: white; }' }],\n * { mergeOrder: 'after' }\n * );\n * ```\n */\nexport async function mergeContent(\n tokenContent: { content: string; format: 'scss' | 'css' },\n userContent: MergeContent[],\n config: Partial<MergeConfig> = {}\n): Promise<StyleMergeResult> {\n const { mergeOrder = 'after' } = config;\n\n const parts: string[] = [];\n const sources: string[] = ['<generated-tokens>'];\n const warnings: string[] = [];\n\n // Add header comment\n parts.push(generateHeaderComment(tokenContent.format));\n\n // Build content based on merge order\n if (mergeOrder === 'before') {\n // User styles first\n for (const content of userContent) {\n parts.push(generateSourceComment(content.source, tokenContent.format));\n parts.push(content.content);\n sources.push(content.source);\n }\n // Then token styles\n parts.push(generateSourceComment('<generated-tokens>', tokenContent.format));\n parts.push(tokenContent.content);\n } else {\n // Token styles first\n parts.push(generateSourceComment('<generated-tokens>', tokenContent.format));\n parts.push(tokenContent.content);\n // Then user styles\n for (const content of userContent) {\n parts.push(generateSourceComment(content.source, tokenContent.format));\n parts.push(content.content);\n sources.push(content.source);\n }\n }\n\n // Check for potential issues\n const mergedContent = parts.join('\\n\\n');\n warnings.push(...detectMergeIssues(mergedContent, tokenContent.format));\n\n return {\n content: mergedContent,\n sources,\n warnings,\n };\n}\n\n/**\n * Load content from files\n *\n * @param files File paths to load\n * @param type Content type (token or user)\n * @param format File format\n * @returns Loaded content\n */\nexport async function loadContent(\n files: string[],\n type: 'token' | 'user',\n format: 'scss' | 'css'\n): Promise<MergeContent[]> {\n const content: MergeContent[] = [];\n\n for (const filePath of files) {\n try {\n const fileContent = await fs.promises.readFile(filePath, 'utf-8');\n content.push({\n source: filePath,\n content: fileContent,\n type,\n format,\n });\n } catch (error) {\n console.warn(`Failed to load file: ${filePath}`, error);\n }\n }\n\n return content;\n}\n\n/**\n * Process SCSS imports header\n *\n * @param importHeader Import header configuration\n * @param configDir Config directory for resolving relative paths\n * @returns Processed import statements\n */\nexport function processScssImportHeader(\n importHeader: string | string[] | undefined,\n configDir: string\n): string {\n if (!importHeader) {\n return '';\n }\n\n const imports = Array.isArray(importHeader) ? importHeader : [importHeader];\n const statements: string[] = [];\n\n for (const importPath of imports) {\n // Determine if it's a path or module import\n if (importPath.startsWith('.') || importPath.startsWith('/')) {\n // Relative or absolute path\n const resolvedPath = path.resolve(configDir, importPath);\n statements.push(`@import '${resolvedPath}';`);\n } else {\n // Module import (e.g., 'normalize.css')\n statements.push(`@import '${importPath}';`);\n }\n }\n\n return `${statements.join('\\n')}\\n\\n`;\n}\n\n/**\n * Add SCSS import header to content\n *\n * @param content SCSS content\n * @param importHeader Import header to add\n * @param configDir Config directory for resolving paths\n * @returns Content with import header\n */\nexport function addScssImportHeader(\n content: string,\n importHeader: string | string[] | undefined,\n configDir: string\n): string {\n const header = processScssImportHeader(importHeader, configDir);\n if (!header) {\n return content;\n }\n\n return header + content;\n}\n","/**\n * Bundle generator for combined stylesheets\n *\n * @packageDocumentation\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename */\n/* eslint-disable security/detect-unsafe-regex */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport { loadContent, mergeContent } from './merger.js';\nimport { sortFiles } from './scanner.js';\n\nimport type { BundleConfig, BundleResult, StyleScannedFile, StyleMergeResult } from './types.js';\n\n// ============================================================================\n// Content Processing\n// ============================================================================\n\n/**\n * Remove source comments from content\n */\nfunction removeSourceComments(content: string): string {\n return content.replace(/\\/\\* ========== Source: .+ ========== \\*\\/\\n?/g, '');\n}\n\n/**\n * Simple CSS minification\n * Note: For production, consider using a proper minifier like cssnano\n */\nfunction minifyContent(content: string): string {\n return (\n content\n // Remove comments (but keep /*! ... */ license comments)\n .replace(/\\/\\*(?!!)[^*]*\\*+([^/*][^*]*\\*+)*\\//g, '')\n // Remove whitespace\n .replace(/\\s+/g, ' ')\n // Remove space around special characters\n .replace(/\\s*([{}:;,>+~])\\s*/g, '$1')\n // Remove trailing semicolons before closing braces\n .replace(/;}/g, '}')\n // Remove empty rules\n .replace(/[^{}]+\\{\\s*\\}/g, '')\n .trim()\n );\n}\n\n/**\n * Detect output extension based on content\n */\nfunction detectExtension(mergeResult: StyleMergeResult): string {\n const hasScssFeatures = mergeResult.content.match(/@mixin|@include|\\$[a-zA-Z]/);\n return hasScssFeatures ? '.scss' : '.css';\n}\n\n/**\n * Generate a basic sourcemap\n */\nfunction generateSourcemap(sources: string[], name: string, extension: string): string {\n const sourceMapV3 = {\n version: 3,\n file: `${name}${extension}`,\n sources,\n names: [],\n mappings: '',\n };\n\n return JSON.stringify(sourceMapV3, null, 2);\n}\n\n// ============================================================================\n// Main Functions\n// ============================================================================\n\n/**\n * Create a stylesheet bundle\n *\n * @param mergeResult Result from merge operation\n * @param config Bundle configuration\n * @returns Bundle result\n *\n * @example\n * ```typescript\n * const bundle = await createBundle(mergeResult, {\n * name: 'tokens-bundle',\n * outputDir: 'dist',\n * includeSourceComments: true,\n * sourcemaps: true,\n * minify: false,\n * });\n * ```\n */\nexport async function createBundle(\n mergeResult: StyleMergeResult,\n config: BundleConfig\n): Promise<BundleResult> {\n const { name, outputDir, includeSourceComments, sourcemaps, minify } = config;\n\n let content = mergeResult.content;\n\n // Optionally remove source comments\n if (!includeSourceComments) {\n content = removeSourceComments(content);\n }\n\n // Minify if requested\n let minifiedSize: number | undefined;\n if (minify) {\n const minified = minifyContent(content);\n minifiedSize = Buffer.byteLength(minified, 'utf-8');\n content = minified;\n }\n\n // Determine output path\n const extension = detectExtension(mergeResult);\n const outputPath = path.join(outputDir, `${name}${extension}`);\n\n // Ensure output directory exists\n await fs.promises.mkdir(outputDir, { recursive: true });\n\n // Write bundle\n await fs.promises.writeFile(outputPath, content, 'utf-8');\n\n // Write sourcemap if requested\n let sourcemap: string | undefined;\n if (sourcemaps) {\n sourcemap = generateSourcemap(mergeResult.sources, name, extension);\n const mapPath = `${outputPath}.map`;\n await fs.promises.writeFile(mapPath, sourcemap, 'utf-8');\n\n // Add sourcemap reference to content\n const mapRef = `\\n/*# sourceMappingURL=${name}${extension}.map */`;\n content += mapRef;\n await fs.promises.writeFile(outputPath, content, 'utf-8');\n }\n\n return {\n content,\n sourcemap,\n outputPath,\n files: mergeResult.sources,\n size: Buffer.byteLength(content, 'utf-8'),\n minifiedSize,\n };\n}\n\n/**\n * Create both CSS and SCSS bundles\n *\n * @param tokenCss Generated CSS tokens\n * @param tokenScss Generated SCSS tokens\n * @param cssFiles User CSS files (StyleScannedFile objects)\n * @param scssFiles User SCSS files (StyleScannedFile objects)\n * @param config Bundle configuration\n * @returns Map of bundle type to result\n */\nexport async function createBundles(\n tokenCss: string,\n tokenScss: string,\n cssFiles: StyleScannedFile[],\n scssFiles: StyleScannedFile[],\n config: Omit<BundleConfig, 'name'> & { baseName?: string }\n): Promise<{ css?: BundleResult; scss?: BundleResult }> {\n const { baseName = 'tokens-bundle', ...bundleConfig } = config;\n const results: { css?: BundleResult; scss?: BundleResult } = {};\n\n // Create CSS bundle if we have CSS content\n const sortedCss = sortFiles(cssFiles);\n if (tokenCss || sortedCss.length > 0) {\n const userContent = await loadContent(\n sortedCss.map((f) => f.absolutePath),\n 'user',\n 'css'\n );\n const mergeResult = await mergeContent({ content: tokenCss, format: 'css' }, userContent);\n\n results.css = await createBundle(mergeResult, {\n ...bundleConfig,\n name: baseName,\n });\n }\n\n // Create SCSS bundle if we have SCSS content\n const sortedScss = sortFiles(scssFiles);\n if (tokenScss || sortedScss.length > 0) {\n const userContent = await loadContent(\n sortedScss.map((f) => f.absolutePath),\n 'user',\n 'scss'\n );\n const mergeResult = await mergeContent({ content: tokenScss, format: 'scss' }, userContent);\n\n results.scss = await createBundle(mergeResult, {\n ...bundleConfig,\n name: `_${baseName}`,\n });\n }\n\n return results;\n}\n\n/**\n * Create a bundle from scanned files (no token content)\n *\n * @param files Scanned files to bundle\n * @param format Output format\n * @param config Bundle configuration\n * @returns Bundle result\n */\nexport async function createBundleFromFiles(\n files: StyleScannedFile[],\n format: 'css' | 'scss',\n config: BundleConfig\n): Promise<BundleResult> {\n const sorted = sortFiles(files);\n const userContent = await loadContent(\n sorted.map((f) => f.absolutePath),\n 'user',\n format\n );\n\n // Create merge result with empty token content\n const mergeResult = await mergeContent({ content: '', format }, userContent);\n\n return createBundle(mergeResult, config);\n}\n","/**\n * Output path resolver with placeholder support\n *\n * @packageDocumentation\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename */\n/* eslint-disable security/detect-object-injection */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { OutputFormat } from '../../config/types.js';\nimport type { OutputConfig, PlaceholderValues } from '../merge/types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default file names per format\n */\nexport const DEFAULT_FILE_NAMES: Record<OutputFormat, string> = {\n css: 'tokens.css',\n scss: '_tokens.scss',\n js: 'tokens.js',\n ts: 'tokens.ts',\n json: 'tokens.json',\n android: 'tokens.xml',\n ios: 'Tokens.swift',\n};\n\n// ============================================================================\n// Placeholder Functions\n// ============================================================================\n\n/**\n * Replace placeholders in a string\n *\n * @param template Template string with placeholders\n * @param values Values to replace\n * @returns String with placeholders replaced\n */\nexport function replacePlaceholders(template: string, values: PlaceholderValues): string {\n const now = new Date();\n\n const allValues: Record<string, string> = {\n theme: values.theme ?? 'default',\n name: values.name ?? 'tokens',\n format: values.format ?? '',\n date: values.date ?? now.toISOString().split('T')[0] ?? '',\n timestamp: values.timestamp ?? now.toISOString(),\n };\n\n let result = template;\n for (const [key, value] of Object.entries(allValues)) {\n result = result.replaceAll(`{${key}}`, value);\n }\n\n return result;\n}\n\n// ============================================================================\n// Path Resolution\n// ============================================================================\n\n/**\n * Resolve output path for a specific format\n *\n * @param format Output format\n * @param config Output configuration\n * @param values Placeholder values\n * @returns Resolved output path\n *\n * @example\n * ```typescript\n * const outputPath = resolveOutputPath('css', {\n * baseDir: 'dist',\n * formatDirs: { css: 'dist/css' },\n * fileNames: { css: 'design-tokens-{theme}.css' },\n * }, { theme: 'light' });\n *\n * // Returns: 'dist/css/design-tokens-light.css'\n * ```\n */\nexport function resolveOutputPath(\n format: OutputFormat,\n config: OutputConfig,\n values: PlaceholderValues = {}\n): string {\n // Determine directory\n const dir = config.formatDirs[format] ?? config.baseDir;\n\n // Determine file name\n let fileName = config.fileNames[format] ?? DEFAULT_FILE_NAMES[format];\n\n // Replace placeholders\n fileName = replacePlaceholders(fileName, values);\n\n return path.join(dir, fileName);\n}\n\n/**\n * Resolve all output paths for all formats\n *\n * @param formats Formats to generate\n * @param config Output configuration\n * @param values Placeholder values\n * @returns Map of format to output path\n */\nexport function resolveAllOutputPaths(\n formats: OutputFormat[],\n config: OutputConfig,\n values: PlaceholderValues = {}\n): Record<OutputFormat, string> {\n const result: Partial<Record<OutputFormat, string>> = {};\n\n for (const format of formats) {\n result[format] = resolveOutputPath(format, config, values);\n }\n\n return result as Record<OutputFormat, string>;\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate output paths don't conflict\n *\n * @param paths Output paths to validate\n * @returns Validation result with any conflicts found\n */\nexport function validateOutputPaths(paths: Record<string, string>): {\n valid: boolean;\n conflicts: [string, string][];\n} {\n const conflicts: [string, string][] = [];\n const pathToFormat: Record<string, string> = {};\n\n for (const [format, outputPath] of Object.entries(paths)) {\n const normalized = path.normalize(outputPath);\n const existingFormat = pathToFormat[normalized];\n\n if (existingFormat !== undefined) {\n conflicts.push([existingFormat, format]);\n } else {\n pathToFormat[normalized] = format;\n }\n }\n\n return {\n valid: conflicts.length === 0,\n conflicts,\n };\n}\n\n// ============================================================================\n// Directory Management\n// ============================================================================\n\n/**\n * Ensure all output directories exist\n *\n * @param paths Output paths\n * @returns Created directories\n */\nexport async function ensureOutputDirs(paths: Record<string, string>): Promise<string[]> {\n const directories = new Set<string>();\n for (const outputPath of Object.values(paths)) {\n directories.add(path.dirname(outputPath));\n }\n\n const created: string[] = [];\n for (const dir of directories) {\n await fs.promises.mkdir(dir, { recursive: true });\n created.push(dir);\n }\n\n return created;\n}\n\n/**\n * Create output configuration from token config\n *\n * @param tokenConfig Token configuration\n * @returns Output configuration\n */\nexport function createOutputConfig(tokenConfig: {\n outputDir?: string;\n outputDirs?: Partial<Record<OutputFormat, string>>;\n outputFileNames?: Partial<Record<OutputFormat, string>>;\n}): OutputConfig {\n return {\n baseDir: tokenConfig.outputDir ?? 'dist',\n formatDirs: tokenConfig.outputDirs ?? {},\n fileNames: tokenConfig.outputFileNames ?? {},\n createDirs: true,\n };\n}\n","/**\n * Style Dictionary Type Definitions\n *\n * Types for Style Dictionary integration including tokens, transforms,\n * formats, preprocessors, and configuration.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/types\n */\n\n// ============================================================================\n// Token Types\n// ============================================================================\n\n/**\n * Style Dictionary token (runtime representation)\n */\nexport interface SDToken {\n /** Token name (after name transforms) */\n name: string;\n\n /** Resolved value (after value transforms) */\n value: unknown;\n\n /** Original value (may contain references) */\n original: {\n value: unknown;\n $value?: unknown;\n };\n\n /** Token path segments */\n path: string[];\n\n /** DTCG $value property */\n $value?: unknown;\n\n /** Token type */\n type?: string;\n\n /** DTCG $type property */\n $type?: string;\n\n /** Token description */\n description?: string;\n\n /** DTCG $description property */\n $description?: string;\n\n /** Comment for documentation */\n comment?: string;\n\n /** DTCG $extensions */\n $extensions?: Record<string, unknown>;\n\n /** DTCG $scopes (from Figma Variables) */\n $scopes?: string[];\n\n /** CTI (Category/Type/Item) attributes */\n attributes?: {\n category?: string;\n type?: string;\n item?: string;\n subitem?: string;\n state?: string;\n };\n\n /** File path where token was defined */\n filePath?: string;\n\n /** Whether token is a reference to another token */\n isSource?: boolean;\n}\n\n/**\n * Style Dictionary dictionary containing all tokens\n */\nexport interface SDDictionary {\n /** Flat array of all tokens */\n allTokens: SDToken[];\n\n /** Nested token structure */\n tokens: Record<string, unknown>;\n\n /** Unfiltered tokens (before platform filtering) */\n unfilteredTokens: Record<string, unknown>;\n}\n\n// ============================================================================\n// Transform Types\n// ============================================================================\n\n/**\n * Transform type - what aspect of the token is being transformed\n */\nexport type TransformType = 'name' | 'value' | 'attribute';\n\n/**\n * Options passed to transform functions\n */\nexport interface SDTransformOptions {\n /** Base font size for rem conversion (default: 16) */\n basePxFontSize?: number;\n\n /** CSS variable prefix */\n prefix?: string;\n\n /** Additional options */\n [key: string]: unknown;\n}\n\n/**\n * Transform definition for Style Dictionary\n */\nexport interface TransformDefinition {\n /** Unique transform name (e.g., 'fontWeight/unitless') */\n name: string;\n\n /** Transform type */\n type: TransformType;\n\n /**\n * Filter function - return true to apply transform\n * If omitted, transform applies to all tokens\n */\n filter?: (token: SDToken) => boolean;\n\n /**\n * Transform function\n * @param token - The token being transformed\n * @param options - Transform options from platform config\n * @returns Transformed value\n */\n transform: (token: SDToken, options?: SDTransformOptions) => unknown;\n}\n\n/**\n * Transform group definition\n */\nexport interface TransformGroupDefinition {\n /** Unique group name (e.g., 'custom/css') */\n name: string;\n\n /** Ordered list of transform names to apply */\n transforms: string[];\n}\n\n// ============================================================================\n// Format Types\n// ============================================================================\n\n/**\n * Platform configuration passed to formats\n */\nexport interface SDPlatform {\n /** Transform group to use */\n transformGroup?: string;\n\n /** Individual transforms (alternative to transformGroup) */\n transforms?: string[];\n\n /** Output path prefix */\n buildPath?: string;\n\n /** Files to generate */\n files?: SDFile[];\n\n /** Platform-specific options */\n options?: Record<string, unknown>;\n}\n\n/**\n * File configuration for platform output\n */\nexport interface SDFile {\n /** Output file name */\n destination: string;\n\n /** Format to use for generating content */\n format: string;\n\n /**\n * Filter tokens to include in this file\n * Can be a string (filter name) or function\n */\n filter?: string | ((token: SDToken) => boolean);\n\n /** File-specific options passed to format */\n options?: Record<string, unknown>;\n}\n\n/**\n * Arguments passed to format functions\n */\nexport interface SDFormatArgs {\n /** Dictionary containing all tokens */\n dictionary: SDDictionary;\n\n /** Options from file config */\n options: Record<string, unknown>;\n\n /** Platform configuration */\n platform: SDPlatform;\n\n /** File configuration */\n file: SDFile;\n}\n\n/**\n * Format definition for Style Dictionary\n */\nexport interface FormatDefinition {\n /** Unique format name (e.g., 'css/variables-with-comments') */\n name: string;\n\n /**\n * Format function - generates file content\n * @param args - Format arguments\n * @returns File content as string\n */\n format: (args: SDFormatArgs) => string;\n}\n\n// ============================================================================\n// Preprocessor Types\n// ============================================================================\n\n/**\n * Preprocessor definition for Style Dictionary\n */\nexport interface PreprocessorDefinition {\n /** Unique preprocessor name */\n name: string;\n\n /**\n * Preprocessor function - modifies token dictionary before processing\n * @param dictionary - Raw token dictionary\n * @returns Modified dictionary\n */\n preprocessor: (dictionary: Record<string, unknown>) => Record<string, unknown>;\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * Style Dictionary log configuration\n */\nexport interface SDLogConfig {\n /** Logging verbosity */\n verbosity?: 'default' | 'silent' | 'verbose';\n\n /** How to handle warnings */\n warnings?: 'warn' | 'error' | 'disabled';\n\n /** How to handle errors */\n errors?: 'error' | 'throw';\n}\n\n/**\n * Full Style Dictionary configuration\n */\nexport interface SDConfig {\n /** Logging configuration */\n log?: SDLogConfig;\n\n /** Preprocessors to run on source tokens */\n preprocessors?: string[];\n\n /** Source token file patterns */\n source?: string[];\n\n /** Additional files to include */\n include?: string[];\n\n /** Platform configurations */\n platforms?: Record<string, SDPlatform>;\n}\n\n/**\n * Options for creating Style Dictionary configuration\n */\nexport interface CreateSDConfigOptions {\n /** Token source files (glob patterns) */\n source?: string[];\n\n /** CSS variable prefix (default: '--dsai-') */\n prefix?: string;\n\n /** Output directory base path */\n buildPath?: string;\n\n /** Base font size for rem conversion (default: 16) */\n baseFontSize?: number;\n\n /** Whether to output references in generated files */\n outputReferences?: boolean;\n\n /** Additional transforms to register */\n customTransforms?: TransformDefinition[];\n\n /** Additional formats to register */\n customFormats?: FormatDefinition[];\n\n /** Additional preprocessors to register */\n customPreprocessors?: PreprocessorDefinition[];\n\n /** Platforms to include (default: all) */\n platforms?: SDPlatformType[];\n\n /** Enable verbose logging */\n verbose?: boolean;\n}\n\n/**\n * Available platform types\n */\nexport type SDPlatformType = 'css' | 'js' | 'ts' | 'scss' | 'scss-dist' | 'json';\n\n// ============================================================================\n// Registration Types\n// ============================================================================\n\n/**\n * Style Dictionary instance type (for registration functions)\n * This is a minimal interface - actual SD has more methods\n */\nexport interface StyleDictionaryInstance {\n registerTransform: (transform: {\n name: string;\n type: TransformType;\n filter?: (token: SDToken) => boolean;\n transform: (token: SDToken, options?: SDTransformOptions) => unknown;\n }) => void;\n\n registerTransformGroup: (group: { name: string; transforms: string[] }) => void;\n\n registerFormat: (format: { name: string; format: (args: SDFormatArgs) => string }) => void;\n\n registerPreprocessor: (preprocessor: {\n name: string;\n preprocessor: (dictionary: Record<string, unknown>) => Record<string, unknown>;\n }) => void;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Check if a value is an SD token\n */\nexport function isSDToken(obj: unknown): obj is SDToken {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n\n const token = obj as Record<string, unknown>;\n\n // Must have name and path\n if (typeof token['name'] !== 'string') {\n return false;\n }\n\n if (!Array.isArray(token['path'])) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Check if token has a DTCG $value\n */\nexport function hasDTCGValue(token: SDToken): boolean {\n return token.$value !== undefined;\n}\n\n/**\n * Get token value (DTCG or legacy format)\n */\nexport function getSDTokenValue(token: SDToken): unknown {\n return token.$value ?? token.value;\n}\n\n/**\n * Get token type (DTCG or legacy format)\n */\nexport function getSDTokenType(token: SDToken): string | undefined {\n return token.$type ?? token.type;\n}\n","/**\n * CSS Dark Mode Variables Format\n *\n * Generates CSS custom properties scoped to [data-bs-theme=\"dark\"]\n * following Bootstrap 5.3+ color mode pattern.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats/css-dark-mode\n * @see https://getbootstrap.com/docs/5.3/customize/color-modes/\n */\n\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\n\n/**\n * css/variables-dark-mode format\n *\n * Generates CSS custom properties scoped to [data-bs-theme=\"dark\"]\n * for Bootstrap-compatible dark mode theming.\n *\n * @example\n * Output:\n * ```css\n * [data-bs-theme=\"dark\"] {\n * --dsai-body-bg: #212529;\n * --dsai-body-color: #dee2e6;\n * }\n * ```\n */\nexport const cssDarkModeVariables: FormatDefinition = {\n name: 'css/variables-dark-mode',\n format: ({ dictionary, options }: SDFormatArgs): string => {\n const prefix = (options['prefix'] as string) ?? '--';\n const selector = (options['selector'] as string) ?? '[data-bs-theme=\"dark\"]';\n\n const variables = dictionary.allTokens.map((token) => {\n const lines: string[] = [];\n\n // Add comment if present\n if (token.comment) {\n lines.push(` /* ${token.comment} */`);\n }\n\n // Add description if present (DTCG $description or legacy description)\n const description = token.$description ?? token.description;\n if (description && description !== token.comment) {\n lines.push(` /* ${description} */`);\n }\n\n // Get value (DTCG $value or legacy value)\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\n\n // Add variable\n lines.push(` ${prefix}${token.name}: ${value};`);\n\n return lines.join('\\n');\n });\n\n return `${selector} {\\n${variables.join('\\n')}\\n}\\n`;\n },\n};\n","/**\n * CSS Variables Format\n *\n * Generates CSS custom properties with descriptive comments.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats/css-variables\n */\n\nimport type { SDFormatArgs, FormatDefinition } from '../types.js';\n\n/**\n * css/variables-with-comments format\n *\n * Generates CSS custom properties with descriptive comments.\n * Supports configurable prefix via options.\n *\n * @example\n * Output:\n * ```css\n * :root {\n * /* Primary brand color *\\/\n * --dsai-color-primary: #007bff;\n * --dsai-spacing-md: 1rem;\n * }\n * ```\n */\nexport const cssVariablesWithComments: FormatDefinition = {\n name: 'css/variables-with-comments',\n format: ({ dictionary, options }: SDFormatArgs): string => {\n const prefix = (options['prefix'] as string) ?? '--';\n\n const variables = dictionary.allTokens.map((token) => {\n const lines: string[] = [];\n\n // Add comment if present\n if (token.comment) {\n lines.push(` /* ${token.comment} */`);\n }\n\n // Add description if present (DTCG $description or legacy description)\n const description = token.$description ?? token.description;\n if (description && description !== token.comment) {\n lines.push(` /* ${description} */`);\n }\n\n // Get value (DTCG $value or legacy value)\n const tokenValue = token.$value !== undefined ? token.$value : token.value;\n const value = typeof tokenValue === 'string' ? tokenValue : JSON.stringify(tokenValue);\n\n // Add variable\n lines.push(` ${prefix}${token.name}: ${value};`);\n\n return lines.join('\\n');\n });\n\n return `:root {\\n${variables.join('\\n')}\\n}\\n`;\n },\n};\n","/**\n * TypeScript Declarations Format\n *\n * Generates TypeScript type declarations for design tokens.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats/typescript\n */\n\n/* eslint-disable security/detect-object-injection */\n\nimport type { SDFormatArgs, FormatDefinition, SDToken } from '../types.js';\n\n/**\n * Get TypeScript type from token value\n */\nfunction getTypeScriptType(token: SDToken): string {\n const value = token.value;\n if (typeof value === 'number') {\n return 'number';\n }\n if (typeof value === 'boolean') {\n return 'boolean';\n }\n return 'string';\n}\n\n/**\n * Token tree node for building interfaces\n */\ninterface TokenTreeNode {\n _isToken?: boolean;\n _type?: string;\n [key: string]: TokenTreeNode | boolean | string | undefined;\n}\n\n/**\n * Build nested interface structure\n */\nfunction buildTokenInterface(obj: TokenTreeNode, indent = 0): string {\n const spaces = ' '.repeat(indent);\n let output = '{\\n';\n\n for (const key of Object.keys(obj)) {\n // Skip internal markers\n if (key.startsWith('_')) {\n continue;\n }\n\n const value = obj[key];\n if (!value || typeof value !== 'object') {\n continue;\n }\n\n // Quote keys that need it (contain hyphens or start with numbers)\n const quotedKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key) ? key : `\"${key}\"`;\n\n const typedValue = value as TokenTreeNode;\n\n // Check if this is a leaf token (has _isToken marker)\n if (typedValue._isToken) {\n output += `${spaces} ${quotedKey}: ${typedValue._type};\\n`;\n } else {\n // Nested object\n output += `${spaces} ${quotedKey}: ${buildTokenInterface(typedValue, indent + 1)}\\n`;\n }\n }\n\n output += `${spaces}}`;\n return output;\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * typescript/declarations format\n *\n * Generates TypeScript declarations with:\n * - DesignTokens interface with nested structure\n * - String literal types for each token category\n * - Flat token exports with proper types\n *\n * @example\n * Output:\n * ```typescript\n * export type ColorTokenName =\n * | 'color.primary'\n * | 'color.secondary';\n *\n * export interface DesignTokens {\n * color: {\n * primary: string;\n * secondary: string;\n * };\n * }\n *\n * export declare const colorPrimary: string;\n * export declare const tokens: DesignTokens;\n * ```\n */\nexport const typescriptDeclarations: FormatDefinition = {\n name: 'typescript/declarations',\n format: ({ dictionary }: SDFormatArgs): string => {\n // Build nested structure with type markers\n const tokenTree: TokenTreeNode = {};\n\n for (const token of dictionary.allTokens) {\n let current: TokenTreeNode = tokenTree;\n for (let i = 0; i < token.path.length - 1; i++) {\n const key = token.path[i] as string;\n // Guard against prototype pollution\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n continue;\n }\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n current = current[key] as TokenTreeNode;\n }\n\n const lastKey = token.path[token.path.length - 1];\n if (lastKey) {\n current[lastKey] = {\n _isToken: true,\n _type: getTypeScriptType(token),\n };\n }\n }\n\n // Group tokens by category for string literal types\n const categories: Record<string, string[]> = {};\n for (const token of dictionary.allTokens) {\n const category = token.path[0];\n if (category) {\n if (!categories[category]) {\n categories[category] = [];\n }\n categories[category].push(token.path.join('.'));\n }\n }\n\n // Generate category types\n let literalTypes = '';\n for (const category of Object.keys(categories).sort()) {\n const categoryTokens = categories[category];\n if (!categoryTokens) {\n continue;\n }\n const typeName = `${capitalize(category)}TokenName`;\n literalTypes += `/**\\n * All ${category} token names as string literals\\n */\\n`;\n literalTypes += `export type ${typeName} =\\n`;\n literalTypes += categoryTokens.map((t) => ` | '${t}'`).join('\\n');\n literalTypes += ';\\n\\n';\n }\n\n // Generate all token names type\n const allTokenNames = dictionary.allTokens.map((t) => t.path.join('.'));\n literalTypes += `/**\\n * All token names as string literals\\n */\\n`;\n literalTypes += `export type TokenName =\\n`;\n literalTypes += allTokenNames.map((t) => ` | '${t}'`).join('\\n');\n literalTypes += ';\\n\\n';\n\n // Generate flat token exports\n let flatExports = '/**\\n * Flat token exports (camelCase names)\\n */\\n';\n for (const token of dictionary.allTokens) {\n const type = getTypeScriptType(token);\n flatExports += `export declare const ${token.name}: ${type};\\n`;\n }\n\n return `/**\n * Design Tokens - TypeScript Declarations\n * Auto-generated by @dsai-io/tools\n * DO NOT EDIT DIRECTLY\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// String Literal Types (for type-safe token access)\n// ============================================================================\n\n${literalTypes}\n// ============================================================================\n// Nested Token Interface\n// ============================================================================\n\n/**\n * Design tokens organized by category\n */\nexport interface DesignTokens ${buildTokenInterface(tokenTree)}\n\n// ============================================================================\n// Flat Token Exports\n// ============================================================================\n\n${flatExports}\n// ============================================================================\n// Default Export\n// ============================================================================\n\nexport declare const tokens: DesignTokens;\nexport default tokens;\n`;\n },\n};\n","/**\n * Style Dictionary Formats\n *\n * Exports all built-in formats and registration utilities.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/formats\n */\n\nimport { cssDarkModeVariables } from './css-dark-mode.js';\nimport { cssVariablesWithComments } from './css-variables.js';\nimport { typescriptDeclarations } from './typescript.js';\n\nimport type { FormatDefinition, StyleDictionaryInstance } from '../types.js';\n\n/**\n * All built-in formats\n */\nexport const builtInFormats: FormatDefinition[] = [\n cssDarkModeVariables,\n cssVariablesWithComments,\n typescriptDeclarations,\n];\n\n/**\n * Register all formats with Style Dictionary\n *\n * @param sd - Style Dictionary instance\n * @param customFormats - Additional custom formats to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerFormats } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerFormats(StyleDictionary);\n * ```\n */\nexport function registerFormats(\n sd: StyleDictionaryInstance,\n customFormats: FormatDefinition[] = []\n): void {\n const allFormats = [...builtInFormats, ...customFormats];\n\n for (const format of allFormats) {\n sd.registerFormat({\n name: format.name,\n format: format.format,\n });\n }\n}\n\n// Re-export individual formats\nexport { cssDarkModeVariables } from './css-dark-mode.js';\nexport { cssVariablesWithComments } from './css-variables.js';\nexport { typescriptDeclarations } from './typescript.js';\n","/**\n * CSS Transform Group\n *\n * Transform group for generating CSS output.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/groups/css\n */\n\nimport type { TransformGroupDefinition } from '../types.js';\n\n/**\n * custom/css transform group\n *\n * Transforms for generating CSS custom properties:\n * - attribute/cti: Add CTI attributes\n * - name/kebab: kebab-case names\n * - time/seconds: Convert time to seconds\n * - fontWeight/unitless: Keep font weights unitless\n * - lineHeight/unitless: Keep line heights unitless\n * - dimension/rem: Convert dimensions to rem\n * - color/css: Convert colors to CSS format\n */\nexport const cssTransformGroup: TransformGroupDefinition = {\n name: 'custom/css',\n transforms: [\n 'attribute/cti',\n 'name/kebab',\n 'time/seconds',\n 'fontWeight/unitless', // Must run before dimension/rem\n 'lineHeight/unitless', // Must run before dimension/rem\n 'dimension/rem',\n 'color/css',\n ],\n};\n","/**\n * JavaScript Transform Group\n *\n * Transform group for generating JavaScript output.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/groups/js\n */\n\nimport type { TransformGroupDefinition } from '../types.js';\n\n/**\n * custom/js transform group\n *\n * Transforms for generating JavaScript/TypeScript exports:\n * - attribute/cti: Add CTI attributes\n * - name/camel: camelCase names\n * - fontWeight/unitless: Keep font weights unitless\n * - lineHeight/unitless: Keep line heights unitless\n * - dimension/rem: Convert dimensions to rem\n * - color/css: Convert colors to CSS format\n */\nexport const jsTransformGroup: TransformGroupDefinition = {\n name: 'custom/js',\n transforms: [\n 'attribute/cti',\n 'name/camel',\n 'fontWeight/unitless', // Must run before dimension/rem\n 'lineHeight/unitless', // Must run before dimension/rem\n 'dimension/rem',\n 'color/css',\n ],\n};\n","/**\n * SCSS Transform Group\n *\n * Transform group for generating SCSS output.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/groups/scss\n */\n\nimport type { TransformGroupDefinition } from '../types.js';\n\n/**\n * custom/scss transform group\n *\n * Transforms for generating SCSS variables:\n * - attribute/cti: Add CTI attributes\n * - name/kebab: kebab-case names\n * - time/seconds: Convert time to seconds\n * - fontWeight/unitless: Keep font weights unitless\n * - lineHeight/unitless: Keep line heights unitless\n * - dimension/rem: Convert dimensions to rem\n * - color/css: Convert colors to CSS format\n *\n * This follows Style Dictionary v5 best practices:\n * - Source tokens are raw numbers\n * - Transforms add appropriate units (or keep unitless for font-weight/line-height)\n */\nexport const scssTransformGroup: TransformGroupDefinition = {\n name: 'custom/scss',\n transforms: [\n 'attribute/cti', // Add CTI attributes\n 'name/kebab', // kebab-case names\n 'time/seconds', // Convert time to seconds\n 'fontWeight/unitless', // Font weights stay unitless (MUST run before dimension/rem)\n 'lineHeight/unitless', // Line heights stay unitless (MUST run before dimension/rem)\n 'dimension/rem', // Convert dimensions to rem\n 'color/css', // Convert colors to CSS format\n ],\n};\n","/**\n * Style Dictionary Transform Groups\n *\n * Exports all built-in transform groups and registration utilities.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/groups\n */\n\nimport { cssTransformGroup } from './css.js';\nimport { jsTransformGroup } from './js.js';\nimport { scssTransformGroup } from './scss.js';\n\nimport type { StyleDictionaryInstance, TransformGroupDefinition } from '../types.js';\n\n/**\n * All built-in transform groups\n */\nexport const transformGroups: TransformGroupDefinition[] = [\n cssTransformGroup,\n jsTransformGroup,\n scssTransformGroup,\n];\n\n/**\n * Register all transform groups with Style Dictionary\n *\n * @param sd - Style Dictionary instance\n * @param customGroups - Additional custom transform groups to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerTransformGroups } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerTransformGroups(StyleDictionary);\n * ```\n */\nexport function registerTransformGroups(\n sd: StyleDictionaryInstance,\n customGroups: TransformGroupDefinition[] = []\n): void {\n const allGroups = [...transformGroups, ...customGroups];\n\n for (const group of allGroups) {\n sd.registerTransformGroup({\n name: group.name,\n transforms: group.transforms,\n });\n }\n}\n\n// Re-export individual transform groups\nexport { cssTransformGroup } from './css.js';\nexport { jsTransformGroup } from './js.js';\nexport { scssTransformGroup } from './scss.js';\n","/**\n * Fix References Preprocessor\n *\n * Fixes token reference paths that may be mismatched between\n * Figma exports and the actual token structure.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/preprocessors/fix-references\n */\n\nimport type { PreprocessorDefinition } from '../types.js';\n\n/**\n * Default reference path mappings\n * Maps incorrect reference paths to correct paths\n */\nconst DEFAULT_PATH_MAPPINGS: Array<[string, string]> = [\n ['{colors.brand.', '{color.'],\n ['{colors.neutral.', '{neutral.'],\n ['{borders.width.', '{border.width.'],\n];\n\n/**\n * Fix a single value's reference path\n */\nfunction fixValue(value: unknown, mappings: Array<[string, string]>): unknown {\n if (typeof value !== 'string' || !value.startsWith('{')) {\n return value;\n }\n\n let result = value;\n for (const mapping of mappings) {\n result = result.split(mapping[0]).join(mapping[1]);\n }\n return result;\n}\n\n/**\n * Process tokens recursively to fix reference paths\n */\nfunction processTokens(obj: Record<string, unknown>, mappings: Array<[string, string]>): void {\n for (const key of Object.keys(obj)) {\n // eslint-disable-next-line security/detect-object-injection\n const value = obj[key];\n\n if (value && typeof value === 'object') {\n const typedValue = value as Record<string, unknown>;\n\n // DTCG format - fix $value\n if ('$value' in typedValue) {\n typedValue['$value'] = fixValue(typedValue['$value'], mappings);\n }\n // Legacy format - fix value\n else if ('value' in typedValue) {\n typedValue['value'] = fixValue(typedValue['value'], mappings);\n }\n // Recurse into nested objects\n else {\n processTokens(typedValue, mappings);\n }\n }\n }\n}\n\n/**\n * fix-references preprocessor\n *\n * Fixes token reference paths that may be mismatched.\n * Our tokens use \"color.blue.500\" but Figma exports may reference\n * \"{colors.brand.blue.500}\" - this preprocessor fixes the mismatch.\n *\n * @example\n * Before: { $value: \"{colors.brand.primary}\" }\n * After: { $value: \"{color.primary}\" }\n */\nexport const fixReferences: PreprocessorDefinition = {\n name: 'fix-references',\n preprocessor: (dictionary) => {\n processTokens(dictionary, DEFAULT_PATH_MAPPINGS);\n return dictionary;\n },\n};\n\n/**\n * Create a custom fix-references preprocessor with custom mappings\n *\n * @param mappings - Array of [from, to] path mapping pairs\n * @returns Custom preprocessor definition\n *\n * @example\n * ```typescript\n * const customFixReferences = createFixReferencesPreprocessor([\n * ['{colors.brand.', '{color.'],\n * ['{acme.', '{brand.'],\n * ]);\n * ```\n */\nexport function createFixReferencesPreprocessor(\n mappings: Array<[string, string]>\n): PreprocessorDefinition {\n return {\n name: 'fix-references-custom',\n preprocessor: (dictionary) => {\n processTokens(dictionary, mappings);\n return dictionary;\n },\n };\n}\n","/**\n * Style Dictionary Preprocessors\n *\n * Exports all built-in preprocessors and registration utilities.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/preprocessors\n */\n\nimport { fixReferences } from './fix-references.js';\n\nimport type { PreprocessorDefinition, StyleDictionaryInstance } from '../types.js';\n\n/**\n * All built-in preprocessors\n */\nexport const builtInPreprocessors: PreprocessorDefinition[] = [fixReferences];\n\n/**\n * Register all preprocessors with Style Dictionary\n *\n * @param sd - Style Dictionary instance\n * @param customPreprocessors - Additional custom preprocessors to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerPreprocessors } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerPreprocessors(StyleDictionary);\n * ```\n */\nexport function registerPreprocessors(\n sd: StyleDictionaryInstance,\n customPreprocessors: PreprocessorDefinition[] = []\n): void {\n const allPreprocessors = [...builtInPreprocessors, ...customPreprocessors];\n\n for (const preprocessor of allPreprocessors) {\n sd.registerPreprocessor({\n name: preprocessor.name,\n preprocessor: preprocessor.preprocessor,\n });\n }\n}\n\n// Re-export individual preprocessors\nexport { fixReferences, createFixReferencesPreprocessor } from './fix-references.js';\n","/**\n * Dimension Transform\n *\n * Converts dimension values to rem units.\n * Handles raw numbers and pixel strings.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/dimension\n */\n\nimport type { SDToken, SDTransformOptions, TransformDefinition } from '../types.js';\n\n/** Default base font size for rem conversion */\nconst DEFAULT_BASE_FONT_SIZE = 16;\n\n/**\n * Check if token is a dimension (but not font-weight or line-height)\n */\nfunction isDimension(token: SDToken): boolean {\n const tokenType = token.$type ?? token.type;\n\n // Exclude font-weights\n if (tokenType === 'fontWeight') {\n return false;\n }\n const pathHasFontWeight = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower.includes('fontweight') || lower.includes('font-weight');\n });\n if (pathHasFontWeight) {\n return false;\n }\n\n // Exclude line-heights\n if (tokenType === 'lineHeight') {\n return false;\n }\n const pathHasLineHeight = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower.includes('lineheight') || lower.includes('line-height');\n });\n if (pathHasLineHeight) {\n return false;\n }\n const scopeHasLineHeight = token.$scopes?.includes('LINE_HEIGHT');\n if (scopeHasLineHeight) {\n return false;\n }\n\n // Exclude grid config (unitless counts)\n const pathHasGridConfig = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower === 'columns' || lower === 'row-columns';\n });\n if (pathHasGridConfig) {\n return false;\n }\n\n // Include dimension, spacing, sizing types\n return tokenType === 'dimension' || tokenType === 'spacing' || tokenType === 'sizing';\n}\n\n/**\n * dimension/rem transform\n *\n * Converts dimension values to rem.\n * Uses basePxFontSize from options (default: 16).\n *\n * @example\n * // Numeric input\n * Input: { $value: 16, $type: \"dimension\" }\n * Output: \"1rem\"\n *\n * @example\n * // Pixel string\n * Input: { $value: \"24px\", $type: \"dimension\" }\n * Output: \"1.5rem\"\n *\n * @example\n * // Zero value\n * Input: { $value: 0, $type: \"dimension\" }\n * Output: \"0\"\n */\nexport const dimensionRem: TransformDefinition = {\n name: 'dimension/rem',\n type: 'value',\n filter: isDimension,\n transform: (token, options?: SDTransformOptions) => {\n const value = token.$value ?? token.value;\n const baseFontSize = options?.basePxFontSize ?? DEFAULT_BASE_FONT_SIZE;\n\n // Handle raw numbers\n if (typeof value === 'number') {\n if (value === 0) {\n return '0';\n }\n return `${value / baseFontSize}rem`;\n }\n\n // Handle px strings\n if (typeof value === 'string' && value.endsWith('px')) {\n const numValue = Number.parseFloat(value);\n if (numValue === 0) {\n return '0';\n }\n return `${numValue / baseFontSize}rem`;\n }\n\n // Return as-is if not convertible\n return value;\n },\n};\n","/**\n * Font Weight Transform\n *\n * Keeps font-weight values as unitless numbers (300, 400, 700, etc.)\n * CSS font-weight must be unitless for proper inheritance.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/font-weight\n */\n\nimport type { SDToken, TransformDefinition } from '../types.js';\n\n/**\n * Named font weight values mapped to numeric values\n */\nconst NAMED_WEIGHTS: Record<string, number> = {\n thin: 100,\n hairline: 100,\n extralight: 200,\n ultralight: 200,\n light: 300,\n normal: 400,\n regular: 400,\n medium: 500,\n semibold: 600,\n demibold: 600,\n bold: 700,\n extrabold: 800,\n ultrabold: 800,\n black: 900,\n heavy: 900,\n};\n\n/**\n * Check if token is a font weight\n */\nfunction isFontWeight(token: SDToken): boolean {\n const tokenType = token.$type ?? token.type;\n\n // Direct type match\n if (tokenType === 'fontWeight' || tokenType === 'number') {\n return true;\n }\n\n // Path-based detection\n const pathHasFontWeight = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower === 'fontweight' || lower.includes('font-weight') || lower.includes('fontweight');\n });\n\n return pathHasFontWeight ?? false;\n}\n\n/**\n * fontWeight/unitless transform\n *\n * Ensures font-weight values are unitless numbers.\n * Handles numeric values, string values, and named weights.\n *\n * @example\n * // Numeric input\n * Input: { $value: 700, $type: \"fontWeight\" }\n * Output: 700\n *\n * @example\n * // String input\n * Input: { $value: \"700\", $type: \"fontWeight\" }\n * Output: 700\n *\n * @example\n * // Named weight\n * Input: { $value: \"bold\", $type: \"fontWeight\" }\n * Output: 700\n */\nexport const fontWeightUnitless: TransformDefinition = {\n name: 'fontWeight/unitless',\n type: 'value',\n filter: isFontWeight,\n transform: (token) => {\n const value = token.$value ?? token.value;\n\n // Already a number - return as-is\n if (typeof value === 'number') {\n return value;\n }\n\n // String value\n if (typeof value === 'string') {\n // Try to parse as number\n const parsed = Number.parseInt(value, 10);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n\n // Handle named weights\n const normalized = value.toLowerCase().replace(/[^a-z]/g, '');\n if (Object.hasOwn(NAMED_WEIGHTS, normalized)) {\n // eslint-disable-next-line security/detect-object-injection\n const namedWeight = NAMED_WEIGHTS[normalized];\n if (namedWeight !== undefined) {\n return namedWeight;\n }\n }\n }\n\n // Fallback - return as-is\n return value;\n },\n};\n","/**\n * Line Height Transform\n *\n * Keeps line-height values as unitless ratios (1, 1.5, 2, etc.)\n * CSS line-height should be unitless for proper inheritance.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/line-height\n */\n\nimport type { SDToken, TransformDefinition } from '../types.js';\n\n/** Default base font size for conversion */\nconst DEFAULT_BASE_FONT_SIZE = 16;\n\n/**\n * Check if token is a line height\n */\nfunction isLineHeight(token: SDToken): boolean {\n const tokenType = token.$type ?? token.type;\n\n // Direct type match\n if (tokenType === 'lineHeight') {\n return true;\n }\n\n // Path-based detection\n const pathHasLineHeight = token.path?.some((part) => {\n const lower = String(part).toLowerCase();\n return lower === 'lineheight' || lower.includes('line-height') || lower.includes('lineheight');\n });\n\n // Scope-based detection (from Figma Variables)\n const scopeHasLineHeight = token.$scopes?.includes('LINE_HEIGHT');\n\n return (pathHasLineHeight ?? false) || (scopeHasLineHeight ?? false);\n}\n\n/**\n * lineHeight/unitless transform\n *\n * Converts line-height values to unitless ratios.\n * Handles numbers, percentages, and pixel values.\n *\n * @example\n * // Percentage input\n * Input: { $value: \"150%\", $type: \"lineHeight\" }\n * Output: 1.5\n *\n * @example\n * // Already unitless\n * Input: { $value: 1.5, $type: \"lineHeight\" }\n * Output: 1.5\n *\n * @example\n * // Pixel value from Figma\n * Input: { $value: 24, $type: \"lineHeight\" }\n * Output: 1.5 (assuming 16px base)\n */\nexport const lineHeightUnitless: TransformDefinition = {\n name: 'lineHeight/unitless',\n type: 'value',\n filter: isLineHeight,\n transform: (token) => {\n const value = token.$value ?? token.value;\n\n // Already a number\n if (typeof value === 'number') {\n // If <= 3, already a multiplier (1, 1.5, 2)\n if (value <= 3) {\n return value;\n }\n // If > 3, likely px from Figma - convert to unitless\n return value / DEFAULT_BASE_FONT_SIZE;\n }\n\n // Handle percentage strings (e.g., \"150%\" -> 1.5)\n if (typeof value === 'string' && value.endsWith('%')) {\n return Number.parseFloat(value) / 100;\n }\n\n // Handle strings with units\n if (typeof value === 'string') {\n const numValue = Number.parseFloat(value);\n if (!Number.isNaN(numValue)) {\n if (numValue <= 3) {\n return numValue;\n }\n return numValue / DEFAULT_BASE_FONT_SIZE;\n }\n }\n\n // Fallback - return as-is\n return value;\n },\n};\n","/**\n * Name Transform\n *\n * Converts token paths to kebab-case names.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms/name\n */\n\nimport type { TransformDefinition } from '../types.js';\n\n/**\n * name/kebab transform\n *\n * Converts token path to kebab-case CSS variable name.\n * Replaces underscores with hyphens and lowercases.\n *\n * @example\n * Input: path = ['color', 'blue', '500']\n * Output: \"color-blue-500\"\n *\n * @example\n * Input: path = ['typography', 'fontWeight', 'bold']\n * Output: \"typography-fontweight-bold\"\n */\nexport const nameKebab: TransformDefinition = {\n name: 'name/kebab',\n type: 'name',\n transform: (token) => {\n return token.path.join('-').replace(/_/g, '-').toLowerCase();\n },\n};\n","/**\n * Style Dictionary Transforms\n *\n * Exports all built-in transforms and registration utilities.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/transforms\n */\n\nimport { dimensionRem } from './dimension.js';\nimport { fontWeightUnitless } from './font-weight.js';\nimport { lineHeightUnitless } from './line-height.js';\nimport { nameKebab } from './name.js';\n\nimport type { StyleDictionaryInstance, TransformDefinition } from '../types.js';\n\n/**\n * All built-in transforms\n */\nexport const builtInTransforms: TransformDefinition[] = [\n fontWeightUnitless,\n lineHeightUnitless,\n dimensionRem,\n nameKebab,\n];\n\n/**\n * Register all transforms with Style Dictionary\n *\n * @param sd - Style Dictionary instance\n * @param customTransforms - Additional custom transforms to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerTransforms } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerTransforms(StyleDictionary);\n * ```\n */\nexport function registerTransforms(\n sd: StyleDictionaryInstance,\n customTransforms: TransformDefinition[] = []\n): void {\n const allTransforms = [...builtInTransforms, ...customTransforms];\n\n for (const transform of allTransforms) {\n sd.registerTransform({\n name: transform.name,\n type: transform.type,\n filter: transform.filter,\n transform: transform.transform,\n });\n }\n}\n\n// Re-export individual transforms\nexport { fontWeightUnitless } from './font-weight.js';\nexport { lineHeightUnitless } from './line-height.js';\nexport { dimensionRem } from './dimension.js';\nexport { nameKebab } from './name.js';\n","/**\n * Style Dictionary Configuration Generator\n *\n * Creates Style Dictionary configuration from DSAi config.\n *\n * @packageDocumentation\n * @module @dsai-io/tools/tokens/style-dictionary/config\n */\n\nimport { registerFormats } from './formats/index.js';\nimport { registerTransformGroups } from './groups/index.js';\nimport { registerPreprocessors } from './preprocessors/index.js';\nimport { registerTransforms } from './transforms/index.js';\n\nimport type {\n CreateSDConfigOptions,\n SDConfig,\n SDPlatformType,\n StyleDictionaryInstance,\n} from './types.js';\nimport type { ResolvedConfig } from '../../config/types.js';\n\n/**\n * Default source patterns for token files\n */\nconst DEFAULT_SOURCE_PATTERNS = [\n 'collections/color/*.json',\n 'collections/typography/*.json',\n 'collections/spacing/*.json',\n 'collections/border/*.json',\n 'collections/shadow/*.json',\n 'collections/layout/*.json',\n];\n\n/**\n * Default platforms to generate\n */\nconst DEFAULT_PLATFORMS: SDPlatformType[] = ['css', 'js', 'ts', 'scss', 'scss-dist', 'json'];\n\n/**\n * Create Style Dictionary configuration from DSAi config\n *\n * Generates a complete Style Dictionary configuration based on\n * the resolved DSAi configuration, with sensible defaults.\n *\n * @param dsaiConfig - Resolved DSAi configuration\n * @param options - Additional options to override defaults\n * @returns Style Dictionary configuration object\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { loadConfig } from '@dsai-io/tools/config';\n * import { createStyleDictionaryConfig, registerAll } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * const { config } = await loadConfig();\n * const sdConfig = createStyleDictionaryConfig(config);\n *\n * registerAll(StyleDictionary);\n *\n * const sd = new StyleDictionary(sdConfig);\n * await sd.buildAllPlatforms();\n * ```\n */\nexport function createStyleDictionaryConfig(\n dsaiConfig: ResolvedConfig,\n options: Partial<CreateSDConfigOptions> = {}\n): SDConfig {\n const {\n source = DEFAULT_SOURCE_PATTERNS,\n prefix = dsaiConfig.tokens.prefix,\n buildPath = dsaiConfig.tokens.outputDir,\n baseFontSize = dsaiConfig.tokens.baseFontSize ?? 16,\n outputReferences = dsaiConfig.tokens.outputReferences ?? true,\n platforms = DEFAULT_PLATFORMS,\n verbose = dsaiConfig.global.debug ?? false,\n } = options;\n\n const config: SDConfig = {\n log: {\n verbosity: verbose ? 'verbose' : 'default',\n warnings: 'warn',\n errors: 'error',\n },\n preprocessors: ['fix-references'],\n source,\n platforms: {},\n };\n\n // Ensure buildPath ends with /\n const normalizedBuildPath = buildPath.endsWith('/') ? buildPath : `${buildPath}/`;\n\n const platformConfigs = config.platforms ?? {};\n\n // CSS Platform\n if (platforms.includes('css')) {\n platformConfigs['css'] = {\n transformGroup: 'custom/css',\n buildPath: `${normalizedBuildPath}css/`,\n files: [\n {\n destination: 'variables.css',\n format: 'css/variables-with-comments',\n options: {\n prefix,\n outputReferences,\n },\n },\n ],\n };\n }\n\n // JavaScript Platform\n if (platforms.includes('js')) {\n platformConfigs['js'] = {\n transformGroup: 'custom/js',\n buildPath: `${normalizedBuildPath}js/`,\n files: [\n {\n destination: 'tokens.js',\n format: 'javascript/es6',\n options: { outputReferences },\n },\n {\n destination: 'tokens.cjs',\n format: 'javascript/module',\n options: { outputReferences },\n },\n ],\n };\n }\n\n // TypeScript Platform\n if (platforms.includes('ts')) {\n platformConfigs['ts'] = {\n transformGroup: 'custom/js',\n buildPath: `${normalizedBuildPath}ts/`,\n files: [\n {\n destination: 'tokens.ts',\n format: 'javascript/es6',\n options: { outputReferences },\n },\n {\n destination: 'tokens.d.ts',\n format: 'typescript/declarations',\n },\n ],\n };\n }\n\n // SCSS Platform (source - for Bootstrap & DSAi builds)\n if (platforms.includes('scss')) {\n platformConfigs['scss'] = {\n transformGroup: 'custom/scss',\n buildPath: 'src/scss/',\n files: [\n {\n destination: '_variables.scss',\n format: 'scss/variables',\n options: {\n outputReferences,\n basePxFontSize: baseFontSize,\n },\n },\n ],\n };\n }\n\n // SCSS Platform (dist - for npm package consumers)\n if (platforms.includes('scss-dist')) {\n platformConfigs['scss-dist'] = {\n transformGroup: 'custom/scss',\n buildPath: `${normalizedBuildPath}scss/`,\n files: [\n {\n destination: '_variables.scss',\n format: 'scss/variables',\n options: {\n outputReferences,\n basePxFontSize: baseFontSize,\n },\n },\n ],\n };\n }\n\n // JSON Platform (for documentation)\n if (platforms.includes('json')) {\n platformConfigs['json'] = {\n transformGroup: 'js',\n buildPath: `${normalizedBuildPath}json/`,\n files: [\n { destination: 'tokens.json', format: 'json/flat' },\n { destination: 'tokens-nested.json', format: 'json/nested' },\n ],\n };\n }\n\n config.platforms = platformConfigs;\n return config;\n}\n\n/**\n * Register all custom transforms, formats, preprocessors, and groups\n *\n * Must be called before creating a Style Dictionary instance with\n * a config generated by createStyleDictionaryConfig.\n *\n * @param sd - Style Dictionary instance (the imported module)\n * @param options - Custom extensions to register\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { registerAll } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * registerAll(StyleDictionary, {\n * customTransforms: [myCustomTransform],\n * customFormats: [myCustomFormat],\n * });\n * ```\n */\nexport function registerAll(\n sd: StyleDictionaryInstance,\n options: Partial<CreateSDConfigOptions> = {}\n): void {\n const { customTransforms = [], customFormats = [], customPreprocessors = [] } = options;\n\n // Order matters: transforms first, then groups (which reference transforms)\n registerTransforms(sd, customTransforms);\n registerTransformGroups(sd);\n registerFormats(sd, customFormats);\n registerPreprocessors(sd, customPreprocessors);\n}\n\n/**\n * Create and register a complete Style Dictionary setup\n *\n * Convenience function that combines registerAll and createStyleDictionaryConfig.\n *\n * @param sd - Style Dictionary instance\n * @param dsaiConfig - Resolved DSAi configuration\n * @param options - Additional options\n * @returns Style Dictionary configuration\n *\n * @example\n * ```typescript\n * import StyleDictionary from 'style-dictionary';\n * import { loadConfig } from '@dsai-io/tools/config';\n * import { setupStyleDictionary } from '@dsai-io/tools/tokens/style-dictionary';\n *\n * const { config } = await loadConfig();\n * const sdConfig = setupStyleDictionary(StyleDictionary, config);\n *\n * const sd = new StyleDictionary(sdConfig);\n * await sd.buildAllPlatforms();\n * ```\n */\nexport function setupStyleDictionary(\n sd: StyleDictionaryInstance,\n dsaiConfig: ResolvedConfig,\n options: Partial<CreateSDConfigOptions> = {}\n): SDConfig {\n registerAll(sd, options);\n return createStyleDictionaryConfig(dsaiConfig, options);\n}\n","/* eslint-disable security/detect-non-literal-fs-filename */\n/**\n * SVG file scanner\n *\n * Scans directories for SVG files and reads their contents.\n *\n * @packageDocumentation\n */\n\nimport { readFileSync, statSync } from 'node:fs';\nimport { basename } from 'node:path';\n\nimport type { RawSVGData, ScannerOptions } from '../types.js';\n\n/**\n * Scan directory for SVG files\n *\n * Uses fast-glob to find SVG files matching the specified patterns.\n *\n * @param options - Scanner options\n * @returns Array of raw SVG data\n *\n * @example\n * ```typescript\n * const files = await scanSVGFiles({\n * sourceDir: './icons',\n * include: ['**\\/*.svg'],\n * exclude: ['**\\/node_modules\\/**'],\n * });\n * ```\n */\nexport async function scanSVGFiles(options: ScannerOptions): Promise<RawSVGData[]> {\n const {\n sourceDir,\n include = ['**/*.svg'],\n exclude = ['**/node_modules/**', '**/dist/**'],\n } = options;\n\n // Dynamic import of fast-glob (ESM module)\n const { default: fg } = await import('fast-glob');\n\n // Find all SVG files\n const files = await fg(include, {\n cwd: sourceDir,\n ignore: exclude,\n absolute: true,\n onlyFiles: true,\n });\n\n // Read each file\n const svgFiles: RawSVGData[] = [];\n\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const stats = statSync(filePath);\n\n // Extract file name without extension\n const fileName = basename(filePath).replace(/\\.svg$/i, '');\n\n svgFiles.push({\n filePath,\n fileName,\n content,\n originalSize: stats.size,\n });\n } catch {\n console.warn(`Warning: Failed to read ${filePath}`);\n }\n }\n\n // Sort by name for consistent output\n svgFiles.sort((a, b) => a.fileName.localeCompare(b.fileName));\n\n return svgFiles;\n}\n\n/**\n * Read a single SVG file\n *\n * @param filePath - Path to SVG file\n * @returns Raw SVG data or null if failed\n */\nexport function readSVGFile(filePath: string): RawSVGData | null {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const stats = statSync(filePath);\n const fileName = basename(filePath).replace(/\\.svg$/i, '');\n\n return {\n filePath,\n fileName,\n content,\n originalSize: stats.size,\n };\n } catch {\n return null;\n }\n}\n","/**\n * Icon naming utilities\n *\n * @packageDocumentation\n */\n\n/**\n * Convert string to PascalCase component name\n *\n * @param input - Input string (e.g., file name)\n * @returns PascalCase component name\n *\n * @example\n * ```typescript\n * toComponentName('arrow-left') // 'ArrowLeft'\n * toComponentName('24px-icon') // 'Icon24px'\n * toComponentName('my_icon') // 'MyIcon'\n * toComponentName('chevron-down-small') // 'ChevronDownSmall'\n * ```\n */\nexport function toComponentName(input: string): string {\n // Handle numbers at start by prefixing with 'Icon'\n let processed = input;\n if (/^\\d/.test(processed)) {\n processed = `icon-${processed}`;\n }\n\n return (\n processed\n // Split on non-alphanumeric characters\n .split(/[^a-zA-Z0-9]+/)\n // Filter empty strings\n .filter((word) => word.length > 0)\n // Capitalize each word\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n // Join into single string\n .join('')\n );\n}\n\n/**\n * Convert string to kebab-case icon name\n *\n * @param input - Input string (e.g., component name)\n * @returns kebab-case icon name\n *\n * @example\n * ```typescript\n * toIconName('ArrowLeft') // 'arrow-left'\n * toIconName('ChevronDownSmall') // 'chevron-down-small'\n * toIconName('Icon24px') // 'icon-24px'\n * ```\n */\nexport function toIconName(input: string): string {\n return (\n input\n // Insert hyphen before uppercase letters\n .replace(/([A-Z])/g, '-$1')\n // Insert hyphen before number sequences\n .replace(/(\\d+)/g, '-$1')\n // Clean up multiple hyphens\n .replace(/-+/g, '-')\n // Remove leading hyphen\n .replace(/^-/, '')\n // Lowercase\n .toLowerCase()\n );\n}\n\n/**\n * Validate icon name\n *\n * @param name - Icon name to validate\n * @returns True if valid, false otherwise\n */\nexport function isValidIconName(name: string): boolean {\n // Must be non-empty\n if (!name || name.length === 0) {\n return false;\n }\n\n // Must be valid identifier-like (alphanumeric, hyphens, underscores)\n if (!/^[a-zA-Z0-9_-]+$/.test(name)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Normalize icon name from file name\n *\n * @param fileName - File name (without extension)\n * @returns Normalized icon name\n */\nexport function normalizeIconName(fileName: string): string {\n return fileName\n .replace(/[^a-zA-Z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n}\n","/**\n * SVG parser\n *\n * Parses SVG content into structured data.\n *\n * @packageDocumentation\n */\n\nimport { normalizeIconName, toComponentName } from '../utils/naming.js';\n\nimport type { ParsedSVG, RawSVGData } from '../types.js';\n\n/**\n * Parse raw SVG data into structured format\n *\n * Extracts viewBox, attributes, inner content, and accessibility info.\n *\n * @param raw - Raw SVG data\n * @returns Parsed SVG data\n */\nexport function parseSVG(raw: RawSVGData): ParsedSVG {\n const { content, fileName } = raw;\n\n // Extract SVG opening tag attributes\n const svgMatch = content.match(/<svg([^>]*)>/i);\n const svgAttributes = svgMatch?.[1] ?? '';\n\n // Parse attributes into object\n const attributes: Record<string, string> = {};\n const attrRegex = /([a-zA-Z][a-zA-Z0-9-]*)=[\"']([^\"']*)[\"']/g;\n\n for (const attrMatch of svgAttributes.matchAll(attrRegex)) {\n const key = attrMatch[1];\n const value = attrMatch[2];\n if (key && value !== undefined) {\n Object.assign(attributes, { [key]: value });\n }\n }\n\n // Extract viewBox (or construct from width/height)\n let viewBox = attributes['viewBox'] ?? '';\n if (!viewBox) {\n const width = attributes['width']?.replace(/[^\\d.]/g, '') ?? '24';\n const height = attributes['height']?.replace(/[^\\d.]/g, '') ?? '24';\n viewBox = `0 0 ${width} ${height}`;\n }\n\n // Extract inner content (everything between <svg> and </svg>)\n const innerContentMatch = content.match(/<svg[^>]*>([\\s\\S]*?)<\\/svg>/i);\n const innerContent = innerContentMatch?.[1]?.trim() ?? '';\n\n // Extract title for accessibility\n const titleMatch = content.match(/<title>([^<]*)<\\/title>/i);\n const title = titleMatch?.[1];\n\n // Extract description for accessibility\n const descMatch = content.match(/<desc>([^<]*)<\\/desc>/i);\n const description = descMatch?.[1];\n\n // Generate normalized name and component name\n const name = normalizeIconName(fileName);\n const componentName = toComponentName(fileName);\n\n return {\n name,\n componentName,\n fileName,\n viewBox,\n width: attributes['width'],\n height: attributes['height'],\n innerContent,\n fullContent: content,\n attributes,\n title,\n description,\n };\n}\n\n/**\n * Parse multiple SVG files\n *\n * @param rawFiles - Array of raw SVG data\n * @returns Array of parsed SVG data\n */\nexport function parseSVGFiles(rawFiles: RawSVGData[]): ParsedSVG[] {\n return rawFiles.map(parseSVG);\n}\n\n/**\n * Clean SVG content for React compatibility\n *\n * Converts kebab-case attributes to camelCase for JSX.\n *\n * @param svg - SVG content string\n * @returns Cleaned SVG content\n */\nexport function cleanSVGForReact(svg: string): string {\n return (\n svg\n // Convert kebab-case attributes to camelCase for React\n .replace(\n /(stroke|fill|line|clip|stop|color|font|text|letter|word|alignment|dominant|glyph|horiz|overline|paint|pointer|shape|strikethrough|underline|unicode|units|vert|writing)-([a-z])/g,\n (_, p1, p2) => p1 + p2.toUpperCase()\n )\n // Convert specific attributes\n .replace(/class=\"/g, 'className=\"')\n .replace(/xlink:href/g, 'xlinkHref')\n .replace(/xmlns:xlink/g, 'xmlnsXlink')\n // Use currentColor for strokes and fills (inherits from CSS)\n .replace(/stroke=\"#[^\"]+\"/g, 'stroke=\"currentColor\"')\n .replace(/fill=\"#[^\"]+\"/g, 'fill=\"currentColor\"')\n // Handle fill=\"none\" (keep as-is, common for stroke-only icons)\n .replace(/fill=\"currentColor\"([^>]*stroke)/g, 'fill=\"none\"$1')\n );\n}\n\n/**\n * Extract viewBox from SVG string\n *\n * @param svg - SVG content string\n * @returns ViewBox string or default\n */\nexport function extractViewBox(svg: string): string {\n const match = svg.match(/viewBox=\"([^\"]+)\"/);\n return match?.[1] ?? '0 0 24 24';\n}\n","/**\n * Core icon processing exports\n *\n * @packageDocumentation\n */\n\nexport { readSVGFile, scanSVGFiles } from './scanner.js';\nexport { cleanSVGForReact, extractViewBox, parseSVG, parseSVGFiles } from './parser.js';\nexport {\n defaultSVGOConfig,\n optimizeSVG,\n optimizeSVGFiles,\n skipOptimization,\n} from './optimizer.js';\n","/* eslint-disable security/detect-non-literal-fs-filename */\n/**\n * React component generator\n *\n * Generates React icon components from optimized SVG data.\n *\n * @packageDocumentation\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { cleanSVGForReact } from '../core/parser.js';\n\nimport type {\n GeneratedIcon,\n GeneratorOptions,\n IconTemplate,\n IndexTemplate,\n OptimizedSVG,\n TypesTemplate,\n} from '../types.js';\n\n/**\n * Default React icon template\n *\n * Generates a forwardRef component with size, title, and aria support.\n */\nexport const defaultReactTemplate: IconTemplate = (icon) => {\n const cleanedContent = cleanSVGForReact(icon.innerContent);\n\n return `/**\n * ${icon.componentName} icon\n *\n * @generated by @dsai-io/tools\n */\n\nimport * as React from 'react';\n\nimport type { SVGProps } from 'react';\n\nexport interface ${icon.componentName}Props extends SVGProps<SVGSVGElement> {\n /** Icon size */\n size?: number | string;\n /** Icon title for accessibility */\n title?: string;\n}\n\nexport const ${icon.componentName} = React.forwardRef<SVGSVGElement, ${icon.componentName}Props>(\n ({ size = 24, title${icon.title ? ` = \"${icon.title}\"` : ''}, ...props }, ref) => (\n <svg\n ref={ref}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"${icon.viewBox}\"\n width={size}\n height={size}\n fill=\"currentColor\"\n role={title ? 'img' : 'presentation'}\n aria-label={title}\n {...props}\n >\n {title && <title>{title}</title>}\n ${cleanedContent}\n </svg>\n )\n);\n\n${icon.componentName}.displayName = '${icon.componentName}';\n\nexport default ${icon.componentName};\n`;\n};\n\n/**\n * Default React index template\n *\n * Exports all icon components from a single entry point.\n */\nexport const defaultReactIndexTemplate: IndexTemplate = (icons) => `/**\n * Icon exports\n *\n * @generated by @dsai-io/tools\n */\n\n${icons.map((icon) => `export { ${icon.componentName} } from './${icon.componentName}.js';`).join('\\n')}\n\n// Re-export types\nexport type { SVGProps } from 'react';\n`;\n\n/**\n * Default React types template\n *\n * Generates TypeScript types for all icons.\n */\nexport const defaultReactTypesTemplate: TypesTemplate = (icons) => `/**\n * Icon types\n *\n * @generated by @dsai-io/tools\n */\n\nimport type { ForwardRefExoticComponent, RefAttributes, SVGProps } from 'react';\n\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n size?: number | string;\n title?: string;\n}\n\nexport type IconComponent = ForwardRefExoticComponent<\n IconProps & RefAttributes<SVGSVGElement>\n>;\n\n/**\n * Available icon names\n */\nexport type IconName =\n${icons.map((icon) => ` | '${icon.name}'`).join('\\n')};\n\n/**\n * Icon component map\n */\nexport interface IconMap {\n${icons.map((icon) => ` '${icon.name}': IconComponent;`).join('\\n')}\n}\n\n/**\n * Icon metadata\n */\nexport interface IconMeta {\n name: IconName;\n componentName: string;\n viewBox: string;\n}\n\nexport const iconMeta: IconMeta[] = [\n${icons.map((icon) => ` { name: '${icon.name}', componentName: '${icon.componentName}', viewBox: '${icon.viewBox}' },`).join('\\n')}\n];\n`;\n\n/**\n * Generate React icon components\n *\n * @param icons - Optimized SVG data\n * @param outputDir - Output directory\n * @param options - Generator options\n * @returns Generated icons\n *\n * @example\n * ```typescript\n * const generated = await generateReactIcons(optimizedIcons, './dist/icons/react', {\n * dryRun: false,\n * });\n * console.log(\\`Generated \\${generated.length} files\\`);\n * ```\n */\nexport async function generateReactIcons(\n icons: OptimizedSVG[],\n outputDir: string,\n options: GeneratorOptions = {}\n): Promise<GeneratedIcon[]> {\n const {\n template = defaultReactTemplate,\n indexTemplate = defaultReactIndexTemplate,\n typesTemplate = defaultReactTypesTemplate,\n dryRun = false,\n } = options;\n\n const generated: GeneratedIcon[] = [];\n\n // Ensure output directory exists\n if (!dryRun && !existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate individual icon components\n for (const icon of icons) {\n const code = template(icon);\n const outputPath = join(outputDir, `${icon.componentName}.tsx`);\n\n if (!dryRun) {\n writeFileSync(outputPath, code, 'utf-8');\n }\n\n generated.push({\n name: icon.name,\n componentName: icon.componentName,\n code,\n outputPath,\n format: 'react',\n });\n }\n\n // Generate index file\n const indexCode = indexTemplate(icons);\n const indexPath = join(outputDir, 'index.ts');\n\n if (!dryRun) {\n writeFileSync(indexPath, indexCode, 'utf-8');\n }\n\n generated.push({\n name: 'index',\n componentName: 'index',\n code: indexCode,\n outputPath: indexPath,\n format: 'react',\n });\n\n // Generate types file\n const typesCode = typesTemplate(icons);\n const typesPath = join(outputDir, 'types.ts');\n\n if (!dryRun) {\n writeFileSync(typesPath, typesCode, 'utf-8');\n }\n\n generated.push({\n name: 'types',\n componentName: 'types',\n code: typesCode,\n outputPath: typesPath,\n format: 'react',\n });\n\n return generated;\n}\n","/* eslint-disable security/detect-non-literal-fs-filename */\n/**\n * SVG sprite generator\n *\n * Generates SVG sprite files with symbol definitions.\n *\n * @packageDocumentation\n */\n\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { GeneratedIcon, OptimizedSVG } from '../types.js';\n\n/**\n * SVG sprite generator options\n */\nexport interface SpriteOptions {\n /** Sprite file name */\n fileName?: string;\n\n /** Generate preview HTML file */\n generatePreview?: boolean;\n\n /** Dry run - don't write files */\n dryRun?: boolean;\n}\n\n/**\n * Generate SVG sprite\n *\n * Creates an SVG sprite with symbol definitions for all icons.\n *\n * @param icons - Optimized SVG data\n * @param outputDir - Output directory\n * @param options - Generator options\n * @returns Generated files\n *\n * @example\n * ```typescript\n * const generated = await generateSVGSprite(optimizedIcons, './dist/icons/sprite', {\n * fileName: 'icons.svg',\n * generatePreview: true,\n * });\n * ```\n */\nexport async function generateSVGSprite(\n icons: OptimizedSVG[],\n outputDir: string,\n options: SpriteOptions = {}\n): Promise<GeneratedIcon[]> {\n const { fileName = 'sprite.svg', generatePreview = true, dryRun = false } = options;\n\n const generated: GeneratedIcon[] = [];\n\n // Ensure output directory exists\n if (!dryRun && !existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n // Generate sprite symbols\n const symbols = icons\n .map(\n (icon) => ` <symbol id=\"${icon.name}\" viewBox=\"${icon.viewBox}\">\n ${icon.innerContent}\n </symbol>`\n )\n .join('\\n');\n\n // Create sprite SVG\n const spriteCode = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n SVG Sprite\n @generated by @dsai-io/tools\n Contains ${icons.length} icons\n-->\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <defs>\n${symbols}\n </defs>\n</svg>\n`;\n\n const outputPath = join(outputDir, fileName);\n\n if (!dryRun) {\n writeFileSync(outputPath, spriteCode, 'utf-8');\n }\n\n generated.push({\n name: 'sprite',\n componentName: 'sprite',\n code: spriteCode,\n outputPath,\n format: 'svg-sprite',\n });\n\n // Generate usage helper HTML\n if (generatePreview) {\n const usageCode = generatePreviewHTML(icons, fileName);\n const usagePath = join(outputDir, 'sprite-preview.html');\n\n if (!dryRun) {\n writeFileSync(usagePath, usageCode, 'utf-8');\n }\n\n generated.push({\n name: 'preview',\n componentName: 'preview',\n code: usageCode,\n outputPath: usagePath,\n format: 'svg-sprite',\n });\n }\n\n return generated;\n}\n\n/**\n * Generate preview HTML for sprite\n */\nfunction generatePreviewHTML(icons: OptimizedSVG[], spriteFileName: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Icon Sprite Preview</title>\n <style>\n * { box-sizing: border-box; }\n body { font-family: system-ui, sans-serif; padding: 2rem; max-width: 1200px; margin: 0 auto; }\n h1 { margin-bottom: 0.5rem; }\n .meta { color: #666; margin-bottom: 2rem; }\n .icon { width: 24px; height: 24px; fill: currentColor; }\n .icon-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); gap: 1rem; }\n .icon-item { display: flex; flex-direction: column; align-items: center; gap: 0.5rem; padding: 1rem; border: 1px solid #eee; border-radius: 8px; transition: background 0.2s; }\n .icon-item:hover { background: #f5f5f5; }\n .icon-name { font-size: 11px; color: #666; text-align: center; word-break: break-all; }\n pre { background: #f5f5f5; padding: 1rem; border-radius: 8px; overflow-x: auto; }\n code { font-family: ui-monospace, monospace; font-size: 13px; }\n </style>\n</head>\n<body>\n <h1>Icon Sprite Preview</h1>\n <p class=\"meta\">${icons.length} icons • Generated by @dsai-io/tools</p>\n\n <h2>Usage</h2>\n <pre><code>&lt;svg class=\"icon\"&gt;\n &lt;use href=\"${spriteFileName}#icon-name\"&gt;&lt;/use&gt;\n&lt;/svg&gt;</code></pre>\n\n <h2>All Icons</h2>\n <div class=\"icon-grid\">\n${icons\n .map(\n (icon) => ` <div class=\"icon-item\">\n <svg class=\"icon\"><use href=\"${spriteFileName}#${icon.name}\"></use></svg>\n <span class=\"icon-name\">${icon.name}</span>\n </div>`\n )\n .join('\\n')}\n </div>\n</body>\n</html>\n`;\n}\n","/**\n * Icon tooling module for @dsai-io/tools\n *\n * Provides utilities for generating icon components from SVG source files.\n * Supports React components, SVG sprites, with SVGO optimization.\n *\n * @packageDocumentation\n */\n\nimport { join } from 'node:path';\n\nimport { optimizeSVGFiles, parseSVGFiles, scanSVGFiles } from './core/index.js';\nimport { generateReactIcons } from './generators/react.js';\nimport { generateSVGSprite } from './generators/svg-sprite.js';\n\nimport type {\n GeneratedIcon,\n IconBuildOptions,\n IconBuildResult,\n IconFormat,\n OptimizedSVG,\n SVGOConfig,\n} from './types.js';\nimport type { ResolvedConfig } from '../config/types.js';\n\n/**\n * Build icons from SVG source files\n *\n * Scans the source directory, parses and optimizes SVGs, then generates\n * output in the specified formats (React, SVG sprite).\n *\n * @param config - Resolved DSAi configuration\n * @param options - Build options\n * @returns Build result with generated files\n *\n * @example\n * ```typescript\n * import { loadConfig } from '@dsai-io/tools/config';\n * import { buildIcons } from '@dsai-io/tools/icons';\n *\n * const { config } = await loadConfig();\n * const result = await buildIcons(config, {\n * formats: ['react', 'svg-sprite'],\n * });\n *\n * console.log(\\`Generated \\${result.totalIcons} icons\\`);\n * ```\n */\nexport async function buildIcons(\n config: ResolvedConfig,\n options: IconBuildOptions = {}\n): Promise<IconBuildResult> {\n const startTime = Date.now();\n const defaultFormat = config.icons.framework === 'react' ? 'react' : 'svg-sprite';\n const { formats = [defaultFormat as IconFormat], icons: iconFilter, dryRun = false } = options;\n\n const result: IconBuildResult = {\n success: false,\n icons: [],\n totalIcons: 0,\n filesWritten: 0,\n totalSizeReduction: 0,\n errors: [],\n warnings: [],\n duration: 0,\n };\n\n try {\n // Step 1: Scan for SVG files\n const rawFiles = await scanSVGFiles({\n sourceDir: config.icons.sourceDir,\n });\n\n if (rawFiles.length === 0) {\n result.warnings.push({\n icon: '*',\n message: `No SVG files found in ${config.icons.sourceDir}`,\n });\n result.success = true;\n result.duration = Date.now() - startTime;\n return result;\n }\n\n // Filter by specific icons if provided\n const filteredFiles = iconFilter\n ? rawFiles.filter((f) => iconFilter.includes(f.fileName))\n : rawFiles;\n\n // Step 2: Parse SVG content\n const parsedFiles = parseSVGFiles(filteredFiles);\n\n // Step 3: Optimize SVGs (if enabled)\n let optimizedFiles: OptimizedSVG[];\n if (config.icons.optimize) {\n const svgoConfig: SVGOConfig = {\n multipass: true,\n };\n optimizedFiles = await optimizeSVGFiles(parsedFiles, filteredFiles, svgoConfig);\n\n // Calculate total size reduction\n const totalReduction = optimizedFiles.reduce((sum, f) => sum + f.sizeReduction, 0);\n result.totalSizeReduction =\n optimizedFiles.length > 0 ? totalReduction / optimizedFiles.length : 0;\n } else {\n // Skip optimization - just add size metadata\n const { skipOptimization } = await import('./core/optimizer.js');\n optimizedFiles = parsedFiles.map((parsed, index) => {\n const rawFile = filteredFiles[index];\n if (!rawFile) {\n throw new Error(`Missing raw file for ${parsed.fileName}`);\n }\n return skipOptimization(parsed, rawFile);\n });\n }\n\n result.totalIcons = optimizedFiles.length;\n\n // Step 4: Generate output for each format\n const generated: GeneratedIcon[] = [];\n\n for (const format of formats) {\n const outputDir = join(config.icons.outputDir, format);\n\n switch (format) {\n case 'react':\n generated.push(...(await generateReactIcons(optimizedFiles, outputDir, { dryRun })));\n break;\n\n case 'svg':\n case 'svg-sprite':\n generated.push(...(await generateSVGSprite(optimizedFiles, outputDir, { dryRun })));\n break;\n\n default:\n result.warnings.push({\n icon: '*',\n message: `Unknown format: ${format}`,\n });\n }\n }\n\n result.icons = generated;\n result.filesWritten = dryRun ? 0 : generated.length;\n result.success = true;\n } catch (error) {\n result.errors.push({\n icon: '*',\n message: error instanceof Error ? error.message : 'Unknown error',\n code: 'BUILD_ERROR',\n });\n }\n\n result.duration = Date.now() - startTime;\n return result;\n}\n\n// Re-export types\nexport type {\n GeneratedIcon,\n GeneratorOptions,\n IconBuildOptions,\n IconBuildResult,\n IconError,\n IconErrorCode,\n IconFormat,\n IconTemplate,\n IconWarning,\n IndexTemplate,\n OptimizedSVG,\n ParsedSVG,\n RawSVGData,\n ScannerOptions,\n SVGOConfig,\n SVGOPlugin,\n TypesTemplate,\n} from './types.js';\n\n// Re-export core utilities\nexport {\n cleanSVGForReact,\n defaultSVGOConfig,\n extractViewBox,\n optimizeSVG,\n optimizeSVGFiles,\n parseSVG,\n parseSVGFiles,\n readSVGFile,\n scanSVGFiles,\n skipOptimization,\n} from './core/index.js';\n\n// Re-export generators\nexport {\n defaultReactIndexTemplate,\n defaultReactTemplate,\n defaultReactTypesTemplate,\n generateReactIcons,\n generateSVGSprite,\n} from './generators/index.js';\n\n// Re-export naming utilities\nexport {\n isValidIconName,\n normalizeIconName,\n toComponentName,\n toIconName,\n} from './utils/index.js';\n","/**\n * Utility functions for @dsai-io/tools\n *\n * Common utilities used across the tools package.\n */\n\nimport { existsSync, statSync } from 'node:fs';\nimport { dirname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport pc from 'picocolors';\n\n/**\n * Get the root directory of the @dsai-io/tools package\n *\n * @returns Absolute path to package root\n */\nexport function getPackageRoot(): string {\n const currentFile = fileURLToPath(import.meta.url);\n return resolve(dirname(currentFile), '..');\n}\n\n/**\n * Resolve a path relative to the current working directory\n *\n * @param segments - Path segments to join\n * @returns Absolute path\n */\nexport function resolvePath(...segments: string[]): string {\n return resolve(process.cwd(), ...segments);\n}\n\n/**\n * Check if a file or directory exists\n *\n * @param path - Path to check\n * @returns True if the path exists\n */\nexport function fileExists(targetPath: string): boolean {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n return existsSync(targetPath);\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a path is a directory\n *\n * @param path - Path to check\n * @returns True if the path is a directory\n */\nexport function isDirectory(targetPath: string): boolean {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (!existsSync(targetPath)) {\n return false;\n }\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n return statSync(targetPath).isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a path is a file\n *\n * @param path - Path to check\n * @returns True if the path is a file\n */\nexport function isFile(targetPath: string): boolean {\n try {\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (!existsSync(targetPath)) {\n return false;\n }\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n return statSync(targetPath).isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Find package.json by traversing up from a starting directory\n *\n * @param startFrom - Directory to start searching from\n * @returns Path to package.json or null if not found\n */\nexport function findPackageJson(startFrom: string = process.cwd()): string | null {\n let current = resolve(startFrom);\n const root = dirname(current);\n\n while (current !== root) {\n const packagePath = join(current, 'package.json');\n // eslint-disable-next-line security/detect-non-literal-fs-filename\n if (existsSync(packagePath)) {\n return packagePath;\n }\n current = dirname(current);\n }\n\n return null;\n}\n\n/**\n * Logger utility with colored output\n */\nexport const logger = {\n /**\n * Log an info message\n */\n info(message: string): void {\n // eslint-disable-next-line no-console\n console.info(pc.blue('ℹ'), message);\n },\n\n /**\n * Log a success message\n */\n success(message: string): void {\n // eslint-disable-next-line no-console\n console.info(pc.green('✔'), message);\n },\n\n /**\n * Log a warning message\n */\n warn(message: string): void {\n console.warn(pc.yellow('⚠'), message);\n },\n\n /**\n * Log an error message\n */\n error(message: string): void {\n console.error(pc.red('✖'), message);\n },\n\n /**\n * Log a debug message (only in verbose mode)\n */\n debug(message: string, verbose = false): void {\n if (verbose) {\n // eslint-disable-next-line no-console\n console.debug(pc.gray('⋯'), message);\n }\n },\n};\n\n/**\n * Format milliseconds to human-readable duration\n *\n * @param ms - Duration in milliseconds\n * @returns Formatted duration string\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n if (ms < 60000) {\n return `${(ms / 1000).toFixed(2)}s`;\n }\n const minutes = Math.floor(ms / 60000);\n const seconds = ((ms % 60000) / 1000).toFixed(0);\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * Deep merge two objects\n *\n * @param target - Target object\n * @param source - Source object to merge\n * @returns Merged object\n */\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const output = { ...target };\n const keys = Object.keys(source) as Array<keyof T>;\n\n for (const key of keys) {\n // eslint-disable-next-line security/detect-object-injection -- Safe: iterating over Object.keys\n const sourceValue = source[key];\n // eslint-disable-next-line security/detect-object-injection -- Safe: iterating over Object.keys\n const targetValue = target[key];\n\n if (\n sourceValue &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n // eslint-disable-next-line security/detect-object-injection -- Safe: key from Object.keys\n output[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n // eslint-disable-next-line security/detect-object-injection -- Safe: key from Object.keys\n output[key] = sourceValue as T[keyof T];\n }\n }\n\n return output;\n}\n"]}