{"version":3,"sources":["../src/_index-loader.ts","../src/changelog.ts","../src/versions.ts","../src/get.ts","../src/find.ts","../src/offices.ts","../src/compare.ts","../src/match.ts"],"names":["parquetReadObjects","compressors","LEVELS","nfc","versions"],"mappings":";;;;;;AAMO,IAAM,kBAAA,GACX,qEAAA;AAQF,IAAM,KAAA,uBAAY,GAAA,EAAgC;AAE3C,SAAS,gBAAA,GAAyB;AACvC,EAAA,KAAA,CAAM,KAAA,EAAM;AACd;AAEA,eAAsB,aAAA,CACpB,QAAA,EACA,IAAA,GAAsB,EAAC,EACT;AACd,EAAA,MAAM,IAAA,GAAO,KAAK,OAAA,IAAW,kBAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC9B,EAAA,IAAI,UAAU,OAAO,QAAA;AACrB,EAAA,MAAM,OAAA,GAAU,KAAK,KAAA,IAAS,KAAA;AAC9B,EAAA,MAAM,KAAK,YAAY;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AACtD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mBAAmB,GAAG,CAAA,EAAA,EAAK,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,UAAU,CAAA;AAAA,OACzD;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,WAAA,EAAY;AACrC,IAAA,MAAM,IAAA,GAAQ,MAAMA,4BAAA,CAAmB;AAAA,MACrC,IAAA,EAAM,MAAA;AAAA,mBACNC;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,GAAG;AACH,EAAA,KAAA,CAAM,GAAA,CAAI,KAAK,CAAC,CAAA;AAChB,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,CAAA;AAAA,EACf,SAAS,CAAA,EAAG;AACV,IAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAChB,IAAA,MAAM,CAAA;AAAA,EACR;AACF;;;AC7BA,IAAI,cAAA,GAA2C,IAAA;AAExC,SAAS,kBAAA,GAA2B;AACzC,EAAA,cAAA,GAAiB,IAAA;AACnB;AAGA,eAAsB,aAAA,CACpB,IAAA,GAAsB,EAAC,EACJ;AACnB,EAAA,MAAM,IAAA,GAAO,KAAK,OAAA,IAAW,kBAAA;AAC7B,EAAA,IAAI,gBAAgB,OAAO,cAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,KAAK,KAAA,IAAS,KAAA;AAC9B,EAAA,MAAM,KAAK,YAAY;AACrB,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,CAAA,EAAG,IAAI,kBAAkB,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC1E,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,IAAI,UAAU,CAAA;AAAA,OAC3D;AAAA,IACF;AACA,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB,CAAA,GAAG;AACH,EAAA,cAAA,GAAiB,CAAA;AACjB,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,CAAA;AAAA,EACf,SAAS,CAAA,EAAG;AACV,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,MAAM,CAAA;AAAA,EACR;AACF;AAGA,eAAsB,WAAA,CAAY,IAAA,GAAsB,EAAC,EAAoB;AAC3E,EAAA,MAAM,CAAA,GAAI,MAAM,aAAA,CAAc,IAAI,CAAA;AAClC,EAAA,OAAO,CAAA,CAAE,YAAA;AACX;AAGA,eAAsB,SAAA,CACpB,IAAA,GAAsB,EAAC,EACI;AAC3B,EAAA,MAAM,CAAA,GAAI,MAAM,aAAA,CAAc,IAAI,CAAA;AAClC,EAAA,OAAO,CAAA,CAAE,WAAW,EAAC;AACvB;;;AC/DO,IAAM,QAAA,GAAW;AAAA,EACtB,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY,UAAA;AAAA,EAC5D,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY;AAC1B;AAQA,SAAS,YAAA,CAAa,MAAyB,IAAA,EAAyB;AACtE,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,OAAO,CAAC,GAAG,IAAI,CAAA;AACvC,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,6BAAA,EAAgC,OAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EACnE;AACA,EAAA,MAAM,SAAS,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC3C,EAAA,OAAO,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,MAAM,CAAC,CAAA;AAChD;AAWO,SAAS,SAAS,IAAA,EAAyB;AAChD,EAAA,OAAO,YAAA,CAAa,UAAU,IAAI,CAAA;AACpC;AAYA,eAAsB,aAAA,CACpB,IAAA,EACA,IAAA,GAAsB,EAAC,EACJ;AACnB,EAAA,IAAI,IAAA,GAA0B,QAAA;AAC9B,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,MAAM,aAAA,CAAc,IAAI,CAAA;AAClC,IAAA,IAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,QAAQ,KAAK,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AACtD,MAAA,IAAA,GAAO,CAAA,CAAE,QAAA;AAAA,IACX;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,YAAA,CAAa,MAAM,IAAI,CAAA;AAChC;ACxDA,IAAM,gBAAA,GACJ,mEAAA;AAEF,IAAM,MAAA,GAA2B,CAAC,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAEtD,SAAS,YAAA,CAAa,KAAa,KAAA,EAAoB;AACrD,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAI,SAAA;AAAA,MACR,CAAA,sDAAA,EAAyD,OAAO,GAAG,CAAA,uCAAA;AAAA,KAErE;AAAA,EACF;AACA,EAAA,IAAI,CAAE,QAAA,CAA+B,QAAA,CAAS,GAAG,CAAA,EAAG;AAClD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA,uCAAA;AAAA,KAE7C;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,KAAK,SAAA,CAAU,MAAM,CAAC,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,KAC9E;AAAA,EACF;AACF;AAEA,SAAS,MAAA,CAAO,GAAA,EAAa,KAAA,EAAc,MAAA,EAAiB,OAAA,EAAyB;AACnF,EAAA,OAAO,MAAA,GACH,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,QAAA,CAAA,GAC1B,CAAA,EAAG,OAAO,CAAA,YAAA,EAAe,KAAK,IAAI,GAAG,CAAA,cAAA,CAAA;AAC3C;AAWA,eAAsB,WACpB,GAAA,EACA,KAAA,GAAe,KAAA,EACf,OAAA,GAAsB,EAAC,EACD;AACtB,EAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AACvB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,KAAA;AACjC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AACnC,EAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,IAAS,KAAA;AACjC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,EAAK,KAAA,EAAO,QAAQ,OAAO,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,MAAA,EAAQ,OAAA,CAAQ,QAAQ,CAAA;AAC9D,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,mBAAmB,GAAG,CAAA,EAAA,EAAK,SAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA;AAAA,KACnE;AAAA,EACF;AACA,EAAA,OAAO,SAAS,WAAA,EAAY;AAC9B;AAgBA,eAAsB,IACpB,GAAA,EACA,KAAA,GAAe,KAAA,EACf,OAAA,GAAsB,EAAC,EACQ;AAC/B,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAA,EAAK,OAAO,OAAO,CAAA;AAEnD,EAAA,MAAM,IAAA,GAAO,MAAMD,4BAAAA,CAAmB;AAAA,IACpC,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAAC;AAAA,GACD,CAAA;AAED,EAAA,MAAM,QAAA,GAAyB,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAG/C,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,GAAG,MAAK,GAAI,GAAA;AACpC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MACZ,UAAW,QAAA,IAAY;AAAA,KACzB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,mBAAA;AAAA;AAAA,IAEN,GAAA,EAAK,OAAA,CAAQ,MAAA,GAAS,WAAA,GAAc,WAAA;AAAA,IACpC;AAAA,GACF;AACF;;;AC1EA,IAAMC,OAAAA,GAA2B,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AACtD,IAAM,cAAqC,EAAE,IAAA,EAAM,GAAG,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AACrE,IAAM,aAA2C,EAAE,CAAA,EAAG,MAAM,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAM;AAM/E,IAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAE9C,SAAS,IAAI,CAAA,EAAmB;AAC9B,EAAA,OAAO,CAAA,CAAE,UAAU,KAAK,CAAA;AAC1B;AAMA,SAAS,YAAY,CAAA,EAAoB;AACvC,EAAA,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAC1C;AAGA,SAAS,WAAA,CAAY,GAAA,EAAc,IAAA,EAAc,KAAA,EAAyB;AACxE,EAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC9B,IAAA,MAAM,CAAA,GAAI,IAAI,GAAG,CAAA;AACjB,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAC3B,IAAA,IAAI,QAAQ,CAAA,KAAM,IAAA,GAAO,EAAE,UAAA,CAAW,IAAI,GAAG,OAAO,IAAA;AAAA,EACtD;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,eAAA,GAAwB;AACtC,EAAA,gBAAA,EAAiB;AACnB;AAoBA,eAAsB,IAAA,CACpB,IAAA,EACA,OAAA,GAAuB,EAAC,EACJ;AACpB,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,yBAAA,EAA4B,OAAO,IAAI,CAAA,CAAE,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,GAAQ,KAAA,EAAO,IAAA,EAAM,IAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,MAAA,EAAO,GAAI,OAAA;AAE5E,EAAA,IAAI,UAAU,MAAA,IAAa,CAACA,OAAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAClD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,KAAK,SAAA,CAAUA,OAAM,CAAC,CAAA,mBAAA,EAAsB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,KAC3F;AAAA,EACF;AACA,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,IAAU,OAAO,MAAA,EAAQ;AACtD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,6CAAA,EAAgD,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA;AAAA,KACpE;AAAA,EACF;AACA,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,KAAK,CAAC,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,UAAU,kCAAkC,CAAA;AAAA,IACxD;AACA,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kEAAA,EAAqE,KAAK,MAAM,CAAA;AAAA,OAClF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA,GAAO,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAC3D,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAG/D,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC5B,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,4CAAA,EAA+C,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,OACrE;AAAA,IACF;AACA,IAAA,QAAA,GAAW,IAAA;AAAA,EACb,CAAA,MAAA,IAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,QAAA,GAAW,KAAA;AAAA,EACb,CAAA,MAAO;AACL,IAAA,QAAA,GAAW,YAAY,KAAK,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,cAAA,GAAiB,KAAA,IAAS,IAAA;AAAA,EAC5B,CAAA,MAAO;AACL,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,qEAAA,EAAwE,OAAO,MAAM,CAAA;AAAA,OACvF;AAAA,IACF;AACA,IAAA,MAAM,UAAA,GAAa,OAAO,MAAA,IAAU,CAAA;AACpC,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,cAAA,GAAiB,KAAA,IAAS,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA,IAAK,IAAA;AACvD,IAAA,MAAA,GAAS,MAAM,WAAA,EAAY;AAAA,EAC7B;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAwB,mBAAA,EAAqB;AAAA,IAC9D,OAAA;AAAA,IACA,KAAA,EAAO,OAAA;AAAA,IACP;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,MAAA,IAAU,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,GAAI,IAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,MAAA,KAAW,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAI,CAAA,GAAI,MAAA;AAE/D,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,CAAC,WAAA,CAAY,CAAA,EAAG,KAAA,EAAO,KAAK,GAAG,OAAO,KAAA;AAAA,IAC5C,WAAW,KAAA,EAAO;AAChB,MAAA,IAAI,GAAA,CAAI,EAAE,IAAA,IAAQ,EAAE,EAAE,WAAA,EAAY,KAAM,QAAQ,OAAO,KAAA;AAAA,IACzD,CAAA,MAAO;AACL,MAAA,IAAI,EAAE,CAAA,CAAE,SAAA,IAAa,IAAI,QAAA,CAAS,MAAM,GAAG,OAAO,KAAA;AAAA,IACpD;AACA,IAAA,IAAI,cAAA,KAAmB,IAAA,IAAQ,CAAA,CAAE,KAAA,KAAU,gBAAgB,OAAO,KAAA;AAClE,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,IAAI,MAAA,CAAO,CAAA,CAAE,YAAY,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAC1C,MAAA,IAAI,MAAA,KAAW,MAAM,OAAO,KAAA;AAC5B,MAAA,IAAI,CAAA,GAAI,MAAA,IAAU,CAAA,GAAI,MAAA,EAAQ,OAAO,KAAA;AAAA,IACvC;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,WAAA,EAAa;AACnC,MAAA,OAAO,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAA,GAAc,EAAA,GAAK,CAAA;AAAA,IAC9C;AACA,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA;AAC9B,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,EAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,IAAQ,EAAA;AACrB,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,IAAQ,EAAA;AACrB,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrC,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,OAAA,CAAQ,IAAI,CAAC,EAAE,WAAW,KAAA,EAAO,GAAG,IAAA,EAAK,KAAM,IAAI,CAAA;AAC5D;AAEO,SAAS,aAAa,IAAA,EAA2B;AACtD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,GAAA,CAAI,EAAE,WAAW,CAAA;AACtB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,WAAW,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,UAAU,IAAA,EAAgC;AACxD,EAAA,MAAM,CAAA,GAAI,aAAa,IAAI,CAAA;AAC3B,EAAA,OAAO,EAAE,MAAA,GAAS,CAAA,GAAK,CAAA,CAAE,CAAC,KAAK,IAAA,GAAQ,IAAA;AACzC;AAEO,SAAS,SAAS,IAAA,EAAgC;AACvD,EAAA,MAAM,CAAA,GAAI,aAAa,IAAI,CAAA;AAC3B,EAAA,OAAO,CAAA,CAAE,SAAS,CAAA,GAAK,CAAA,CAAE,EAAE,MAAA,GAAS,CAAC,KAAK,IAAA,GAAQ,IAAA;AACpD;;;AC7LA,IAAM,YAAA,GAAe,kBAAA;AAErB,SAASC,KAAI,CAAA,EAAmB;AAC9B,EAAA,OAAO,CAAA,CAAE,UAAU,KAAK,CAAA;AAC1B;AAcA,eAAsB,WAAA,CACpB,KAAA,EACA,OAAA,GAA8B,EAAC,EACT;AACtB,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,0BAAA,EAA6B,OAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EACjE;AACA,EAAA,MAAM,EAAE,QAAQ,KAAA,EAAO,EAAA,EAAI,SAAS,KAAA,EAAO,OAAA,EAAS,QAAO,GAAI,OAAA;AAC/D,EAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,IAAU,OAAO,MAAA,EAAQ;AACtD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,6CAAA,EAAgD,IAAA,CAAK,SAAA,CAAU,EAAE,CAAC,CAAA;AAAA,KACpE;AAAA,EACF;AAEA,EAAA,MAAM,CAAA,GAAIA,IAAAA,CAAI,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,EAAE,CAAA;AAChE,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAC;AAEhB,EAAA,MAAM,WAAW,EAAA,KAAO,MAAA,GAAY,WAAW,IAAA,CAAK,CAAC,IAAI,EAAA,KAAO,MAAA;AAEhE,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAM,cAA8B,YAAA,EAAc;AAAA,MACvD,OAAA;AAAA,MACA,KAAA,EAAO,OAAA;AAAA,MACP;AAAA,KACD,CAAA;AAAA,EACH,SAAS,CAAA,EAAG;AAEV,IAAA,IAAI,MAAA,EAAQ,SAAS,MAAM,CAAA;AAC3B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,MAAA,GAAS,EAAE,WAAA,EAAY;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM;AACjC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,CAAA,GAAI,EAAE,IAAA,IAAQ,EAAA;AACpB,MAAA,OAAO,KAAA,GAAQ,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA;AAAA,IACzC;AACA,IAAA,IAAI,KAAA,SAAcA,IAAAA,CAAI,CAAA,CAAE,QAAQ,EAAE,CAAA,CAAE,aAAY,KAAM,MAAA;AACtD,IAAA,OAAA,CAAQ,CAAA,CAAE,SAAA,IAAa,EAAA,EAAI,QAAA,CAAS,MAAM,CAAA;AAAA,EAC5C,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,SAAa,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,EAAA,GAAK,CAAA;AACrD,IAAA,OAAA,CAAQ,EAAE,OAAA,IAAW,EAAA,KAAO,CAAA,CAAE,OAAA,IAAW,MAAM,EAAA,GAAK,CAAA;AAAA,EACtD,CAAC,CAAA;AAED,EAAA,OAAO,OAAA,CAAQ,IAAI,CAAC,EAAE,WAAW,KAAA,EAAO,GAAG,IAAA,EAAK,KAAM,IAAI,CAAA;AAC5D;;;ACnDA,SAAS,QAAQ,CAAA,EAA4B;AAC3C,EAAA,OAAO;AAAA,IACL,aAAa,CAAA,CAAE,WAAA;AAAA,IACf,OAAO,CAAA,CAAE,UAAA;AAAA,IACT,OAAO,CAAA,CAAE,IAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,QAAA,EAAU,MAAA,CAAO,CAAA,CAAE,QAAQ;AAAA,GAC7B;AACF;AAEA,SAAS,OAAA,CAAQ,GAAW,CAAA,EAAmB;AAC7C,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,OAAO,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AACpB;AAEA,eAAsB,OAAA,CACpBC,SAAAA,EACA,OAAA,GAA0B,EAAC,EACH;AACxB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,SAAQ,CAAA,IAAKA,SAAAA,CAAS,WAAW,CAAA,EAAG;AACrD,IAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAIA,SAAAA;AACjB,EAAA,IAAI,OAAO,EAAA,KAAO,QAAA,IAAY,OAAO,OAAO,QAAA,EAAU;AACpD,IAAA,MAAM,IAAI,UAAU,gCAAgC,CAAA;AAAA,EACtD;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG;AACxB,IAAA,IAAI,CAAE,QAAA,CAA+B,QAAA,CAAS,CAAC,CAAA,EAAG;AAChD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,KAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7D;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AACvC,EAAA,IAAI,EAAE,SAAA,IAAa,CAAA,IAAK,SAAA,IAAa,CAAA,CAAA,EAAI;AACvC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,SAAS,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACjC,aAAA,CAA2B,2BAA2B,OAAO,CAAA;AAAA,IAC7D,aAAA,CAA4B,8BAA8B,OAAO;AAAA,GAClE,CAAA;AAED,EAAA,MAAM,MAAM,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAgB,EAAE,CAAA;AACjD,EAAA,MAAM,MAAM,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAgB,EAAE,CAAA;AACjD,EAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,EAAE,CAAA,CAAE,CAAA;AAC3E,EAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,EAAE,CAAA,CAAE,CAAA;AAE3E,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,EAAY,CAAC,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,EAAY,CAAC,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,KAAA,MAAW,KAAK,EAAA,EAAI;AAClB,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,CAAE,UAAA,EAAY,EAAE,UAAU,CAAA,EAAG,EAAE,GAAG,CAAA;AAAA,EACxD;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAE3C,EAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,EAAK,EAAG;AAC7B,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AACvB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AACvB,IAAA,IAAI,EAAA,CAAG,QAAA,KAAa,EAAA,CAAG,QAAA,EAAU;AAC/B,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,CAAI,OAAA,CAAQ,GAAG,QAAA,EAAU,EAAA,CAAG,QAAQ,CAAC,CAAA,IAAK,CAAA;AAC9D,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,EAAK,EAAG,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAChE,EAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,EAAK,EAAG,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAEhE,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,QAAA,CAAS,KAAK,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,EAAE,CAAE,CAAC,CAAA;AACrC,IAAA,QAAA,CAAS,KAAK,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,EAAE,CAAE,CAAC,CAAA;AAAA,EACvC;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,IAAA,IAAI,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA,SAAc,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,GAAQ,EAAA,GAAK,CAAA;AACzD,IAAA,OAAO,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAA,GAAc,EAAA,GAAK,CAAA;AAAA,EAC9C,CAAC,CAAA;AAED,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAK,UAAA,EAAY;AAClC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,EAAE,CAAE,CAAA;AAChC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,EAAE,CAAE,CAAA;AAChC,IAAA,CAAA,CAAE,MAAA,GAAS,SAAA;AACX,IAAA,CAAA,CAAE,MAAA,GAAS,SAAA;AACX,IAAA,CAAA,CAAE,GAAA,GAAM,GAAA;AACR,IAAA,CAAA,CAAE,GAAA,GAAM,GAAA;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EACpB;AACA,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,EAAE,CAAE,CAAA;AAChC,IAAA,CAAA,CAAE,MAAA,GAAS,WAAA;AACX,IAAA,CAAA,CAAE,GAAA,GAAM,IAAA;AACR,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACjB;AACA,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACtB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,EAAE,CAAE,CAAA;AAChC,IAAA,CAAA,CAAE,MAAA,GAAS,WAAA;AACX,IAAA,CAAA,CAAE,GAAA,GAAM,IAAA;AACR,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACjB;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAA,CAAQ,CAAA,CAAE,MAAA,IAAU,EAAA,KAAO,CAAA,CAAE,MAAA,IAAU,EAAA,CAAA,GAAM,EAAA,GAAK,CAAA;AAC7E,IAAA,IAAI,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA,SAAc,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,GAAQ,EAAA,GAAK,CAAA;AACzD,IAAA,OAAO,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAA,GAAc,EAAA,GAAK,CAAA;AAAA,EAC9C,CAAC,CAAA;AAED,EAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,WAAW,IAAA,EAAM,QAAA,EAAU,MAAM,QAAA,EAAS;AAC7D;;;ACzFA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AACjC;AAEA,SAAS,iBAAA,CACP,EAAA,EACA,IAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,QAAQ,CAAA;AAAG,IACT,KAAK,CAAA;AACH,MAAA,OAAO,EAAA,CAAG,OAAO,CAAC,CAAA,KAAM,EAAE,WAAA,KAAgB,IAAA,IAAQ,CAAA,CAAE,MAAA,KAAW,MAAM,CAAA;AAAA,IACvE,KAAK,CAAA;AACH,MAAA,OAAO,EAAA,CAAG,OAAO,CAAC,CAAA,KAAM,EAAE,WAAA,KAAgB,IAAA,IAAQ,CAAA,CAAE,KAAA,KAAU,MAAM,CAAA;AAAA,IACtE,KAAK,CAAA;AACH,MAAA,OAAO,EAAA,CAAG,OAAO,CAAC,CAAA,KAAM,EAAE,WAAA,KAAgB,IAAA,IAAQ,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA;AAAA,IACrE,KAAK,EAAA;AACH,MAAA,OAAO,EAAA,CAAG,OAAO,CAAC,CAAA,KAAM,EAAE,WAAA,KAAgB,IAAA,IAAQ,CAAA,CAAE,UAAA,KAAe,MAAM,CAAA;AAAA,IAC3E;AACE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,kDAAkD,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,OAChF;AAAA;AAEN;AAEA,eAAsB,SAAS,IAAA,EAA0C;AACvE,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,SAAA,GAAY,GAAE,GAAI,IAAA;AAEhD,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,MAAM,IAAI,UAAU,qBAAqB,CAAA;AACvE,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,MAAM,IAAI,UAAU,uBAAuB,CAAA;AAC3E,EAAA,IAAI,CAAE,QAAA,CAA+B,QAAA,CAAS,IAAI,CAAA,EAAG;AACnD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,KAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACrE;AACA,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AACxD,EAAA,IAAI,QAAQ,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,2CAA2C,CAAA;AACrF,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,MAAM,IAAI,UAAU,8BAA8B,CAAA;AAC7E,IAAA,IAAI,CAAE,QAAA,CAA+B,QAAA,CAAS,CAAC,CAAA,EAAG;AAChD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACpE;AAAA,EACF;AAEA,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,IACjC,aAAA,CAA8B,2BAA2B,IAAI,CAAA;AAAA,IAC7D,aAAA,CAA4B,8BAA8B,IAAI;AAAA,GAC/D,CAAA;AAED,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,EAAA,EAAI,IAAA,EAAM,MAAM,CAAA;AACnD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,WAAA,CAAY,IAAA,EAAM,MAAA,EAAQ,OAAa,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAK1D,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAe,CAAA,KAAc;AAC/C,IAAA,IAAI,IAAI,SAAA,EAAW;AACnB,IAAA,aAAA,CAAc,IAAI,KAAA,EAAA,CAAQ,aAAA,CAAc,IAAI,KAAK,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EAC9D,CAAA;AACA,EAAA,KAAA,MAAW,KAAK,EAAA,EAAI;AAClB,IAAA,IAAI,UAAA,CAAW,IAAI,CAAA,CAAE,UAAU,GAAG,UAAA,CAAW,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,UAAU,CAAA;AACvE,IAAA,IAAI,UAAA,CAAW,IAAI,CAAA,CAAE,UAAU,GAAG,UAAA,CAAW,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,SAAS,CAAA;AAAA,EACxE;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA8B;AACpD,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAC5C,EAAA,KAAA,MAAW,KAAK,EAAA,EAAI;AAClB,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,WAAW,CAAA;AAC1C,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,CAAC,KAAK,EAAC;AAElC,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAqD;AACvE,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA,EAAG;AAC9B,QAAA,CAAA,GAAI,CAAA;AAAA,MACN,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA;AACxC,QAAA,IAAI,GAAA,KAAQ,QAAW,CAAA,GAAI,GAAA;AAAA,MAC7B;AACA,MAAA,IAAI,MAAM,CAAA,EAAG;AACb,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,UAAU,CAAA;AACvC,MAAA,IAAI,QAAA,WAAmB,MAAA,IAAU,CAAA;AAAA,WAC5B,KAAA,CAAM,IAAI,CAAA,CAAE,UAAA,EAAY,EAAE,GAAA,EAAK,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,IACpD;AACA,IAAA,KAAA,MAAW,EAAE,GAAA,EAAK,MAAA,EAAO,IAAK,KAAA,CAAM,QAAO,EAAG;AAC5C,MAAA,MAAM,OAAA,GAAU,QAAQ,MAAM,CAAA;AAC9B,MAAA,IAAI,UAAU,SAAA,EAAW;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,OAAO,GAAA,CAAI,UAAA;AAAA,QACX,OAAO,GAAA,CAAI,IAAA;AAAA,QACX,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,IAAA,IAAI,CAAA,CAAE,gBAAgB,CAAA,CAAE,WAAA;AACtB,MAAA,OAAO,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAA,GAAc,EAAA,GAAK,CAAA;AAC9C,IAAA,OAAO,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AAAA,EACtB,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAA,EAAK,MAAA;AAAA,IACL,GAAA,EAAK,MAAM,gBAAA,CAAiB,MAAA,EAAQ,OAAO,IAAI,CAAA;AAAA,IAC/C,IAAA,EAAM,MAAM,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,IAAI;AAAA,GACnD;AACF;AAEA,SAAS,WAAA,CACP,IAAA,EACA,MAAA,EACA,OAAA,EACA,IAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAK,EAAC;AAAA,IACN,GAAA,EAAK,YAAY,EAAC;AAAA,IAClB,MAAM,YAAY;AAEhB,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,GACF;AACF;AAYA,eAAe,gBAAA,CACb,GAAA,EACA,KAAA,EACA,IAAA,EACyC;AACzC,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAE9B,EAAA,MAAM,OAAA,GAAU,KAAA,KAAU,KAAA,GAAQ,OAAA,GAAU,QAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,KAAA,KAAU,KAAA,GAAQ,OAAA,GAAU,QAAA;AAW5C,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAiB;AACnC,EAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,IAAA,MAAM,IAAA,GAAO,EAAE,OAAO,CAAA;AACtB,IAAA,IAAI,SAAS,IAAA,EAAM;AACnB,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,CAAA,CAAE,WAAW,IAAI,IAAI,CAAA,CAAA;AACpC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,IAAA;AACxB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,EAAA,IAAM,EAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAI,GAAA,EAAK;AAAA,QACb,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,IAAA;AAAA,QACA,IAAA,EAAO,CAAA,CAAE,OAAO,CAAA,IAAuB,EAAA;AAAA,QACvC,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,UAAU,MAAM,aAAA;AAAA,IACpB,eAAe,KAAK,CAAA,QAAA,CAAA;AAAA,IACpB;AAAA,GACF;AACA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,CAAE,WAAW,IAAI,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,MAAM,MAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AAC9B,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,WAAW,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,EAAA;AAC/D,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,OAAO,CAAA,CAAE,IAAA;AAAA,QACT,OAAO,CAAA,CAAE,IAAA;AAAA,QACT,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAQ,OAAA,CAAQ,CAAA,CAAE,EAAA,GAAK,KAAK;AAAA,OAC7B,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACjB,MAAA,IAAI,CAAA,CAAE,gBAAgB,CAAA,CAAE,WAAA;AACtB,QAAA,OAAO,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAA,GAAc,EAAA,GAAK,CAAA;AAC9C,MAAA,OAAO,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,MAAM,MAAsB,EAAC;AAC7B,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AAC9B,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,WAAW,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,EAAA;AAC/D,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,QAAQ,CAAA,CAAE,IAAA;AAAA,QACV,QAAQ,CAAA,CAAE,IAAA;AAAA,QACV,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAQ,OAAA,CAAQ,CAAA,CAAE,EAAA,GAAK,KAAK;AAAA,OAC7B,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACjB,MAAA,IAAI,CAAA,CAAE,gBAAgB,CAAA,CAAE,WAAA;AACtB,QAAA,OAAO,CAAA,CAAE,WAAA,GAAc,CAAA,CAAE,WAAA,GAAc,EAAA,GAAK,CAAA;AAC9C,MAAA,OAAO,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AAAA,IACtB,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT;AACF","file":"index.cjs","sourcesContent":["import { parquetReadObjects } from \"hyparquet\";\nimport { compressors } from \"hyparquet-compressors\";\n\n// 인덱스 parquet 의 canonical URL. Python lib 과 동일 경로를 공유.\n// 이 URL 은 **영구 stable** — 옮기면 이미 배포된 번들이 전부 깨진다.\n// manifest.json 도 같은 경로에서 받는다 (changelog()).\nexport const DEFAULT_INDEX_BASE =\n  \"https://raw.githubusercontent.com/vuski/admdongkor/master/dist/data\";\n\nexport interface LoaderOptions {\n  baseUrl?: string;\n  fetch?: typeof fetch;\n  signal?: AbortSignal;\n}\n\nconst cache = new Map<string, Promise<unknown[]>>();\n\nexport function clearLoaderCache(): void {\n  cache.clear();\n}\n\nexport async function loadIndexFile<T>(\n  filename: string,\n  opts: LoaderOptions = {},\n): Promise<T[]> {\n  const base = opts.baseUrl ?? DEFAULT_INDEX_BASE;\n  const url = `${base}/${filename}`;\n  const existing = cache.get(url);\n  if (existing) return existing as Promise<T[]>;\n  const fetchFn = opts.fetch ?? fetch;\n  const p = (async () => {\n    const res = await fetchFn(url, { signal: opts.signal });\n    if (!res.ok) {\n      throw new Error(\n        `failed to fetch ${url}: ${res.status} ${res.statusText}`,\n      );\n    }\n    const buffer = await res.arrayBuffer();\n    const rows = (await parquetReadObjects({\n      file: buffer,\n      compressors,\n    })) as T[];\n    return rows;\n  })();\n  cache.set(url, p);\n  try {\n    return await p;\n  } catch (e) {\n    cache.delete(url);\n    throw e;\n  }\n}\n","/** 인덱스 parquet 수정 이력 + 현재 data_version 조회. */\n\nimport { DEFAULT_INDEX_BASE, type LoaderOptions } from \"./_index-loader.js\";\n\nexport interface ChangelogEntry {\n  /** YYYY.MM.DD 형식의 data_version 태그. */\n  version: string;\n  /** 사람이 읽는 한 줄 요약. */\n  changes: string;\n}\n\nexport interface Manifest {\n  data_version: string;\n  schema_version: string;\n  min_lib_version: string;\n  created_at: string;\n  /** 사용 가능한 버전 키 목록 (오름차순). 옛 배포에는 없을 수 있음 (optional). */\n  versions?: string[];\n  history: ChangelogEntry[];\n  files: Record<string, { size: number; sha256: string }>;\n}\n\nlet _manifestCache: Promise<Manifest> | null = null;\n\nexport function clearManifestCache(): void {\n  _manifestCache = null;\n}\n\n/** 원격 manifest.json 을 받아 파싱. 프로세스 내 메모리 캐시. */\nexport async function fetchManifest(\n  opts: LoaderOptions = {},\n): Promise<Manifest> {\n  const base = opts.baseUrl ?? DEFAULT_INDEX_BASE;\n  if (_manifestCache) return _manifestCache;\n  const fetchFn = opts.fetch ?? fetch;\n  const p = (async () => {\n    const res = await fetchFn(`${base}/manifest.json`, { signal: opts.signal });\n    if (!res.ok) {\n      throw new Error(\n        `failed to fetch manifest: ${res.status} ${res.statusText}`,\n      );\n    }\n    return (await res.json()) as Manifest;\n  })();\n  _manifestCache = p;\n  try {\n    return await p;\n  } catch (e) {\n    _manifestCache = null;\n    throw e;\n  }\n}\n\n/** 현재 원격 data_version (예: \"2026.04.25\"). 네트워크 실패 시 throw. */\nexport async function dataVersion(opts: LoaderOptions = {}): Promise<string> {\n  const m = await fetchManifest(opts);\n  return m.data_version;\n}\n\n/** 인덱스 수정 이력. 최신이 [0]. */\nexport async function changelog(\n  opts: LoaderOptions = {},\n): Promise<ChangelogEntry[]> {\n  const m = await fetchManifest(opts);\n  return m.history ?? [];\n}\n","// prettier-ignore\n// === AUTO-GENERATED VERSIONS START (rebuild_all.py 가 parquet/ 스캔으로 갱신. 이 블록은 손대지 말 것) ===\nexport const VERSIONS = [\n  \"19751231\", \"19801231\", \"19851231\", \"19901231\", \"19951231\", \"20001231\",\n  \"20011231\", \"20021231\", \"20031231\", \"20041231\", \"20051231\", \"20061231\",\n  \"20071231\", \"20081231\", \"20091231\", \"20101231\", \"20111231\", \"20121210\",\n  \"20121231\", \"20131231\", \"20141231\", \"20151231\", \"20160201\", \"20170418\",\n  \"20170801\", \"20171016\", \"20180301\", \"20180401\", \"20180724\", \"20181106\",\n  \"20190403\", \"20190908\", \"20191001\", \"20191231\", \"20200101\", \"20200701\",\n  \"20201001\", \"20210101\", \"20210401\", \"20210701\", \"20220101\", \"20220309\",\n  \"20220401\", \"20220701\", \"20221001\", \"20230101\", \"20230401\", \"20230701\",\n  \"20231001\", \"20231231\", \"20240101\", \"20240401\", \"20240701\", \"20241001\",\n  \"20241231\", \"20250101\", \"20250401\", \"20250701\", \"20251001\", \"20251231\",\n  \"20260201\", \"20260401\", \"20260701\",\n] as const;\n// === AUTO-GENERATED VERSIONS END ===\n\nexport type VersionKey = typeof VERSIONS[number];\n\nimport { fetchManifest } from \"./changelog.js\";\nimport type { LoaderOptions } from \"./_index-loader.js\";\n\nfunction filterByYear(keys: readonly string[], year?: number): string[] {\n  if (year === undefined) return [...keys];\n  if (!Number.isInteger(year)) {\n    throw new TypeError(`year must be an integer, got ${typeof year}`);\n  }\n  const prefix = String(year).padStart(4, \"0\");\n  return keys.filter((k) => k.startsWith(prefix));\n}\n\n/**\n * 버전 키 목록 (동기).\n *\n * 이 배열은 **패키지 배포 시점의 스냅샷**이다. 새 시점 데이터가 dist/data/ 에\n * 추가돼도 이 상수는 재배포 전까지 갱신되지 않는다. 최신 목록이 필요하면\n * {@link versionsAsync} 를 쓸 것 (manifest.json 을 런타임에 읽어 항상 최신).\n *\n * get/compare/matchAdm 의 입력 검증에도 이 동기 상수를 쓴다 (하위호환 유지).\n */\nexport function versions(year?: number): string[] {\n  return filterByYear(VERSIONS, year);\n}\n\n/**\n * 버전 키 목록 (비동기, 런타임 최신).\n *\n * 원격 `manifest.json` 의 `versions` 배열을 읽으므로, 라이브러리 재배포 없이\n * dist/data/ 데이터만 갱신돼도 최신 시점까지 반영된다. manifest 에 versions 가\n * 없는 옛 배포이거나 네트워크 실패 시 동기 {@link VERSIONS} 스냅샷으로 fallback.\n *\n * @param year  4자리 연도로 필터 (예: 2025). 생략 시 전체.\n * @param opts  baseUrl / fetch / signal (LoaderOptions).\n */\nexport async function versionsAsync(\n  year?: number,\n  opts: LoaderOptions = {},\n): Promise<string[]> {\n  let keys: readonly string[] = VERSIONS;\n  try {\n    const m = await fetchManifest(opts);\n    if (Array.isArray(m.versions) && m.versions.length > 0) {\n      keys = m.versions;\n    }\n  } catch {\n    // 네트워크 실패 등 → 동기 스냅샷으로 fallback\n  }\n  return filterByYear(keys, year);\n}\n","import { parquetReadObjects } from \"hyparquet\";\nimport { compressors } from \"hyparquet-compressors\";\n\nimport type {\n  AdmFeature,\n  AdmFeatureCollection,\n  AdmProperties,\n  GetOptions,\n  Level,\n} from \"./types.js\";\nimport { VERSIONS } from \"./versions.js\";\n\nconst DEFAULT_BASE_URL =\n  \"https://raw.githubusercontent.com/vuski/admdongkor/master/parquet\";\n\nconst LEVELS: readonly Level[] = [\"emd\", \"sgg\", \"sido\"] as const;\n\nfunction validateArgs(key: string, level: Level): void {\n  if (typeof key !== \"string\") {\n    throw new TypeError(\n      `key must be a version key string like '20250401', got ${typeof key}. ` +\n        \"Use versions() to see available keys.\",\n    );\n  }\n  if (!(VERSIONS as readonly string[]).includes(key)) {\n    throw new Error(\n      `unknown version key: ${JSON.stringify(key)}. ` +\n        \"Use versions() to see available keys.\",\n    );\n  }\n  if (!LEVELS.includes(level)) {\n    throw new Error(\n      `level must be one of ${JSON.stringify(LEVELS)}, got ${JSON.stringify(level)}`,\n    );\n  }\n}\n\nfunction urlFor(key: string, level: Level, detail: boolean, baseUrl: string): string {\n  return detail\n    ? `${baseUrl}/${level}_${key}.parquet`\n    : `${baseUrl}/simplified/${level}_${key}_light.parquet`;\n}\n\n/** 원본 parquet 파일을 ArrayBuffer 로 반환. 파싱하지 않음.\n *\n * 용도:\n * - Web Worker 로 transferable 전달해서 main thread 부담 최소화\n * - IndexedDB / Cache API 에 바이트 그대로 저장\n * - parquet-wasm, @geoarrow/deck.gl-layers 등에 직접 투입\n *\n * Geometry 는 WKB, CRS 는 EPSG:4326, 압축은 snappy. geo-parquet spec 호환.\n */\nexport async function getParquet(\n  key: string,\n  level: Level = \"emd\",\n  options: GetOptions = {},\n): Promise<ArrayBuffer> {\n  validateArgs(key, level);\n  const detail = options.detail ?? false;\n  const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n  const fetchFn = options.fetch ?? fetch;\n  const url = urlFor(key, level, detail, baseUrl);\n\n  const response = await fetchFn(url, { signal: options.signal });\n  if (!response.ok) {\n    throw new Error(\n      `failed to fetch ${url}: ${response.status} ${response.statusText}`,\n    );\n  }\n  return response.arrayBuffer();\n}\n\n/** 지도 데이터를 GeoJSON `FeatureCollection` 으로 반환.\n *\n * 내부적으로 `getParquet()` 로 받은 parquet 바이트를 파싱해서 GeoJSON 으로 변환.\n * deck.gl `GeoJsonLayer`, Leaflet `L.geoJSON`, MapLibre `GeoJSONSource` 에 바로 투입 가능.\n *\n * geometry 는 `Polygon` 또는 `MultiPolygon`.\n *\n * **좌표계 주의** — 두 파일의 저장 좌표계가 다르다:\n * - `detail: false` (기본, light) → **EPSG:4326** (경위도). 웹 지도에 바로 쓸 수 있다.\n * - `detail: true` (원본)         → **EPSG:5179** (UTM-K, 미터). 재투영이 필요하다.\n *\n * 파이썬 `adk.get()` 은 geopandas 로 CRS 를 통일하지만, JS 는 재투영 의존성을\n * 두지 않으므로 저장된 좌표를 그대로 돌려준다. 반환된 `crs` 필드로 판별할 것.\n */\nexport async function get(\n  key: string,\n  level: Level = \"emd\",\n  options: GetOptions = {},\n): Promise<AdmFeatureCollection> {\n  const buffer = await getParquet(key, level, options);\n\n  const rows = await parquetReadObjects({\n    file: buffer,\n    compressors,\n  });\n\n  const features: AdmFeature[] = rows.map((row) => {\n    // 원본 parquet 의 지오메트리 컬럼은 `geom`, light 는 `geometry`.\n    // 둘 다 받아야 detail:true 에서 geometry 가 통째로 사라지지 않는다.\n    const { geometry, geom, ...rest } = row as Record<string, unknown>;\n    return {\n      type: \"Feature\",\n      properties: rest as unknown as AdmProperties,\n      geometry: (geometry ?? geom) as GeoJSON.Polygon | GeoJSON.MultiPolygon,\n    };\n  });\n\n  return {\n    type: \"FeatureCollection\",\n    // 저장 좌표계를 명시. detail 원본은 5179, light 는 4326.\n    crs: options.detail ? \"EPSG:5179\" : \"EPSG:4326\",\n    features,\n  };\n}\n","import { clearLoaderCache, loadIndexFile } from \"./_index-loader.js\";\r\nimport type { Level } from \"./types.js\";\r\n\r\nexport interface FindRow {\r\n  version_key: string;\r\n  level: Level;\r\n  sidonm: string | null;\r\n  sggnm: string | null;\r\n  name: string;\r\n  code: string | null;\r\n  code7: string | null;\r\n  code8: string | null;\r\n  sggcd: string | null;\r\n  sidocd: string | null;\r\n}\r\n\r\ninterface IndexRow extends FindRow {\r\n  _fullpath: string;\r\n}\r\n\r\nexport interface FindOptions {\r\n  level?: Level;\r\n  /**\r\n   * 이름 검색이면 `name` 컬럼 단독 완전 일치 (공백 포함 쿼리와 결합 불가).\r\n   * 코드 검색이면 prefix 대신 **자릿수 완전일치**.\r\n   */\r\n  exact?: boolean;\r\n  /**\r\n   * `\"name\"` / `\"code\"` 로 검색 방식 강제. 생략하면 자동 판별\r\n   * (숫자로만 이루어진 쿼리 → 코드 검색).\r\n   */\r\n  by?: \"name\" | \"code\";\r\n  /** `[2025]` 단일 연도 / `[2000, 2005]` inclusive range. 길이 1 또는 2. */\r\n  year?: number[];\r\n  /** 인덱스 parquet 베이스 URL 오버라이드. */\r\n  baseUrl?: string;\r\n  /** 커스텀 fetch (테스트용). */\r\n  fetch?: typeof fetch;\r\n  signal?: AbortSignal;\r\n}\r\n\r\nconst LEVELS: readonly Level[] = [\"sido\", \"sgg\", \"emd\"] as const;\r\nconst LEVEL_ORDER: Record<Level, number> = { sido: 0, sgg: 1, emd: 2 };\r\nconst AUTO_LEVEL: Record<number, Level | null> = { 1: null, 2: \"sgg\", 3: \"emd\" };\r\n\r\n/**\r\n * 코드 검색이 훑는 컬럼. code = 행안부(sido 2 / sgg 5 / emd 10),\r\n * code7 / code8 = 통계청 (emd 레벨에서만 채워짐).\r\n */\r\nconst CODE_COLUMNS = [\"code\", \"code7\", \"code8\"] as const;\r\n\r\nfunction nfc(s: string): string {\r\n  return s.normalize(\"NFC\");\r\n}\r\n\r\n/**\r\n * 숫자로만 이루어진 쿼리면 코드로 본다. 행정구역명 중 숫자 *만* 인 것은\r\n * 없으므로 이름 검색과 충돌하지 않는다.\r\n */\r\nfunction isCodeQuery(q: string): boolean {\r\n  return q.length > 0 && /^[0-9]+$/.test(q);\r\n}\r\n\r\n/** `code` / `code7` / `code8` 중 하나라도 걸리면 매치. */\r\nfunction matchesCode(row: FindRow, code: string, exact: boolean): boolean {\r\n  for (const col of CODE_COLUMNS) {\r\n    const v = row[col];\r\n    if (typeof v !== \"string\") continue;\r\n    if (exact ? v === code : v.startsWith(code)) return true;\r\n  }\r\n  return false;\r\n}\r\n\r\nexport function clearIndexCache(): void {\r\n  clearLoaderCache();\r\n}\r\n\r\n/**\r\n * 행정구역명 **또는 코드**로 버전 검색.\r\n *\r\n * 숫자로만 이루어진 쿼리는 자동으로 **코드 검색**이 된다 (행정구역명 중 숫자로만\r\n * 된 것은 없어 이름 검색과 충돌하지 않는다). `by` 로 강제 가능.\r\n *\r\n * ```ts\r\n * await find(\"종로구\");        // 이름 검색\r\n * await find(\"11110\");         // 코드 — 시군구 11110 + 하위 읍면동 전부\r\n * await find(\"1111051500\");    // 코드 — 해당 읍면동\r\n * await find(\"11110\", { by: \"name\" });   // 이름 검색 강제\r\n * ```\r\n *\r\n * 코드 검색은 **prefix 매칭**이라 자릿수를 정확히 맞추지 않아도 된다.\r\n * `\"11\"` → 시도 11 + 시군구 `11xxx` + 읍면동 `11xxxxxxxx` 전부.\r\n * `level` 로 좁히고, `exact: true` 면 자릿수 완전일치만.\r\n * `code`(행안부) / `code7` / `code8`(통계청) 셋 다 매칭 대상.\r\n */\r\nexport async function find(\r\n  name: string,\r\n  options: FindOptions = {},\r\n): Promise<FindRow[]> {\r\n  if (typeof name !== \"string\") {\r\n    throw new TypeError(`name must be string, got ${typeof name}`);\r\n  }\r\n  const { level, exact = false, year, by, baseUrl, fetch: fetchFn, signal } = options;\r\n\r\n  if (level !== undefined && !LEVELS.includes(level)) {\r\n    throw new Error(\r\n      `level must be one of ${JSON.stringify(LEVELS)} or undefined, got ${JSON.stringify(level)}`,\r\n    );\r\n  }\r\n  if (by !== undefined && by !== \"name\" && by !== \"code\") {\r\n    throw new Error(\r\n      `by must be \"name\", \"code\", or undefined, got ${JSON.stringify(by)}`,\r\n    );\r\n  }\r\n  if (year !== undefined) {\r\n    if (!Array.isArray(year) || !year.every((y) => Number.isInteger(y))) {\r\n      throw new TypeError(\"year must be number[] (integers)\");\r\n    }\r\n    if (year.length !== 1 && year.length !== 2) {\r\n      throw new Error(\r\n        `year must have length 1 (single year) or 2 (inclusive range), got ${year.length}`,\r\n      );\r\n    }\r\n  }\r\n\r\n  const tokens = nfc(name).trim().split(/\\s+/).filter(Boolean);\r\n  if (tokens.length === 0) throw new Error(\"name cannot be empty\");\r\n\r\n  // 코드 검색 여부 판정. by 가 명시되면 그 쪽을 강제.\r\n  const query = tokens.join(\"\");\r\n  let codeMode: boolean;\r\n  if (by === \"code\") {\r\n    if (!isCodeQuery(query)) {\r\n      throw new Error(\r\n        `by=\"code\" requires a digits-only query, got ${JSON.stringify(name)}`,\r\n      );\r\n    }\r\n    codeMode = true;\r\n  } else if (by === \"name\") {\r\n    codeMode = false;\r\n  } else {\r\n    codeMode = isCodeQuery(query);\r\n  }\r\n\r\n  let effectiveLevel: Level | null;\r\n  let needle = \"\";\r\n  if (codeMode) {\r\n    effectiveLevel = level ?? null;\r\n  } else {\r\n    if (tokens.length > 3) {\r\n      throw new Error(\r\n        `name must have 1-3 whitespace-separated tokens (sido, sgg, emd), got ${tokens.length}`,\r\n      );\r\n    }\r\n    const multiToken = tokens.length >= 2;\r\n    if (exact && multiToken) {\r\n      throw new Error(\r\n        \"exact=true requires a single-token name (no whitespace). Use level to narrow scope instead.\",\r\n      );\r\n    }\r\n    effectiveLevel = level ?? AUTO_LEVEL[tokens.length] ?? null;\r\n    needle = query.toLowerCase();\r\n  }\r\n\r\n  const rows = await loadIndexFile<IndexRow>(\"_index_v3.parquet\", {\r\n    baseUrl,\r\n    fetch: fetchFn,\r\n    signal,\r\n  });\r\n\r\n  const yearLo = year && year.length >= 1 ? Math.min(...year) : null;\r\n  const yearHi = year && year.length === 2 ? Math.max(...year) : yearLo;\r\n\r\n  const matched = rows.filter((r) => {\r\n    if (codeMode) {\r\n      if (!matchesCode(r, query, exact)) return false;\r\n    } else if (exact) {\r\n      if (nfc(r.name ?? \"\").toLowerCase() !== needle) return false;\r\n    } else {\r\n      if (!(r._fullpath ?? \"\").includes(needle)) return false;\r\n    }\r\n    if (effectiveLevel !== null && r.level !== effectiveLevel) return false;\r\n    if (yearLo !== null) {\r\n      const y = Number(r.version_key.slice(0, 4));\r\n      if (yearHi === null) return false;\r\n      if (y < yearLo || y > yearHi) return false;\r\n    }\r\n    return true;\r\n  });\r\n\r\n  matched.sort((a, b) => {\r\n    if (a.version_key !== b.version_key) {\r\n      return a.version_key < b.version_key ? -1 : 1;\r\n    }\r\n    const la = LEVEL_ORDER[a.level];\r\n    const lb = LEVEL_ORDER[b.level];\r\n    if (la !== lb) return la - lb;\r\n    const ca = a.code ?? \"\";\r\n    const cb = b.code ?? \"\";\r\n    if (ca !== cb) return ca < cb ? -1 : 1;\r\n    return 0;\r\n  });\r\n\r\n  return matched.map(({ _fullpath: _omit, ...rest }) => rest);\r\n}\r\n\r\nexport function findVersions(rows: FindRow[]): string[] {\r\n  const seen = new Set<string>();\r\n  const out: string[] = [];\r\n  for (const r of rows) {\r\n    if (!seen.has(r.version_key)) {\r\n      seen.add(r.version_key);\r\n      out.push(r.version_key);\r\n    }\r\n  }\r\n  return out;\r\n}\r\n\r\nexport function findFirst(rows: FindRow[]): string | null {\r\n  const v = findVersions(rows);\r\n  return v.length > 0 ? (v[0] ?? null) : null;\r\n}\r\n\r\nexport function findLast(rows: FindRow[]): string | null {\r\n  const v = findVersions(rows);\r\n  return v.length > 0 ? (v[v.length - 1] ?? null) : null;\r\n}\r\n","import { loadIndexFile } from \"./_index-loader.js\";\n\n/**\n * 출장소(出張所) 한 건.\n *\n * 출장소는 행안부 행정동 코드 체계에만 존재하고 **경계 지도가 없다**.\n * 그래서 `version_key` 대신 `created` / `abolished` (YYYYMMDD) 로 유효 기간을\n * 나타낸다. `abolished` 가 null 이면 현존.\n */\nexport interface OfficeRow {\n  /** 행안부 행정동 10자리. */\n  code: string;\n  name: string;\n  sggnm: string | null;\n  sidonm: string | null;\n  sggcd: string | null;\n  sidocd: string | null;\n  /** 뒤 5자리가 00000 이면 \"sgg\", 아니면 \"emd\". */\n  level: \"sgg\" | \"emd\";\n  created: string | null;\n  abolished: string | null;\n}\n\ninterface OfficeIndexRow extends OfficeRow {\n  _fullpath: string;\n}\n\nexport interface FindOfficesOptions {\n  /** 코드 완전일치 / 이름 완전일치. 기본은 prefix·substring. */\n  exact?: boolean;\n  /** `\"name\"` / `\"code\"` 로 검색 방식 강제. 생략하면 자동 판별. */\n  by?: \"name\" | \"code\";\n  baseUrl?: string;\n  fetch?: typeof fetch;\n  signal?: AbortSignal;\n}\n\nconst OFFICES_FILE = \"_offices.parquet\";\n\nfunction nfc(s: string): string {\n  return s.normalize(\"NFC\");\n}\n\n/**\n * 출장소 검색. 코드(prefix) 또는 이름(substring).\n *\n * **지도가 없으므로 `get()` 으로 경계를 받을 수 없고, `find()` 결과에도 포함되지\n * 않는다.** 코드를 넣었을 때 \"이게 어디인지\" 를 알려주기 위한 별도 경로.\n *\n * ```ts\n * await findOffices(\"2920083000\");  // 광주 광산구 임곡출장소 (1995~1998 말소)\n * await findOffices(\"28265\");       // 인천 서구 검단출장소\n * await findOffices(\"영종\");         // 이름으로\n * ```\n */\nexport async function findOffices(\n  query: string,\n  options: FindOfficesOptions = {},\n): Promise<OfficeRow[]> {\n  if (typeof query !== \"string\") {\n    throw new TypeError(`query must be string, got ${typeof query}`);\n  }\n  const { exact = false, by, baseUrl, fetch: fetchFn, signal } = options;\n  if (by !== undefined && by !== \"name\" && by !== \"code\") {\n    throw new Error(\n      `by must be \"name\", \"code\", or undefined, got ${JSON.stringify(by)}`,\n    );\n  }\n\n  const q = nfc(query).trim().split(/\\s+/).filter(Boolean).join(\"\");\n  if (!q) return [];\n\n  const codeMode = by === undefined ? /^[0-9]+$/.test(q) : by === \"code\";\n\n  let rows: OfficeIndexRow[];\n  try {\n    rows = await loadIndexFile<OfficeIndexRow>(OFFICES_FILE, {\n      baseUrl,\n      fetch: fetchFn,\n      signal,\n    });\n  } catch (e) {\n    // 구버전 dist/data 에는 _offices.parquet 이 없다. 검색 자체를 깨뜨리지 않는다.\n    if (signal?.aborted) throw e;\n    return [];\n  }\n\n  const needle = q.toLowerCase();\n  const matched = rows.filter((r) => {\n    if (codeMode) {\n      const c = r.code ?? \"\";\n      return exact ? c === q : c.startsWith(q);\n    }\n    if (exact) return nfc(r.name ?? \"\").toLowerCase() === needle;\n    return (r._fullpath ?? \"\").includes(needle);\n  });\n\n  matched.sort((a, b) => {\n    if (a.code !== b.code) return a.code < b.code ? -1 : 1;\n    return (a.created ?? \"\") < (b.created ?? \"\") ? -1 : 1;\n  });\n\n  return matched.map(({ _fullpath: _omit, ...rest }) => rest);\n}\n","import { loadIndexFile, type LoaderOptions } from \"./_index-loader.js\";\nimport { VERSIONS } from \"./versions.js\";\n\ninterface TimelineRow {\n  level: string;\n  version_key: string;\n  element_id: string;\n  shape_id: bigint;\n  name: string;\n  emd7: string | null;\n  emd8: string | null;\n  sggcd: string | null;\n  sggnm: string | null;\n  sidocd: string | null;\n  sidonm: string | null;\n  area: number;\n}\n\ninterface ShapePairRow {\n  shape_id_a: bigint;\n  shape_id_b: bigint;\n  iou: number;\n}\n\nexport interface CompareRow {\n  version_key: string;\n  emdcd: string;\n  emdnm: string;\n  sggcd: string | null;\n  sggnm: string | null;\n  sidocd: string | null;\n  sidonm: string | null;\n  shape_id: number;\n  /** diff rows only: \"changed\" | \"only_in_a\" | \"only_in_b\". same rows omit. */\n  status?: \"changed\" | \"only_in_a\" | \"only_in_b\";\n  /** diff rows only. changed → 0–1, only_* → null. */\n  iou?: number | null;\n}\n\nexport interface CompareResult {\n  va: string;\n  vb: string;\n  threshold: number;\n  same: CompareRow[];\n  diff: CompareRow[];\n}\n\nexport interface CompareOptions extends LoaderOptions {\n  /** shape_id 다를 때 iou >= threshold 면 same 으로 승격. 기본 0.99. */\n  threshold?: number;\n}\n\nfunction project(r: TimelineRow): CompareRow {\n  return {\n    version_key: r.version_key,\n    emdcd: r.element_id,\n    emdnm: r.name,\n    sggcd: r.sggcd,\n    sggnm: r.sggnm,\n    sidocd: r.sidocd,\n    sidonm: r.sidonm,\n    shape_id: Number(r.shape_id),\n  };\n}\n\nfunction pairKey(a: bigint, b: bigint): string {\n  const [lo, hi] = a < b ? [a, b] : [b, a];\n  return `${lo}|${hi}`;\n}\n\nexport async function compare(\n  versions: [string, string],\n  options: CompareOptions = {},\n): Promise<CompareResult> {\n  if (!Array.isArray(versions) || versions.length !== 2) {\n    throw new Error(\"versions must be a tuple of exactly 2 version keys\");\n  }\n  const [va, vb] = versions;\n  if (typeof va !== \"string\" || typeof vb !== \"string\") {\n    throw new TypeError(\"versions items must be strings\");\n  }\n  for (const v of [va, vb]) {\n    if (!(VERSIONS as readonly string[]).includes(v)) {\n      throw new Error(`unknown version key: ${JSON.stringify(v)}`);\n    }\n  }\n  const threshold = options.threshold ?? 0.99;\n  if (!(threshold >= 0 && threshold <= 1)) {\n    throw new Error(`threshold must be in [0, 1], got ${threshold}`);\n  }\n\n  const [tl, sp] = await Promise.all([\n    loadIndexFile<TimelineRow>(\"timeline_v3_emd.parquet\", options),\n    loadIndexFile<ShapePairRow>(\"shape_pairs_v3_emd.parquet\", options),\n  ]);\n\n  const tlA = tl.filter((r) => r.version_key === va);\n  const tlB = tl.filter((r) => r.version_key === vb);\n  if (tlA.length === 0) throw new Error(`no timeline rows for version: ${va}`);\n  if (tlB.length === 0) throw new Error(`no timeline rows for version: ${vb}`);\n\n  const byIdA = new Map(tlA.map((r) => [r.element_id, r]));\n  const byIdB = new Map(tlB.map((r) => [r.element_id, r]));\n  const pairIou = new Map<string, number>();\n  for (const p of sp) {\n    pairIou.set(pairKey(p.shape_id_a, p.shape_id_b), p.iou);\n  }\n\n  const sameIds = new Set<string>();\n  const changedIou = new Map<string, number>();\n\n  for (const id of byIdA.keys()) {\n    const rb = byIdB.get(id);\n    if (!rb) continue;\n    const ra = byIdA.get(id)!;\n    if (ra.shape_id === rb.shape_id) {\n      sameIds.add(id);\n      continue;\n    }\n    const iou = pairIou.get(pairKey(ra.shape_id, rb.shape_id)) ?? 0;\n    if (iou >= threshold) {\n      sameIds.add(id);\n    } else {\n      changedIou.set(id, iou);\n    }\n  }\n\n  const onlyA: string[] = [];\n  const onlyB: string[] = [];\n  for (const id of byIdA.keys()) if (!byIdB.has(id)) onlyA.push(id);\n  for (const id of byIdB.keys()) if (!byIdA.has(id)) onlyB.push(id);\n\n  const sameRows: CompareRow[] = [];\n  for (const id of sameIds) {\n    sameRows.push(project(byIdA.get(id)!));\n    sameRows.push(project(byIdB.get(id)!));\n  }\n  sameRows.sort((x, y) => {\n    if (x.emdcd !== y.emdcd) return x.emdcd < y.emdcd ? -1 : 1;\n    return x.version_key < y.version_key ? -1 : 1;\n  });\n\n  const diffRows: CompareRow[] = [];\n  for (const [id, iou] of changedIou) {\n    const a = project(byIdA.get(id)!);\n    const b = project(byIdB.get(id)!);\n    a.status = \"changed\";\n    b.status = \"changed\";\n    a.iou = iou;\n    b.iou = iou;\n    diffRows.push(a, b);\n  }\n  for (const id of onlyA) {\n    const a = project(byIdA.get(id)!);\n    a.status = \"only_in_a\";\n    a.iou = null;\n    diffRows.push(a);\n  }\n  for (const id of onlyB) {\n    const b = project(byIdB.get(id)!);\n    b.status = \"only_in_b\";\n    b.iou = null;\n    diffRows.push(b);\n  }\n  diffRows.sort((x, y) => {\n    if (x.status !== y.status) return (x.status ?? \"\") < (y.status ?? \"\") ? -1 : 1;\n    if (x.emdcd !== y.emdcd) return x.emdcd < y.emdcd ? -1 : 1;\n    return x.version_key < y.version_key ? -1 : 1;\n  });\n\n  return { va, vb, threshold, same: sameRows, diff: diffRows };\n}\n","import { loadIndexFile, type LoaderOptions } from \"./_index-loader.js\";\nimport { VERSIONS } from \"./versions.js\";\n\ninterface TimelineEmdRow {\n  version_key: string;\n  element_id: string;\n  shape_id: bigint;\n  name: string;\n  emd7: string | null;\n  emd8: string | null;\n  sggcd: string | null;\n  sggnm: string | null;\n  sidocd: string | null;\n  sidonm: string | null;\n  area: number;\n}\n\ninterface TimelineLevelRow {\n  version_key: string;\n  element_id: string;\n  name: string;\n  area: number;\n  sggcd?: string | null;\n  sggnm?: string | null;\n  sidocd?: string | null;\n  sidonm?: string | null;\n}\n\ninterface ShapePairRow {\n  shape_id_a: bigint;\n  shape_id_b: bigint;\n  w_forward: number;\n  w_backward: number;\n}\n\nexport interface MatchEmdRow {\n  version_key: string;\n  emdcd: string;\n  emdnm: string;\n  sggcd: string | null;\n  sggnm: string | null;\n  sidocd: string | null;\n  sidonm: string | null;\n  area: number;\n  weight: number;\n}\n\nexport interface MatchSggRow {\n  version_key: string;\n  sggcd: string;\n  sggnm: string;\n  sidocd: string | null;\n  sidonm: string | null;\n  area: number;\n  weight: number;\n}\n\nexport interface MatchSidoRow {\n  version_key: string;\n  sidocd: string;\n  sidonm: string;\n  area: number;\n  weight: number;\n}\n\nexport interface MatchOptions extends LoaderOptions {\n  base: string;\n  region: string;\n  target: string | string[];\n  /** weight 가 이 값 미만이면 결과에서 제외. 기본 0. */\n  minWeight?: number;\n}\n\nexport interface MatchResult {\n  base: string;\n  region: string;\n  targets: string[];\n  emd: MatchEmdRow[];\n  sgg: () => Promise<MatchSggRow[]>;\n  sido: () => Promise<MatchSidoRow[]>;\n}\n\nfunction clamp01(x: number): number {\n  return x > 1 ? 1 : x < 0 ? 0 : x;\n}\n\nfunction resolveRegionMask(\n  tl: TimelineEmdRow[],\n  base: string,\n  region: string,\n): TimelineEmdRow[] {\n  const L = region.length;\n  switch (L) {\n    case 2:\n      return tl.filter((r) => r.version_key === base && r.sidocd === region);\n    case 5:\n      return tl.filter((r) => r.version_key === base && r.sggcd === region);\n    case 7:\n      return tl.filter((r) => r.version_key === base && r.emd7 === region);\n    case 10:\n      return tl.filter((r) => r.version_key === base && r.element_id === region);\n    default:\n      throw new Error(\n        `region must be 2/5/7/10 digit code, got length=${L}: ${JSON.stringify(region)}`,\n      );\n  }\n}\n\nexport async function matchAdm(opts: MatchOptions): Promise<MatchResult> {\n  const { base, region, target, minWeight = 0 } = opts;\n\n  if (typeof base !== \"string\") throw new TypeError(\"base must be string\");\n  if (typeof region !== \"string\") throw new TypeError(\"region must be string\");\n  if (!(VERSIONS as readonly string[]).includes(base)) {\n    throw new Error(`unknown base version key: ${JSON.stringify(base)}`);\n  }\n  const targets = Array.isArray(target) ? target : [target];\n  if (targets.length === 0) throw new Error(\"target must have at least one version key\");\n  for (const t of targets) {\n    if (typeof t !== \"string\") throw new TypeError(\"target items must be strings\");\n    if (!(VERSIONS as readonly string[]).includes(t)) {\n      throw new Error(`unknown target version key: ${JSON.stringify(t)}`);\n    }\n  }\n\n  const [tl, sp] = await Promise.all([\n    loadIndexFile<TimelineEmdRow>(\"timeline_v3_emd.parquet\", opts),\n    loadIndexFile<ShapePairRow>(\"shape_pairs_v3_emd.parquet\", opts),\n  ]);\n\n  const baseRows = resolveRegionMask(tl, base, region);\n  if (baseRows.length === 0) {\n    return emptyResult(base, region, targets, opts);\n  }\n\n  const baseShapes = new Set(baseRows.map((r) => r.shape_id));\n\n  // shape_pairs → {otherShape: summed weight toward target}\n  // base shape 가 A 측이면 w_backward 사용 (base ∩ other) / area(other)\n  // base shape 가 B 측이면 w_forward 사용\n  const relatedWeight = new Map<bigint, number>();\n  const addRelated = (other: bigint, w: number) => {\n    if (w < minWeight) return;\n    relatedWeight.set(other, (relatedWeight.get(other) ?? 0) + w);\n  };\n  for (const p of sp) {\n    if (baseShapes.has(p.shape_id_a)) addRelated(p.shape_id_b, p.w_backward);\n    if (baseShapes.has(p.shape_id_b)) addRelated(p.shape_id_a, p.w_forward);\n  }\n\n  const byVersion = new Map<string, TimelineEmdRow[]>();\n  for (const t of targets) byVersion.set(t, []);\n  for (const r of tl) {\n    const bucket = byVersion.get(r.version_key);\n    if (bucket) bucket.push(r);\n  }\n\n  const emdOut: MatchEmdRow[] = [];\n  for (const t of targets) {\n    const rows = byVersion.get(t) ?? [];\n    // (element_id) → accumulated weight\n    const accum = new Map<string, { row: TimelineEmdRow; weight: number }>();\n    for (const r of rows) {\n      let w = 0;\n      if (baseShapes.has(r.shape_id)) {\n        w = 1;\n      } else {\n        const rel = relatedWeight.get(r.shape_id);\n        if (rel !== undefined) w = rel;\n      }\n      if (w === 0) continue;\n      const existing = accum.get(r.element_id);\n      if (existing) existing.weight += w;\n      else accum.set(r.element_id, { row: r, weight: w });\n    }\n    for (const { row, weight } of accum.values()) {\n      const clamped = clamp01(weight);\n      if (clamped < minWeight) continue;\n      emdOut.push({\n        version_key: row.version_key,\n        emdcd: row.element_id,\n        emdnm: row.name,\n        sggcd: row.sggcd,\n        sggnm: row.sggnm,\n        sidocd: row.sidocd,\n        sidonm: row.sidonm,\n        area: row.area,\n        weight: clamped,\n      });\n    }\n  }\n\n  emdOut.sort((a, b) => {\n    if (a.version_key !== b.version_key)\n      return a.version_key < b.version_key ? -1 : 1;\n    return b.weight - a.weight;\n  });\n\n  return {\n    base,\n    region,\n    targets,\n    emd: emdOut,\n    sgg: () => aggregateToLevel(emdOut, \"sgg\", opts),\n    sido: () => aggregateToLevel(emdOut, \"sido\", opts),\n  };\n}\n\nfunction emptyResult(\n  base: string,\n  region: string,\n  targets: string[],\n  opts: LoaderOptions,\n): MatchResult {\n  return {\n    base,\n    region,\n    targets,\n    emd: [],\n    sgg: async () => [],\n    sido: async () => {\n      void opts;\n      return [];\n    },\n  };\n}\n\nasync function aggregateToLevel(\n  emd: MatchEmdRow[],\n  level: \"sgg\",\n  opts: LoaderOptions,\n): Promise<MatchSggRow[]>;\nasync function aggregateToLevel(\n  emd: MatchEmdRow[],\n  level: \"sido\",\n  opts: LoaderOptions,\n): Promise<MatchSidoRow[]>;\nasync function aggregateToLevel(\n  emd: MatchEmdRow[],\n  level: \"sgg\" | \"sido\",\n  opts: LoaderOptions,\n): Promise<MatchSggRow[] | MatchSidoRow[]> {\n  if (emd.length === 0) return [] as MatchSggRow[] | MatchSidoRow[];\n\n  const codeKey = level === \"sgg\" ? \"sggcd\" : \"sidocd\";\n  const nameKey = level === \"sgg\" ? \"sggnm\" : \"sidonm\";\n\n  // 분자: Σ(weight × area) per (version, code)\n  interface Acc {\n    version_key: string;\n    code: string;\n    name: string;\n    sidocd: string | null;\n    sidonm: string | null;\n    wa: number;\n  }\n  const accum = new Map<string, Acc>();\n  for (const r of emd) {\n    const code = r[codeKey];\n    if (code === null) continue;\n    const key = `${r.version_key}|${code}`;\n    const existing = accum.get(key);\n    const wa = r.weight * r.area;\n    if (existing) {\n      existing.wa += wa;\n    } else {\n      accum.set(key, {\n        version_key: r.version_key,\n        code,\n        name: (r[nameKey] as string | null) ?? \"\",\n        sidocd: r.sidocd,\n        sidonm: r.sidonm,\n        wa,\n      });\n    }\n  }\n\n  // 분모: 해당 level 의 total area\n  const levelTl = await loadIndexFile<TimelineLevelRow>(\n    `timeline_v3_${level}.parquet`,\n    opts,\n  );\n  const totalArea = new Map<string, number>();\n  for (const r of levelTl) {\n    totalArea.set(`${r.version_key}|${r.element_id}`, r.area);\n  }\n\n  if (level === \"sgg\") {\n    const out: MatchSggRow[] = [];\n    for (const a of accum.values()) {\n      const total = totalArea.get(`${a.version_key}|${a.code}`) ?? a.wa;\n      out.push({\n        version_key: a.version_key,\n        sggcd: a.code,\n        sggnm: a.name,\n        sidocd: a.sidocd,\n        sidonm: a.sidonm,\n        area: total,\n        weight: clamp01(a.wa / total),\n      });\n    }\n    out.sort((x, y) => {\n      if (x.version_key !== y.version_key)\n        return x.version_key < y.version_key ? -1 : 1;\n      return y.weight - x.weight;\n    });\n    return out;\n  } else {\n    const out: MatchSidoRow[] = [];\n    for (const a of accum.values()) {\n      const total = totalArea.get(`${a.version_key}|${a.code}`) ?? a.wa;\n      out.push({\n        version_key: a.version_key,\n        sidocd: a.code,\n        sidonm: a.name,\n        area: total,\n        weight: clamp01(a.wa / total),\n      });\n    }\n    out.sort((x, y) => {\n      if (x.version_key !== y.version_key)\n        return x.version_key < y.version_key ? -1 : 1;\n      return y.weight - x.weight;\n    });\n    return out;\n  }\n}\n"]}