@koda-sl/baker-cli 0.571.0 → 0.572.0-dev.61ba69c66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/dist/account-6RJ6ZI3B.js +82 -0
- package/dist/account-AIGNJ2RP.js +82 -0
- package/dist/account-E5LLPRZ6.js +139 -0
- package/dist/account-assets-J6SVHSXR.js +290 -0
- package/dist/account-level-FGE33OJT.js +612 -0
- package/dist/account-level-FGE33OJT.js.map +1 -0
- package/dist/account-reads-BNVCJ37E.js +220 -0
- package/dist/account-reads-BNVCJ37E.js.map +1 -0
- package/dist/account-users-MFH5CJIA.js +65 -0
- package/dist/account-users-MFH5CJIA.js.map +1 -0
- package/dist/account-writes-XNS4IKZV.js +68 -0
- package/dist/accounts-3ZWYGRVM.js +80 -0
- package/dist/accounts-5TLHSEZR.js +119 -0
- package/dist/accounts-BAZYYDFV.js +713 -0
- package/dist/accounts-L2HVNJUF.js +76 -0
- package/dist/accounts-NTBIRB52.js +115 -0
- package/dist/actions-N2FBJMT4.js +55 -0
- package/dist/active-entities-IJPRN45K.js +103 -0
- package/dist/activecampaign-U77COT2F.js +938 -0
- package/dist/activities-SS3SUWSS.js +75 -0
- package/dist/ad-group-writes-DTQSUNE2.js +172 -0
- package/dist/ad-groups-CX23GLVE.js +70 -0
- package/dist/ad-writes-HAAUOJCG.js +176 -0
- package/dist/add-ABPQTO2M.js +305 -0
- package/dist/add-BK6N7KWU.js +97 -0
- package/dist/add-ECN2FTMH.js +85 -0
- package/dist/add-FH7OVKFF.js +148 -0
- package/dist/add-KHY3H54G.js +81 -0
- package/dist/add-MZZLFU3M.js +513 -0
- package/dist/add-MZZLFU3M.js.map +1 -0
- package/dist/add-VDH2VCXR.js +107 -0
- package/dist/add-accounts-6JAOSCXK.js +91 -0
- package/dist/ads-BEMEXBDJ.js +128 -0
- package/dist/ads-GAU2XKNL.js +48 -0
- package/dist/ads-HZOXZ3FY.js +79 -0
- package/dist/ads-I5OBZ5VI.js +120 -0
- package/dist/adsets-PMQGA6TW.js +182 -0
- package/dist/advertisers-EOLL3VFQ.js +123 -0
- package/dist/advertisers-FNKY2PP4.js +125 -0
- package/dist/analytics-DOAUCF2Y.js +2437 -0
- package/dist/analytics-MR3T34KN.js +447 -0
- package/dist/animate-EKGVDSWM.js +480 -0
- package/dist/approved-WQL4Z4EB.js +73 -0
- package/dist/asset-writes-A5X2T6LQ.js +51 -0
- package/dist/assign-UMNHINRA.js +80 -0
- package/dist/audience-size-Q7DZ6TGM.js +76 -0
- package/dist/audience-writes-SNFFF2QR.js +328 -0
- package/dist/audience-writes-SNFFF2QR.js.map +1 -0
- package/dist/audiences-HBJGEGKL.js +106 -0
- package/dist/audiences-RDQZNGPI.js +280 -0
- package/dist/audiences-TA636UBN.js +85 -0
- package/dist/audit-H3F6FZNE.js +154 -0
- package/dist/audit-QMCK76AT.js +88 -0
- package/dist/autocomplete-DIBJ57VC.js +114 -0
- package/dist/avatars-UIXRGLPA.js +38 -0
- package/dist/bid-pricing-OMY2F2SB.js +103 -0
- package/dist/brand-WV6CAU3M.js +22 -0
- package/dist/brief-PNBP56X2.js +543 -0
- package/dist/brief-PNBP56X2.js.map +1 -0
- package/dist/businesses-56IUB5X4.js +54 -0
- package/dist/campaign-groups-PGJIQV4S.js +99 -0
- package/dist/campaign-writes-MAJ5FGXG.js +176 -0
- package/dist/campaign-writes-WL3YAEGJ.js +168 -0
- package/dist/campaigns-5L4ZTGF7.js +130 -0
- package/dist/campaigns-EK7EUKZD.js +113 -0
- package/dist/campaigns-HCJ3AIDK.js +78 -0
- package/dist/campaigns-NHACWGWS.js +111 -0
- package/dist/canvas-INL3J7HO.js +46 -0
- package/dist/capabilities-Y33EWDMJ.js +147 -0
- package/dist/cards-IWWKA5WH.js +85 -0
- package/dist/catalog-NSA2FUI2.js +66 -0
- package/dist/catalogs-QOE2V4QK.js +783 -0
- package/dist/catalogs-QOE2V4QK.js.map +1 -0
- package/dist/catalogs-SJMYID7N.js +130 -0
- package/dist/changes-2HOF2HSV.js +167 -0
- package/dist/chatgpt-J6MNVQVT.js +47 -0
- package/dist/chats-4HK6UYD2.js +584 -0
- package/dist/check-DJOIL56P.js +169 -0
- package/dist/check-DJOIL56P.js.map +1 -0
- package/dist/chunk-2B2JFTWI.js +296 -0
- package/dist/chunk-2HWX6AWY.js +2235 -0
- package/dist/chunk-2O5CCKV7.js +23 -0
- package/dist/chunk-2W6DMVGH.js +8954 -0
- package/dist/chunk-3BKESS5W.js +66 -0
- package/dist/chunk-3VBPJQ7L.js +288 -0
- package/dist/chunk-3X262BEG.js +19 -0
- package/dist/chunk-4CUBOXBS.js +99 -0
- package/dist/chunk-4CUBOXBS.js.map +1 -0
- package/dist/chunk-4CYB33V3.js +136 -0
- package/dist/chunk-4JB556VC.js +142 -0
- package/dist/chunk-4LZNCDHU.js +46 -0
- package/dist/chunk-4LZNCDHU.js.map +1 -0
- package/dist/chunk-4QYZJPSM.js +207 -0
- package/dist/chunk-4WLJYLRL.js +544 -0
- package/dist/chunk-55AX6DOP.js +86 -0
- package/dist/chunk-55AX6DOP.js.map +1 -0
- package/dist/chunk-56ZJO7TM.js +1320 -0
- package/dist/chunk-5LQGW5UF.js +138 -0
- package/dist/chunk-5U6OL4NN.js +709 -0
- package/dist/chunk-5U6OL4NN.js.map +1 -0
- package/dist/chunk-6IL7JFX5.js +203 -0
- package/dist/chunk-6LNCKT6S.js +35 -0
- package/dist/chunk-6LUDG5AB.js +476 -0
- package/dist/chunk-6OIKNJ7G.js +26 -0
- package/dist/chunk-6UQV5DOD.js +45 -0
- package/dist/chunk-6V4UAC5I.js +2523 -0
- package/dist/chunk-6V4UAC5I.js.map +1 -0
- package/dist/chunk-6WA7QSCN.js +46 -0
- package/dist/chunk-7CHPHER2.js +455 -0
- package/dist/chunk-7J7ASYIM.js +225 -0
- package/dist/chunk-7MMTIJO3.js +220 -0
- package/dist/chunk-7Y3LKR4P.js +5368 -0
- package/dist/chunk-AA3D7GZF.js +125 -0
- package/dist/chunk-AGL7EWP2.js +75 -0
- package/dist/chunk-AHVD6IEI.js +76 -0
- package/dist/chunk-ASJMLTMX.js +106 -0
- package/dist/chunk-AWENMEFC.js +297 -0
- package/dist/chunk-AYX7PB2L.js +1920 -0
- package/dist/chunk-BHZLKLK7.js +69 -0
- package/dist/chunk-BVER7I36.js +58 -0
- package/dist/chunk-C3RZNVLM.js +98 -0
- package/dist/chunk-CA5QBLIZ.js +114 -0
- package/dist/chunk-CKIENAAO.js +156 -0
- package/dist/chunk-CKIENAAO.js.map +1 -0
- package/dist/chunk-CONTVNSN.js +51 -0
- package/dist/chunk-CUTTTFAU.js +783 -0
- package/dist/chunk-D32EWSMB.js +150 -0
- package/dist/chunk-EE6NZ6NG.js +225 -0
- package/dist/chunk-EG6HMBCF.js +188 -0
- package/dist/chunk-EGZM35HT.js +3510 -0
- package/dist/chunk-ESSA3AWR.js +133 -0
- package/dist/chunk-ESSA3AWR.js.map +1 -0
- package/dist/chunk-F3CZFUXZ.js +3187 -0
- package/dist/chunk-F3CZFUXZ.js.map +1 -0
- package/dist/chunk-FHLAJYZE.js +225 -0
- package/dist/chunk-FSNQFZ2Z.js +718 -0
- package/dist/chunk-G67OBCXI.js +91 -0
- package/dist/chunk-GFYGVIT3.js +392 -0
- package/dist/chunk-GRNHQWSV.js +430 -0
- package/dist/chunk-GWQSZWHT.js +42 -0
- package/dist/chunk-HBXR26LB.js +1518 -0
- package/dist/chunk-HKKHOMEQ.js +180 -0
- package/dist/chunk-HKKHOMEQ.js.map +1 -0
- package/dist/chunk-HUO5MZ7S.js +962 -0
- package/dist/chunk-HVL22WUU.js +930 -0
- package/dist/chunk-IA5GLVRV.js +64 -0
- package/dist/chunk-IEPCI2EB.js +479 -0
- package/dist/chunk-IKSBLQTL.js +5471 -0
- package/dist/chunk-IMS53EQU.js +4277 -0
- package/dist/chunk-IMS53EQU.js.map +1 -0
- package/dist/chunk-IRLMIKI7.js +224 -0
- package/dist/chunk-IW4MX7OX.js +399 -0
- package/dist/chunk-J4WOF6WK.js +97 -0
- package/dist/chunk-J63TN3GR.js +89 -0
- package/dist/chunk-JESSFI7R.js +468 -0
- package/dist/chunk-K4QPBXV7.js +61 -0
- package/dist/chunk-K5VDDKKF.js +219 -0
- package/dist/chunk-KM5K47TW.js +152 -0
- package/dist/chunk-KPVZ2CZA.js +642 -0
- package/dist/chunk-KPVZ2CZA.js.map +1 -0
- package/dist/chunk-LGJIJVVH.js +131 -0
- package/dist/chunk-LHSSIUU4.js +604 -0
- package/dist/chunk-LQMPA4DY.js +685 -0
- package/dist/chunk-M3IXPK6U.js +344 -0
- package/dist/chunk-MJU5VKX2.js +91 -0
- package/dist/chunk-MRGU3NPN.js +163 -0
- package/dist/chunk-MSLFPL77.js +454 -0
- package/dist/chunk-MX5NQAK6.js +54 -0
- package/dist/chunk-MX5NQAK6.js.map +1 -0
- package/dist/chunk-NKCWJPMN.js +111 -0
- package/dist/chunk-NT7NCSEB.js +24026 -0
- package/dist/chunk-NT7NCSEB.js.map +1 -0
- package/dist/chunk-O5GZJ6YJ.js +1085 -0
- package/dist/chunk-O5GZJ6YJ.js.map +1 -0
- package/dist/chunk-OADMSHME.js +334 -0
- package/dist/chunk-OGWCLE4W.js +858 -0
- package/dist/chunk-OGWCLE4W.js.map +1 -0
- package/dist/chunk-ONGZKI5J.js +57 -0
- package/dist/chunk-OOZNTJP6.js +26 -0
- package/dist/chunk-OP3NHIFH.js +39 -0
- package/dist/chunk-OU4KWL6B.js +106 -0
- package/dist/chunk-OW3D63SI.js +91 -0
- package/dist/chunk-OW3D63SI.js.map +1 -0
- package/dist/chunk-PLIGHRIQ.js +312 -0
- package/dist/chunk-PLROJ3SX.js +73 -0
- package/dist/chunk-PSM3RI4B.js +167 -0
- package/dist/chunk-Q4O7ICAK.js +84 -0
- package/dist/chunk-Q6XM6ZDB.js +547 -0
- package/dist/chunk-QHRUCSRI.js +197 -0
- package/dist/chunk-QUDPMIW7.js +74 -0
- package/dist/chunk-QZ4YHQLW.js +63 -0
- package/dist/chunk-R2JGUOT6.js +64 -0
- package/dist/chunk-R5I4IHJ5.js +494 -0
- package/dist/chunk-R5NABIJ4.js +1919 -0
- package/dist/chunk-R5NABIJ4.js.map +1 -0
- package/dist/chunk-RJXO66C4.js +66 -0
- package/dist/chunk-RYNN6UUF.js +69 -0
- package/dist/chunk-S4V2GOKV.js +215 -0
- package/dist/chunk-S7D4GTYY.js +191 -0
- package/dist/chunk-SIKCVWM3.js +76 -0
- package/dist/chunk-T4RV7XOC.js +217 -0
- package/dist/chunk-TDUAGNSQ.js +52 -0
- package/dist/chunk-TZRWET3S.js +285 -0
- package/dist/chunk-U5V4CIIG.js +274 -0
- package/dist/chunk-U625CQ3Y.js +287 -0
- package/dist/chunk-UDEVIXKX.js +1254 -0
- package/dist/chunk-UNLFRXST.js +126 -0
- package/dist/chunk-UNLFRXST.js.map +1 -0
- package/dist/chunk-UUDWZIDC.js +246 -0
- package/dist/chunk-VAQBBNLD.js +98 -0
- package/dist/chunk-VCDFBFPT.js +97 -0
- package/dist/chunk-VF3W7CI7.js +325 -0
- package/dist/chunk-VHOOAQY4.js +169 -0
- package/dist/chunk-VK2VC6A2.js +25 -0
- package/dist/chunk-WWPRSJOS.js +94 -0
- package/dist/chunk-WZXMZFVB.js +238 -0
- package/dist/chunk-XKYFNMTB.js +343 -0
- package/dist/chunk-XL42ZEVH.js +170 -0
- package/dist/chunk-XPUQFPIU.js +831 -0
- package/dist/chunk-XQEHLDGP.js +1744 -0
- package/dist/chunk-XQWC223L.js +56 -0
- package/dist/chunk-XYDHBLZ2.js +103 -0
- package/dist/chunk-XZO6ONVI.js +115 -0
- package/dist/chunk-YFFQ3HY4.js +139 -0
- package/dist/chunk-YGUGL4ZL.js +76 -0
- package/dist/chunk-YOHGEF2N.js +7899 -0
- package/dist/chunk-YT3S2XFG.js +84 -0
- package/dist/chunk-ZPCZ4XDB.js +148 -0
- package/dist/cite-2ZJG3FBV.js +191 -0
- package/dist/claim-IGU5W4CT.js +200 -0
- package/dist/cli.js +48 -47
- package/dist/cli.js.map +1 -1
- package/dist/client-MSRCSDB7.js +19 -0
- package/dist/code-T7Z5JDQ2.js +76 -0
- package/dist/companies-HCSBVXCE.js +198 -0
- package/dist/company-SSMY4G2T.js +308 -0
- package/dist/complete-FQNRXUI5.js +84 -0
- package/dist/config-XRPKA5QR.js +88 -0
- package/dist/connect-VXEE3QBU.js +45 -0
- package/dist/content-2JFP747N.js +85 -0
- package/dist/conversation-KKJKZIX5.js +96 -0
- package/dist/conversion-report-G65UHQRO.js +127 -0
- package/dist/conversion-upload-command-Z7IOS6ZG.js +440 -0
- package/dist/conversion-upload-command-Z7IOS6ZG.js.map +1 -0
- package/dist/conversion-writes-333V4OVR.js +122 -0
- package/dist/conversions-7UHCNIAO.js +140 -0
- package/dist/conversions-L6775Q22.js +78 -0
- package/dist/copy-writes-G7GJ5RWS.js +171 -0
- package/dist/copy-writes-G7GJ5RWS.js.map +1 -0
- package/dist/countries-XJVDM635.js +82 -0
- package/dist/create-AXWJECPP.js +239 -0
- package/dist/create-B24XHUGZ.js +62 -0
- package/dist/create-HJKTD5FN.js +218 -0
- package/dist/create-V4NGP5KB.js +135 -0
- package/dist/creatives-HLWMABYL.js +55 -0
- package/dist/creatives-HLWMABYL.js.map +1 -0
- package/dist/creatives-OKFLX67Y.js +118 -0
- package/dist/creatives-WX6GQ37F.js +229 -0
- package/dist/credentials-4JFUH6FN.js +290 -0
- package/dist/critique-4SF44VFJ.js +420 -0
- package/dist/critique-4SF44VFJ.js.map +1 -0
- package/dist/critique-S3PDXLAZ.js +233 -0
- package/dist/critique-S3PDXLAZ.js.map +1 -0
- package/dist/crm-6MLYUEK7.js +323 -0
- package/dist/crm-PUQBWZKE.js +229 -0
- package/dist/crop-V5MSIY5F.js +113 -0
- package/dist/currency-SCSJ5FW2.js +88 -0
- package/dist/custom-conversions-GN4JDS5F.js +128 -0
- package/dist/customers-WXD2LTUC.js +65 -0
- package/dist/decide-PW2NRMRK.js +199 -0
- package/dist/delete-EAJN6ZHT.js +67 -0
- package/dist/delete-GDIFIYA2.js +69 -0
- package/dist/delete-JQG3ZWQX.js +57 -0
- package/dist/delete-L7CGJ23X.js +71 -0
- package/dist/delete-OQREQEGN.js +85 -0
- package/dist/delete-ZR3DVLWU.js +69 -0
- package/dist/demographics-LMRGNO7J.js +141 -0
- package/dist/describe-OHWLLBDE.js +97 -0
- package/dist/describe-YELOXWHY.js +97 -0
- package/dist/dimensions-CLLCVVRY.js +101 -0
- package/dist/discard-K2KIIFJQ.js +69 -0
- package/dist/discover-SQJLRS4G.js +93 -0
- package/dist/discover-UJMDGDQO.js +172 -0
- package/dist/domain-CJX5JSLS.js +101 -0
- package/dist/download-HFDBP6BO.js +172 -0
- package/dist/download-SZ5P3GLV.js +337 -0
- package/dist/draft-7QDE2Z3N.js +315 -0
- package/dist/draft-A7ZQPUFS.js +579 -0
- package/dist/draft-A7ZQPUFS.js.map +1 -0
- package/dist/draft-ILXHFWTT.js +134 -0
- package/dist/draft-NUFU5YME.js +374 -0
- package/dist/draft-QSTD3DH2.js +220 -0
- package/dist/draft-TV5IH5U4.js +260 -0
- package/dist/draft-WNMHUFAH.js +138 -0
- package/dist/draft-XJP3SCZ6.js +333 -0
- package/dist/draft-XJP3SCZ6.js.map +1 -0
- package/dist/engine/index.js +15 -15
- package/dist/env-3256G2OE.js +53 -0
- package/dist/experiment-5L5USMAL.js +1397 -0
- package/dist/experiments-CFBG5UOT.js +237 -0
- package/dist/experiments-CFBG5UOT.js.map +1 -0
- package/dist/export-YSOM4E3B.js +168 -0
- package/dist/extract-7FYXXEQZ.js +143 -0
- package/dist/facets-2FRELYRC.js +117 -0
- package/dist/favorites-LTG2F6W2.js +178 -0
- package/dist/feed-RSBWEI75.js +177 -0
- package/dist/feedback-LZSJR5KL.js +116 -0
- package/dist/feedback-LZSJR5KL.js.map +1 -0
- package/dist/feedback-PQUM7UBT.js +114 -0
- package/dist/feedback-record-4MVI4O3Q.js +270 -0
- package/dist/feedback-record-4MVI4O3Q.js.map +1 -0
- package/dist/fetch-3PWYTX4R.js +139 -0
- package/dist/fetch-FLQYW27W.js +204 -0
- package/dist/find-SHHDWCPM.js +144 -0
- package/dist/fit-4XCDLF7C.js +65 -0
- package/dist/flows-4ALWJVNF.js +340 -0
- package/dist/follow-N4TKU3UM.js +94 -0
- package/dist/follow-competitors-AHQ57BWS.js +112 -0
- package/dist/following-CEYH33DW.js +113 -0
- package/dist/fonts-CYJ5EFR4.js +40 -0
- package/dist/forecast-AH3AFVJ7.js +170 -0
- package/dist/forecast-AH3AFVJ7.js.map +1 -0
- package/dist/forecast-SG2VUBZD.js +121 -0
- package/dist/funding-X7M5WLDX.js +85 -0
- package/dist/funnel-F7DS7PUN.js +397 -0
- package/dist/ga4-QPBAKGSH.js +55 -0
- package/dist/generate-LVBI3VDD.js +263 -0
- package/dist/get-DMV7KG2F.js +92 -0
- package/dist/get-EA7AX4NW.js +59 -0
- package/dist/get-EOSJWMWT.js +38 -0
- package/dist/get-HVQHHDW6.js +74 -0
- package/dist/get-KQLCVQCK.js +56 -0
- package/dist/get-NAOMB6Q2.js +62 -0
- package/dist/get-XYJBQFIT.js +62 -0
- package/dist/get-XZ7XPXZE.js +82 -0
- package/dist/gif-XJ26IWAP.js +111 -0
- package/dist/google-ED4VGLSX.js +3301 -0
- package/dist/google-ED4VGLSX.js.map +1 -0
- package/dist/google-QOKWSPOA.js +163 -0
- package/dist/google-ads-B4FBPQ7O.js +198 -0
- package/dist/group-7EYM3PNJ.js +43 -0
- package/dist/group-GDTEICRY.js +43 -0
- package/dist/gsc-KVIAZMF4.js +30 -0
- package/dist/history-22YGILIT.js +69 -0
- package/dist/history-E3JGYADF.js +102 -0
- package/dist/history-HKCSYH5L.js +153 -0
- package/dist/hubspot-LEW2RP5D.js +814 -0
- package/dist/icon-JLVEYF34.js +138 -0
- package/dist/ideas-JAIU4GC4.js +45 -0
- package/dist/images-ZG6RRAEP.js +92 -0
- package/dist/improve-XSHWCMZS.js +86 -0
- package/dist/ingest-GTXBGUNQ.js +28 -0
- package/dist/ingest-SX7K6GNE.js +131 -0
- package/dist/insights-IVUUWSQL.js +132 -0
- package/dist/insights-PJPQB46E.js +658 -0
- package/dist/inspect-55BXSPJG.js +192 -0
- package/dist/inspiration-NBOKHPZ5.js +53 -0
- package/dist/instant-experiences-ARST4KWB.js +265 -0
- package/dist/instant-experiences-ARST4KWB.js.map +1 -0
- package/dist/intent-KSVTHFFE.js +95 -0
- package/dist/job-4VXDCYSG.js +202 -0
- package/dist/job-create-NZEZDOZT.js +109 -0
- package/dist/job-status-XI3ENS7D.js +74 -0
- package/dist/keep-UYNOC3JZ.js +78 -0
- package/dist/keyword-gap-7UVDSID5.js +130 -0
- package/dist/keyword-metrics-QFRXZRAQ.js +200 -0
- package/dist/keywords-for-site-Q4BCJ4PQ.js +131 -0
- package/dist/knowledge-LVE3J3AK.js +195 -0
- package/dist/landing-AJYM5GBY.js +28 -0
- package/dist/landings-SIN3MTUZ.js +151 -0
- package/dist/languages-AIASAINW.js +40 -0
- package/dist/languages-RDR6EBNJ.js +55 -0
- package/dist/launches-4TVHXAZT.js +19 -0
- package/dist/layerize-OLVGZRND.js +190 -0
- package/dist/lead-routes-ZOQDPCR3.js +733 -0
- package/dist/leads-M57K5EDK.js +542 -0
- package/dist/leads-M57K5EDK.js.map +1 -0
- package/dist/leads-YSDLFBHN.js +115 -0
- package/dist/learn-FDQZNIP3.js +207 -0
- package/dist/library-7CLWRDM3.js +212 -0
- package/dist/lighthouse-3ACQ3MVG.js +75 -0
- package/dist/line-item-writes-JARN73DV.js +211 -0
- package/dist/line-items-B5GLDAJ2.js +107 -0
- package/dist/link-YAZF34BZ.js +67 -0
- package/dist/linkedin-MLPAY7IL.js +1345 -0
- package/dist/linkedin-MLPAY7IL.js.map +1 -0
- package/dist/linkedin-person-XDH7Q3PB.js +139 -0
- package/dist/list-6NYRZXKQ.js +76 -0
- package/dist/list-6WISGNQ2.js +65 -0
- package/dist/list-6YBIWX44.js +50 -0
- package/dist/list-72JQGWNO.js +154 -0
- package/dist/list-FX7OG3OJ.js +67 -0
- package/dist/list-ITPBLMV3.js +51 -0
- package/dist/list-J43GOBOX.js +57 -0
- package/dist/list-K4Z3BOWI.js +93 -0
- package/dist/list-ONSYTCX2.js +306 -0
- package/dist/locations-UNSREUBX.js +69 -0
- package/dist/locations-XAC3GME3.js +40 -0
- package/dist/log-PPNNFETI.js +95 -0
- package/dist/logo-UNVIMA4B.js +19 -0
- package/dist/lookup-L5QG3BWH.js +23 -0
- package/dist/make-YWW7Q4T5.js +1368 -0
- package/dist/make-YWW7Q4T5.js.map +1 -0
- package/dist/map-QILMIKS7.js +445 -0
- package/dist/mcp-GOKFM4PF.js +729 -0
- package/dist/media-BN6B75NF.js +18 -0
- package/dist/media-YDDWV32Y.js +89 -0
- package/dist/media-sources-HABLVJE3.js +35 -0
- package/dist/members-B4UI6ISY.js +47 -0
- package/dist/meme-2MERLAVW.js +108 -0
- package/dist/meta-7FJQD44L.js +124 -0
- package/dist/metrics-SBKBEZJR.js +152 -0
- package/dist/models-ZBLBNNEH.js +155 -0
- package/dist/normalize-5WVEQJXD.js +806 -0
- package/dist/normalize-YPQBHWYS.js +144 -0
- package/dist/older-spellings-KGYXGRHU.js +70 -0
- package/dist/older-spellings-KGYXGRHU.js.map +1 -0
- package/dist/options-BV3TVUCK.js +125 -0
- package/dist/organization-4OTGNRHP.js +949 -0
- package/dist/output-FX4KJAO5.js +24 -0
- package/dist/page-5KWQ7PM3.js +105 -0
- package/dist/page-photos-AUTUSCVR.js +119 -0
- package/dist/page-photos-AUTUSCVR.js.map +1 -0
- package/dist/pages-HKTAGXH3.js +67 -0
- package/dist/performance-4MWQVTTA.js +5565 -0
- package/dist/performance-TKE7NQF6.js +27 -0
- package/dist/pinterest-UDX53CWY.js +105 -0
- package/dist/pixels-BSNCVT77.js +109 -0
- package/dist/pixels-TR2PAYWV.js +62 -0
- package/dist/plan-V57AATQ5.js +208 -0
- package/dist/posts-JHMXNHDV.js +36 -0
- package/dist/preview-VY7UH2SK.js +245 -0
- package/dist/preview-XUG4K4KV.js +101 -0
- package/dist/profile-PV3R3BEG.js +159 -0
- package/dist/promoted-tweet-writes-O3S5OKUZ.js +183 -0
- package/dist/promoted-tweets-4ZKSEC4I.js +119 -0
- package/dist/properties-U2XUD2M6.js +101 -0
- package/dist/publish-4RAYD7VI.js +350 -0
- package/dist/query-4C6UQN42.js +62 -0
- package/dist/query-7FWE7GLV.js +231 -0
- package/dist/query-7Y2Y6YFI.js +236 -0
- package/dist/questionnaire-3IPJXJT7.js +94 -0
- package/dist/read-WEQLEI7R.js +141 -0
- package/dist/reddit-2FWCB7XY.js +29 -0
- package/dist/refresh-SGDB4QOD.js +97 -0
- package/dist/refresh-WZBVPKWE.js +42 -0
- package/dist/release-YL3ZII3Z.js +63 -0
- package/dist/relevant-pages-PF3LLUED.js +99 -0
- package/dist/remove-52MSQXSW.js +49 -0
- package/dist/remove-EIV7LJUA.js +53 -0
- package/dist/reopen-CW27MUJH.js +66 -0
- package/dist/rerun-4WUZY4SO.js +98 -0
- package/dist/rerun-4WUZY4SO.js.map +1 -0
- package/dist/research-234BOCKM.js +265 -0
- package/dist/research-RABLL4HR.js +75 -0
- package/dist/reset-5KJDDVJL.js +57 -0
- package/dist/reset-REUL47CB.js +57 -0
- package/dist/resolve-WRDEHLYL.js +124 -0
- package/dist/retry-2A5HV4SN.js +63 -0
- package/dist/retry-FNT2XVH3.js +65 -0
- package/dist/retry-failed-ND7UXYTJ.js +45 -0
- package/dist/revenue-YQV2BRGA.js +92 -0
- package/dist/revenue-YQV2BRGA.js.map +1 -0
- package/dist/rule-writes-L7BRELYW.js +531 -0
- package/dist/rule-writes-L7BRELYW.js.map +1 -0
- package/dist/rules-2CUG2YG7.js +217 -0
- package/dist/rules-5DIOAOOO.js +55 -0
- package/dist/rules-5DIOAOOO.js.map +1 -0
- package/dist/run-RKLNKV2U.js +73 -0
- package/dist/run-YKGN3GQR.js +69 -0
- package/dist/scaffold-ad-SPU2HKHU.js +1514 -0
- package/dist/scaffold-ad-SPU2HKHU.js.map +1 -0
- package/dist/scaffold-static-ad-ENGGU26W.js +1013 -0
- package/dist/scaffold-static-ad-ENGGU26W.js.map +1 -0
- package/dist/scaffold-video-OZHIU3SZ.js +886 -0
- package/dist/scaffold-video-OZHIU3SZ.js.map +1 -0
- package/dist/schedule-774JCRVM.js +67 -0
- package/dist/schedule-PKKSZ5RX.js +64 -0
- package/dist/scheduled-agents-ZI3EWKAT.js +55 -0
- package/dist/schema-BXNL4LKR.js +135 -0
- package/dist/schema-GFMVUZL2.js +152 -0
- package/dist/scrape-KKLE4WAU.js +2209 -0
- package/dist/screenshot-K6XOER6Z.js +103 -0
- package/dist/search-43ULIJL3.js +91 -0
- package/dist/search-AXUNJUWY.js +51 -0
- package/dist/search-DLLJEYMB.js +26 -0
- package/dist/search-LWWTXBB2.js +92 -0
- package/dist/search-VU6GI3U3.js +228 -0
- package/dist/search-XO365KES.js +177 -0
- package/dist/search-copy-BHNLLCUV.js +168 -0
- package/dist/seeds-6ROVZBFB.js +101 -0
- package/dist/select-4KMA72MV.js +111 -0
- package/dist/select-4KMA72MV.js.map +1 -0
- package/dist/sends-P6OPCYH5.js +349 -0
- package/dist/sequences-DP4BHM3E.js +146 -0
- package/dist/set-prompt-AII24NMX.js +200 -0
- package/dist/set-prompt-AII24NMX.js.map +1 -0
- package/dist/setup-links-T5TJZA3E.js +144 -0
- package/dist/shared-24IPELBM.js +32 -0
- package/dist/shopify-OQEKI7HC.js +4009 -0
- package/dist/site-QRLBZPEV.js +180 -0
- package/dist/sitemaps-SWADO4SI.js +77 -0
- package/dist/sites-H3FYJQFO.js +97 -0
- package/dist/skills-OYO6Y3DQ.js +47 -0
- package/dist/sources-U2WRH6D7.js +457 -0
- package/dist/sources-Y2BKZVXA.js +30 -0
- package/dist/stale-KE4K36UE.js +91 -0
- package/dist/stale-KE4K36UE.js.map +1 -0
- package/dist/stats-TTJHXR3E.js +34 -0
- package/dist/status-4BSXND3I.js +65 -0
- package/dist/sticker-CRIAIO75.js +103 -0
- package/dist/stock-TOFKLWSR.js +212 -0
- package/dist/studies-VFNWS6ND.js +250 -0
- package/dist/studio-WD364TWB.js +49 -0
- package/dist/study-writes-R7XYH3VH.js +472 -0
- package/dist/study-writes-R7XYH3VH.js.map +1 -0
- package/dist/suggest-GX4IROQN.js +66 -0
- package/dist/sync-BU7HU3FS.js +55 -0
- package/dist/sync-GQL5JX4U.js +57 -0
- package/dist/sync-VNBBOVBU.js +279 -0
- package/dist/sync-definition-EOARPSBS.js +71 -0
- package/dist/tag-SQ5ROLTP.js +57 -0
- package/dist/tag-manager-7S7PVYIJ.js +43 -0
- package/dist/tags-2226Q3VK.js +23 -0
- package/dist/tags-7QIBFIBX.js +227 -0
- package/dist/tags-BNWKAV3H.js +23 -0
- package/dist/tags-HG5EBHSO.js +23 -0
- package/dist/tags-WTN4EBT5.js +26 -0
- package/dist/targeting-SSI2F7XM.js +763 -0
- package/dist/targeting-SSI2F7XM.js.map +1 -0
- package/dist/targeting-constants-6KZXMRNI.js +118 -0
- package/dist/targeting-criteria-QSCRW75G.js +113 -0
- package/dist/targets-3KT3DO6O.js +106 -0
- package/dist/terms-IRLEAMIY.js +102 -0
- package/dist/testimonials-35FTFNQ5.js +32 -0
- package/dist/themes-WTMD2RE2.js +96 -0
- package/dist/themes-WTMD2RE2.js.map +1 -0
- package/dist/top-companies-JAWMSK2Q.js +111 -0
- package/dist/transcript-OIYU7F4E.js +165 -0
- package/dist/translate-S7ZQXQJH.js +604 -0
- package/dist/translate-S7ZQXQJH.js.map +1 -0
- package/dist/triggers-7QRQFTVM.js +144 -0
- package/dist/tweets-7XVF7PJO.js +123 -0
- package/dist/unfollow-ZCP6D2SC.js +46 -0
- package/dist/unlink-PYCYTYVN.js +70 -0
- package/dist/unstage-2OUF6ELM.js +88 -0
- package/dist/unstage-YADONHH6.js +96 -0
- package/dist/update-DEBDSBDI.js +81 -0
- package/dist/update-IDUSNDOI.js +192 -0
- package/dist/update-NG3HUYZZ.js +101 -0
- package/dist/update-P5IT7AIN.js +155 -0
- package/dist/update-U6NU7OXI.js +66 -0
- package/dist/upload-4F2JICEH.js +137 -0
- package/dist/upload-SS64KHDS.js +155 -0
- package/dist/upscale-JNNXDN6X.js +109 -0
- package/dist/url-options-EDPKAPPP.js +131 -0
- package/dist/url-params-4G26OEOO.js +101 -0
- package/dist/use-TKFP6WVP.js +111 -0
- package/dist/validate-HER6GMOZ.js +136 -0
- package/dist/validate-HER6GMOZ.js.map +1 -0
- package/dist/variant-3VTKOQUR.js +338 -0
- package/dist/videos-EDTBHLOZ.js +146 -0
- package/dist/videos-JRNJH66J.js +41 -0
- package/dist/view-6HX3FYMS.js +133 -0
- package/dist/viewer-check-OBBBAYV5.js +83 -0
- package/dist/web-GPUEUIDT.js +173 -0
- package/dist/winners-MEC77MZ4.js +113 -0
- package/dist/winning-ads-2DECFON4.js +86 -0
- package/dist/write-commands-AU2NJ4MR.js +1525 -0
- package/dist/write-commands-AU2NJ4MR.js.map +1 -0
- package/dist/write-commands-D5M5A4YI.js +721 -0
- package/dist/write-commands-LQVERLAQ.js +206 -0
- package/dist/write-commands-Y6U4WABA.js +1170 -0
- package/dist/write-commands-Y6U4WABA.js.map +1 -0
- package/dist/x-4TM5RET4.js +47 -0
- package/package.json +1 -1
- package/dist/account-52WDLW4Z.js +0 -82
- package/dist/account-7KZ7MHMN.js +0 -82
- package/dist/account-NSBALYYS.js +0 -139
- package/dist/account-assets-EPEYTJFD.js +0 -290
- package/dist/account-level-VD4NLB2D.js +0 -611
- package/dist/account-level-VD4NLB2D.js.map +0 -1
- package/dist/account-reads-CQIJCPCH.js +0 -219
- package/dist/account-reads-CQIJCPCH.js.map +0 -1
- package/dist/account-users-NUI3ILRE.js +0 -64
- package/dist/account-users-NUI3ILRE.js.map +0 -1
- package/dist/account-writes-3BJSUM2V.js +0 -68
- package/dist/accounts-A47QUTTB.js +0 -76
- package/dist/accounts-E5TF2AFI.js +0 -115
- package/dist/accounts-FLKNFDIE.js +0 -713
- package/dist/accounts-I2ZLR76R.js +0 -80
- package/dist/accounts-ZV4IXOF5.js +0 -119
- package/dist/actions-IR47GVZ6.js +0 -55
- package/dist/active-entities-XRSJNBOV.js +0 -103
- package/dist/activecampaign-MNJYIWJL.js +0 -938
- package/dist/activities-ZDWREYR7.js +0 -75
- package/dist/ad-group-writes-KU4QMQZP.js +0 -172
- package/dist/ad-groups-NMW2G32A.js +0 -70
- package/dist/ad-writes-7NOFTOM4.js +0 -176
- package/dist/add-25YZMFSH.js +0 -85
- package/dist/add-4I25INAO.js +0 -107
- package/dist/add-7MAL7JRX.js +0 -81
- package/dist/add-D44VCDRU.js +0 -148
- package/dist/add-JO4ZPS23.js +0 -97
- package/dist/add-QMTD6EGI.js +0 -305
- package/dist/add-accounts-EKMSHAA4.js +0 -91
- package/dist/ads-4YZYNU66.js +0 -128
- package/dist/ads-DGL5SGP3.js +0 -120
- package/dist/ads-P4Z3MLKS.js +0 -79
- package/dist/ads-PWTQC6KV.js +0 -48
- package/dist/adsets-PSVCPCE3.js +0 -182
- package/dist/advertisers-7NAPI5ZU.js +0 -125
- package/dist/advertisers-LOIXTTGP.js +0 -123
- package/dist/analytics-6AHC3J4L.js +0 -447
- package/dist/analytics-NL2KGDLK.js +0 -2437
- package/dist/animate-VX7E7KJE.js +0 -480
- package/dist/approved-E4EZA5RT.js +0 -73
- package/dist/asset-writes-NDSHY5OT.js +0 -50
- package/dist/assign-NKHIHVGI.js +0 -80
- package/dist/audience-size-WEOM6XIL.js +0 -76
- package/dist/audience-writes-4KQXVGHO.js +0 -327
- package/dist/audience-writes-4KQXVGHO.js.map +0 -1
- package/dist/audiences-P3SPTAJT.js +0 -280
- package/dist/audiences-T5LMTT3B.js +0 -85
- package/dist/audiences-UHLVATR6.js +0 -106
- package/dist/audit-46DO2HV3.js +0 -88
- package/dist/audit-4RIBJ7BR.js +0 -154
- package/dist/autocomplete-FMTJDXTL.js +0 -114
- package/dist/avatars-LY5SFMWO.js +0 -38
- package/dist/bid-pricing-MQ7WLV5U.js +0 -103
- package/dist/brand-LR5IXW3W.js +0 -22
- package/dist/brief-4DSXIX3F.js +0 -543
- package/dist/brief-4DSXIX3F.js.map +0 -1
- package/dist/businesses-TRFYMZ4I.js +0 -54
- package/dist/campaign-groups-EZYLKMO2.js +0 -99
- package/dist/campaign-writes-P5XPFTRK.js +0 -176
- package/dist/campaign-writes-UMENYMKO.js +0 -168
- package/dist/campaigns-2MTON2IE.js +0 -130
- package/dist/campaigns-PP2DQMJE.js +0 -113
- package/dist/campaigns-SWZJVE2T.js +0 -78
- package/dist/campaigns-TAFDM242.js +0 -111
- package/dist/canvas-RKR3ZB4E.js +0 -46
- package/dist/capabilities-45RZ6E6W.js +0 -147
- package/dist/cards-CXKIVM4D.js +0 -85
- package/dist/catalog-TOHUVBEU.js +0 -66
- package/dist/catalogs-4DNLG4AM.js +0 -782
- package/dist/catalogs-4DNLG4AM.js.map +0 -1
- package/dist/catalogs-V7PTEJBO.js +0 -130
- package/dist/changes-5OW3UYMF.js +0 -167
- package/dist/chatgpt-JBMYNVJB.js +0 -47
- package/dist/chats-VOLBYA3R.js +0 -584
- package/dist/check-4DI73QX4.js +0 -107
- package/dist/check-4DI73QX4.js.map +0 -1
- package/dist/chunk-22RM3UOO.js +0 -63
- package/dist/chunk-2CC4CPDT.js +0 -225
- package/dist/chunk-2N7TB346.js +0 -5368
- package/dist/chunk-2Q7K4F4H.js +0 -7899
- package/dist/chunk-2TS2ITSG.js +0 -392
- package/dist/chunk-2YXTXSYG.js +0 -454
- package/dist/chunk-2Z6PFHD2.js +0 -91
- package/dist/chunk-3GXHML4V.js +0 -106
- package/dist/chunk-3QPG2D27.js +0 -125
- package/dist/chunk-3WN5GWX4.js +0 -94
- package/dist/chunk-47VWQ7FQ.js +0 -843
- package/dist/chunk-47VWQ7FQ.js.map +0 -1
- package/dist/chunk-4AO3LSYM.js +0 -73
- package/dist/chunk-4HFM5RCP.js +0 -217
- package/dist/chunk-4NZ47VXO.js +0 -137
- package/dist/chunk-4NZ47VXO.js.map +0 -1
- package/dist/chunk-4QFMRL6O.js +0 -455
- package/dist/chunk-5OC6VUDZ.js +0 -930
- package/dist/chunk-5QNW5PCM.js +0 -106
- package/dist/chunk-5VXEH72O.js +0 -249
- package/dist/chunk-5VXEH72O.js.map +0 -1
- package/dist/chunk-6AMN346B.js +0 -114
- package/dist/chunk-6EOWBGGW.js +0 -191
- package/dist/chunk-6MJKVNLL.js +0 -25
- package/dist/chunk-7NBQQOCU.js +0 -97
- package/dist/chunk-AQRBEPZL.js +0 -138
- package/dist/chunk-AZIXX73C.js +0 -64
- package/dist/chunk-B4BITHOD.js +0 -2235
- package/dist/chunk-B64KJW5C.js +0 -476
- package/dist/chunk-BFAPSFS7.js +0 -1518
- package/dist/chunk-BIBXZJZI.js +0 -97
- package/dist/chunk-BMMXYR7A.js +0 -238
- package/dist/chunk-BNEWJXKU.js +0 -638
- package/dist/chunk-BNEWJXKU.js.map +0 -1
- package/dist/chunk-BXTIG5JL.js +0 -66
- package/dist/chunk-C7KV5O5J.js +0 -274
- package/dist/chunk-CBVUO7SK.js +0 -1744
- package/dist/chunk-CDPX6WAL.js +0 -207
- package/dist/chunk-CF5I4Q5M.js +0 -69
- package/dist/chunk-COOJKEJE.js +0 -312
- package/dist/chunk-CTJWMZPL.js +0 -430
- package/dist/chunk-D5HD46VV.js +0 -163
- package/dist/chunk-DGHSXHZR.js +0 -136
- package/dist/chunk-DHF4FXWS.js +0 -58
- package/dist/chunk-DPOUS5DN.js +0 -287
- package/dist/chunk-EGICPBDY.js +0 -1920
- package/dist/chunk-EJ6EED6I.js +0 -69
- package/dist/chunk-EKOMZH2S.js +0 -685
- package/dist/chunk-ELC42LJJ.js +0 -8954
- package/dist/chunk-FLTAPEVY.js +0 -288
- package/dist/chunk-G4FU6VC5.js +0 -23
- package/dist/chunk-H25GY4U4.js +0 -139
- package/dist/chunk-H3RCEM6L.js +0 -61
- package/dist/chunk-H6ASYVQX.js +0 -544
- package/dist/chunk-H7LKYGLJ.js +0 -24026
- package/dist/chunk-H7LKYGLJ.js.map +0 -1
- package/dist/chunk-HM4NWA72.js +0 -5471
- package/dist/chunk-HPF3USL2.js +0 -52
- package/dist/chunk-I33FO2ON.js +0 -170
- package/dist/chunk-IAE24RKD.js +0 -604
- package/dist/chunk-IB6VWG32.js +0 -755
- package/dist/chunk-IB6VWG32.js.map +0 -1
- package/dist/chunk-IGCS3X4F.js +0 -150
- package/dist/chunk-IJ6WA2JW.js +0 -148
- package/dist/chunk-ITIUWJGQ.js +0 -131
- package/dist/chunk-IYDESWW4.js +0 -74
- package/dist/chunk-J4BJLHLQ.js +0 -3510
- package/dist/chunk-JAC6JVCI.js +0 -26
- package/dist/chunk-JAME5NBT.js +0 -42
- package/dist/chunk-JCDCIQMA.js +0 -479
- package/dist/chunk-JGK2FDZW.js +0 -1919
- package/dist/chunk-JGK2FDZW.js.map +0 -1
- package/dist/chunk-JSOOLOHP.js +0 -468
- package/dist/chunk-JT3UUBID.js +0 -142
- package/dist/chunk-KGJ6EIX3.js +0 -76
- package/dist/chunk-KUI74TNG.js +0 -169
- package/dist/chunk-L4QEMWNJ.js +0 -111
- package/dist/chunk-L7I47VGM.js +0 -46
- package/dist/chunk-LAOCXV6Z.js +0 -98
- package/dist/chunk-LJEJCIHR.js +0 -246
- package/dist/chunk-LQACNCAV.js +0 -334
- package/dist/chunk-M4KFO256.js +0 -188
- package/dist/chunk-MC5F2L64.js +0 -962
- package/dist/chunk-MCJ5I5LR.js +0 -3187
- package/dist/chunk-MCJ5I5LR.js.map +0 -1
- package/dist/chunk-MIHY534L.js +0 -39
- package/dist/chunk-MKG57P2E.js +0 -783
- package/dist/chunk-MKOI6QYM.js +0 -225
- package/dist/chunk-MPTNN35I.js +0 -325
- package/dist/chunk-MSIOGH67.js +0 -66
- package/dist/chunk-MTW2NDDD.js +0 -98
- package/dist/chunk-MZPS46OR.js +0 -76
- package/dist/chunk-NXNOXZGB.js +0 -2523
- package/dist/chunk-NXNOXZGB.js.map +0 -1
- package/dist/chunk-O2ECZKXP.js +0 -197
- package/dist/chunk-O5VSYBUA.js +0 -343
- package/dist/chunk-OJZKY5UM.js +0 -46
- package/dist/chunk-OJZKY5UM.js.map +0 -1
- package/dist/chunk-P4UCSXNA.js +0 -156
- package/dist/chunk-P4UCSXNA.js.map +0 -1
- package/dist/chunk-Q3G4ZI2U.js +0 -84
- package/dist/chunk-Q5XUFN2W.js +0 -35
- package/dist/chunk-Q736UFSD.js +0 -75
- package/dist/chunk-QLO4RNHU.js +0 -51
- package/dist/chunk-QSS34JWZ.js +0 -224
- package/dist/chunk-QVHZTCB5.js +0 -1254
- package/dist/chunk-QVQKCVP7.js +0 -85
- package/dist/chunk-QVQKCVP7.js.map +0 -1
- package/dist/chunk-RRKUXGAU.js +0 -26
- package/dist/chunk-RVIBHENP.js +0 -344
- package/dist/chunk-S5S54J2K.js +0 -56
- package/dist/chunk-SIRRBWQ2.js +0 -215
- package/dist/chunk-TEJOILEY.js +0 -203
- package/dist/chunk-TEQEZAJI.js +0 -1320
- package/dist/chunk-TLQY4QBW.js +0 -84
- package/dist/chunk-TNI7CN4L.js +0 -547
- package/dist/chunk-TPJ34LXX.js +0 -220
- package/dist/chunk-U6AWJIFP.js +0 -225
- package/dist/chunk-UK4XSLV2.js +0 -296
- package/dist/chunk-URGXEDFV.js +0 -76
- package/dist/chunk-V5ODOBBI.js +0 -399
- package/dist/chunk-V7EN5LFS.js +0 -115
- package/dist/chunk-VAURJ4QJ.js +0 -89
- package/dist/chunk-VAV5CCDD.js +0 -167
- package/dist/chunk-VWHUO3AP.js +0 -103
- package/dist/chunk-W3TZPHZO.js +0 -285
- package/dist/chunk-WTPID22G.js +0 -152
- package/dist/chunk-WZATC4O5.js +0 -297
- package/dist/chunk-X25XRSDP.js +0 -57
- package/dist/chunk-XA76OGSL.js +0 -718
- package/dist/chunk-XGG72YRO.js +0 -91
- package/dist/chunk-XHWHBGKX.js +0 -4277
- package/dist/chunk-XHWHBGKX.js.map +0 -1
- package/dist/chunk-XWAOECD2.js +0 -831
- package/dist/chunk-YAMKCMAS.js +0 -219
- package/dist/chunk-YDALLZNS.js +0 -494
- package/dist/chunk-YRWCXYWW.js +0 -178
- package/dist/chunk-YRWCXYWW.js.map +0 -1
- package/dist/chunk-Z3RGBLVJ.js +0 -64
- package/dist/chunk-Z5JWFNG4.js +0 -19
- package/dist/chunk-ZCGM7ZWM.js +0 -45
- package/dist/cite-WCAOCOO5.js +0 -191
- package/dist/claim-3UMAFZEM.js +0 -200
- package/dist/client-VCKP6WBR.js +0 -19
- package/dist/code-VXOTFGD2.js +0 -76
- package/dist/companies-RL5A26AT.js +0 -198
- package/dist/company-DJ44F5C6.js +0 -308
- package/dist/complete-PGNIP3LN.js +0 -84
- package/dist/config-UR45YCIN.js +0 -88
- package/dist/connect-ROARWN63.js +0 -45
- package/dist/content-EQQIKG5H.js +0 -85
- package/dist/conversation-GDFMJL7X.js +0 -96
- package/dist/conversion-report-2FREFML5.js +0 -127
- package/dist/conversion-upload-command-JAGV6GMG.js +0 -439
- package/dist/conversion-upload-command-JAGV6GMG.js.map +0 -1
- package/dist/conversion-writes-JZIJSQ7T.js +0 -122
- package/dist/conversions-2IFWDQKK.js +0 -140
- package/dist/conversions-Q5EBTEXA.js +0 -78
- package/dist/copy-writes-JVUX3YDL.js +0 -170
- package/dist/copy-writes-JVUX3YDL.js.map +0 -1
- package/dist/countries-GRCU4IGM.js +0 -82
- package/dist/create-B5DIYK5D.js +0 -218
- package/dist/create-BRCSXXFO.js +0 -239
- package/dist/create-PXAUL6FF.js +0 -62
- package/dist/create-R6CMATVY.js +0 -135
- package/dist/creatives-4EPM3RHG.js +0 -118
- package/dist/creatives-D6O6Z46U.js +0 -229
- package/dist/creatives-XNVWQWFF.js +0 -58
- package/dist/creatives-XNVWQWFF.js.map +0 -1
- package/dist/credentials-CLJO7WWY.js +0 -290
- package/dist/critique-MBMKW6SL.js +0 -1451
- package/dist/critique-MBMKW6SL.js.map +0 -1
- package/dist/critique-OUJDTVMI.js +0 -232
- package/dist/critique-OUJDTVMI.js.map +0 -1
- package/dist/crm-H5ITJ2RC.js +0 -229
- package/dist/crm-JJHYRABB.js +0 -323
- package/dist/crop-NE7YX4SS.js +0 -113
- package/dist/currency-EFDQYW5B.js +0 -88
- package/dist/custom-conversions-GQTU5E6X.js +0 -128
- package/dist/customers-C5YXAVXI.js +0 -65
- package/dist/decide-6Q5X3V3F.js +0 -199
- package/dist/delete-3GYCQK6B.js +0 -57
- package/dist/delete-EKKOEB3N.js +0 -69
- package/dist/delete-NBUDIGSD.js +0 -69
- package/dist/delete-QHDDR66K.js +0 -85
- package/dist/delete-SP66F7ZV.js +0 -71
- package/dist/delete-WZ3KVVX5.js +0 -67
- package/dist/demographics-O7AJW7DO.js +0 -141
- package/dist/describe-DJPIUEFE.js +0 -97
- package/dist/describe-MAGTSOW4.js +0 -97
- package/dist/dimensions-IC2H7V3H.js +0 -101
- package/dist/discard-RMVZAX2J.js +0 -69
- package/dist/discover-BPUUWRBP.js +0 -172
- package/dist/discover-PSL2NBJL.js +0 -93
- package/dist/domain-J3ZMBOHS.js +0 -101
- package/dist/download-EHDJXBAC.js +0 -337
- package/dist/download-ZVOGLTFB.js +0 -172
- package/dist/draft-27NMTARB.js +0 -134
- package/dist/draft-6PJD3MCW.js +0 -374
- package/dist/draft-GCOCG4PO.js +0 -315
- package/dist/draft-GSDDK6FO.js +0 -614
- package/dist/draft-GSDDK6FO.js.map +0 -1
- package/dist/draft-JESKGZ6O.js +0 -138
- package/dist/draft-MWYKIZC4.js +0 -260
- package/dist/draft-TPR3DH5N.js +0 -220
- package/dist/draft-ZPGGWU7E.js +0 -332
- package/dist/draft-ZPGGWU7E.js.map +0 -1
- package/dist/env-NZXNMWSD.js +0 -53
- package/dist/experiment-XAYSEYTU.js +0 -1397
- package/dist/experiments-MM4BYHRH.js +0 -236
- package/dist/experiments-MM4BYHRH.js.map +0 -1
- package/dist/export-W54UZ62P.js +0 -168
- package/dist/extract-JMY6YRPW.js +0 -143
- package/dist/facets-B5AZAU2C.js +0 -117
- package/dist/favorites-Y6CT6NSQ.js +0 -178
- package/dist/feed-35BRQPTH.js +0 -177
- package/dist/feedback-2EVDGTEN.js +0 -115
- package/dist/feedback-2EVDGTEN.js.map +0 -1
- package/dist/feedback-4MCMOMVN.js +0 -114
- package/dist/feedback-record-DL7UEU2H.js +0 -269
- package/dist/feedback-record-DL7UEU2H.js.map +0 -1
- package/dist/fetch-I6P72CDL.js +0 -139
- package/dist/fetch-JDNFK476.js +0 -204
- package/dist/find-SVGRA7IA.js +0 -144
- package/dist/fit-DKVH5BDW.js +0 -65
- package/dist/flows-LURTZICL.js +0 -340
- package/dist/follow-24QSDNAG.js +0 -94
- package/dist/follow-competitors-AG4E4XFA.js +0 -112
- package/dist/following-YGM6TBK3.js +0 -113
- package/dist/fonts-HUXFDDAE.js +0 -39
- package/dist/forecast-HMNQZFVL.js +0 -169
- package/dist/forecast-HMNQZFVL.js.map +0 -1
- package/dist/forecast-UHTW4Y7Q.js +0 -121
- package/dist/funding-WZNGXRLJ.js +0 -85
- package/dist/funnel-QM7WFFMD.js +0 -397
- package/dist/ga4-W3U5YTRT.js +0 -55
- package/dist/generate-KAWRRYTT.js +0 -263
- package/dist/get-237TYJZT.js +0 -82
- package/dist/get-3MTAVNTP.js +0 -56
- package/dist/get-5SPNAIUQ.js +0 -62
- package/dist/get-FWPR2YPC.js +0 -62
- package/dist/get-GEUSRD5Y.js +0 -59
- package/dist/get-JIZPYK3Z.js +0 -74
- package/dist/get-TS2ZJDCQ.js +0 -38
- package/dist/get-YWDZYEAC.js +0 -92
- package/dist/gif-NP6EDGEE.js +0 -111
- package/dist/google-3CAUWNWE.js +0 -3300
- package/dist/google-3CAUWNWE.js.map +0 -1
- package/dist/google-DTSLO3PT.js +0 -163
- package/dist/google-ads-RZOQQDQN.js +0 -198
- package/dist/group-3DT4UYSR.js +0 -43
- package/dist/group-OEKKCFXT.js +0 -43
- package/dist/gsc-4FEFPFPB.js +0 -30
- package/dist/history-H7S7XRBX.js +0 -153
- package/dist/history-XL52537O.js +0 -102
- package/dist/history-YQSYXBJH.js +0 -69
- package/dist/hubspot-2DSISSUI.js +0 -814
- package/dist/icon-43UJTGGE.js +0 -138
- package/dist/ideas-2XBFQJ56.js +0 -45
- package/dist/images-VFRQ32G5.js +0 -92
- package/dist/improve-IMXQN6OD.js +0 -86
- package/dist/ingest-4RPLN54K.js +0 -28
- package/dist/ingest-TPVH44VI.js +0 -131
- package/dist/insights-BR3456EI.js +0 -658
- package/dist/insights-UVCFOB3N.js +0 -132
- package/dist/inspect-VD3GVXDU.js +0 -192
- package/dist/inspiration-XZI5KCQW.js +0 -53
- package/dist/instant-experiences-2LKF7XVK.js +0 -264
- package/dist/instant-experiences-2LKF7XVK.js.map +0 -1
- package/dist/intent-F5NTOSQC.js +0 -95
- package/dist/job-GOX3KIKG.js +0 -202
- package/dist/job-create-F2PQSN3C.js +0 -109
- package/dist/job-status-3FMA5D7T.js +0 -74
- package/dist/keep-23ZYMWPG.js +0 -78
- package/dist/keyword-gap-EB5QATYN.js +0 -130
- package/dist/keyword-metrics-PW2DDIJW.js +0 -200
- package/dist/keywords-for-site-JEPABY6E.js +0 -131
- package/dist/knowledge-7M7DSRF3.js +0 -195
- package/dist/landing-4N6YSB4L.js +0 -28
- package/dist/landings-VNQ4VA2U.js +0 -151
- package/dist/languages-2X22HXM3.js +0 -55
- package/dist/languages-4S26FJDP.js +0 -40
- package/dist/launches-L4EUROCJ.js +0 -19
- package/dist/layerize-6QHQMA7Q.js +0 -190
- package/dist/lead-routes-5TPFJEVH.js +0 -733
- package/dist/leads-4TLOH47R.js +0 -541
- package/dist/leads-4TLOH47R.js.map +0 -1
- package/dist/leads-R5OZJQHW.js +0 -115
- package/dist/learn-AQ2FRFB7.js +0 -207
- package/dist/library-MNJC24E4.js +0 -212
- package/dist/lighthouse-DJMAXFTD.js +0 -75
- package/dist/line-item-writes-LGO7HIJJ.js +0 -211
- package/dist/line-items-AAZVKQ7E.js +0 -107
- package/dist/link-7IGHVARH.js +0 -67
- package/dist/linkedin-UB2CW4KP.js +0 -1344
- package/dist/linkedin-UB2CW4KP.js.map +0 -1
- package/dist/linkedin-person-D6U2ZAUW.js +0 -139
- package/dist/list-2277GCPH.js +0 -51
- package/dist/list-537S75BZ.js +0 -76
- package/dist/list-P44QRX2O.js +0 -154
- package/dist/list-Q52FPW3H.js +0 -50
- package/dist/list-UMJACDTQ.js +0 -67
- package/dist/list-V4PSDBLX.js +0 -93
- package/dist/list-VZKUHY4Y.js +0 -306
- package/dist/list-WIXQXNKB.js +0 -65
- package/dist/list-XK33NCSC.js +0 -57
- package/dist/locations-UWBQLHXW.js +0 -40
- package/dist/locations-WXGOI3VV.js +0 -69
- package/dist/log-6ZKMUTYS.js +0 -95
- package/dist/logo-4LSFZ3ZO.js +0 -19
- package/dist/lookup-WIM5WR25.js +0 -23
- package/dist/make-5CEIJRBC.js +0 -1367
- package/dist/make-5CEIJRBC.js.map +0 -1
- package/dist/map-ZL4MQVJZ.js +0 -445
- package/dist/mcp-GSRYLRD4.js +0 -729
- package/dist/media-34I7UB7Z.js +0 -89
- package/dist/media-KKI3KWLR.js +0 -18
- package/dist/media-sources-VSPVHLYN.js +0 -35
- package/dist/members-L6SXP6GC.js +0 -47
- package/dist/meme-6NFYFQ7T.js +0 -108
- package/dist/meta-2UK7KIE4.js +0 -124
- package/dist/metrics-4AFEEDVP.js +0 -152
- package/dist/models-2ZEM64H5.js +0 -155
- package/dist/normalize-G75RDSE4.js +0 -806
- package/dist/normalize-GK7DH7ZP.js +0 -144
- package/dist/options-FDAAHG7C.js +0 -125
- package/dist/organization-K2FTFAAO.js +0 -949
- package/dist/output-ELEO2Z6R.js +0 -24
- package/dist/page-4X6IBUWG.js +0 -105
- package/dist/page-photos-KNBLMFLN.js +0 -118
- package/dist/page-photos-KNBLMFLN.js.map +0 -1
- package/dist/pages-7HW5YOZV.js +0 -67
- package/dist/performance-N3UROH7Z.js +0 -5565
- package/dist/performance-RG2HR46T.js +0 -27
- package/dist/pinterest-KA6VFDM4.js +0 -105
- package/dist/pixels-D5HF24FI.js +0 -109
- package/dist/pixels-HEI5WVAO.js +0 -62
- package/dist/plan-XCA6R3HZ.js +0 -208
- package/dist/posts-ALGM6ONV.js +0 -36
- package/dist/preview-55TRUF4Q.js +0 -245
- package/dist/preview-NVWIEUHF.js +0 -101
- package/dist/profile-NHUPUCBR.js +0 -159
- package/dist/promoted-tweet-writes-7QZRFDOM.js +0 -183
- package/dist/promoted-tweets-V555Y7DN.js +0 -119
- package/dist/properties-2ZXA5BPJ.js +0 -101
- package/dist/publish-5KR6YLA6.js +0 -350
- package/dist/query-63CTX2PH.js +0 -231
- package/dist/query-DMWY3TDD.js +0 -236
- package/dist/query-K7MYBRTS.js +0 -62
- package/dist/questionnaire-WHE42RD4.js +0 -94
- package/dist/read-NESEKULG.js +0 -141
- package/dist/reddit-XPQ7YAJW.js +0 -29
- package/dist/refresh-ILDEPU5A.js +0 -42
- package/dist/refresh-XFHEBSDU.js +0 -97
- package/dist/release-3ECEF26P.js +0 -63
- package/dist/relevant-pages-XYQKVX3U.js +0 -99
- package/dist/remove-NHE4UT7G.js +0 -49
- package/dist/remove-OCTUC3RB.js +0 -53
- package/dist/reopen-JRI3TYD4.js +0 -66
- package/dist/rerun-HWWYCDT2.js +0 -97
- package/dist/rerun-HWWYCDT2.js.map +0 -1
- package/dist/research-ODPU62BA.js +0 -265
- package/dist/research-TG5CBTYP.js +0 -75
- package/dist/reset-J2NLNITD.js +0 -57
- package/dist/reset-SRU7YJUR.js +0 -57
- package/dist/resolve-KHMMUGB2.js +0 -124
- package/dist/retry-VLH4AO7F.js +0 -65
- package/dist/retry-WP7LWKZF.js +0 -63
- package/dist/retry-failed-R5HPQ3KQ.js +0 -45
- package/dist/revenue-EEIS2AV5.js +0 -91
- package/dist/revenue-EEIS2AV5.js.map +0 -1
- package/dist/rule-writes-QB4IWFCJ.js +0 -530
- package/dist/rule-writes-QB4IWFCJ.js.map +0 -1
- package/dist/rules-FYVD2QBB.js +0 -217
- package/dist/rules-TTUGQAEB.js +0 -99
- package/dist/rules-TTUGQAEB.js.map +0 -1
- package/dist/rules-add-AIXUAZXG.js +0 -465
- package/dist/rules-add-AIXUAZXG.js.map +0 -1
- package/dist/run-AQTACLY6.js +0 -69
- package/dist/run-YA6IWQAJ.js +0 -72
- package/dist/scaffold-ad-IYNFJPT7.js +0 -1513
- package/dist/scaffold-ad-IYNFJPT7.js.map +0 -1
- package/dist/scaffold-static-ad-SPYKSAJR.js +0 -1012
- package/dist/scaffold-static-ad-SPYKSAJR.js.map +0 -1
- package/dist/scaffold-video-BUN27PKS.js +0 -885
- package/dist/scaffold-video-BUN27PKS.js.map +0 -1
- package/dist/schedule-D7EDEM45.js +0 -67
- package/dist/schedule-EH2MOC5C.js +0 -64
- package/dist/scheduled-agents-DTAEP25E.js +0 -55
- package/dist/schema-7B4MVVAS.js +0 -135
- package/dist/schema-Z43AJOJ4.js +0 -152
- package/dist/scrape-VL2RWSTW.js +0 -2209
- package/dist/screenshot-Y6EEXS3Q.js +0 -103
- package/dist/search-CXC7N5XJ.js +0 -51
- package/dist/search-JEXYEAPQ.js +0 -228
- package/dist/search-L3GTZYRW.js +0 -92
- package/dist/search-TXBYKNQC.js +0 -91
- package/dist/search-XHSTUBDY.js +0 -26
- package/dist/search-ZZWIJRXJ.js +0 -177
- package/dist/search-copy-FIPG7OCC.js +0 -168
- package/dist/seeds-ADJKURNG.js +0 -101
- package/dist/select-LWZRF7KV.js +0 -110
- package/dist/select-LWZRF7KV.js.map +0 -1
- package/dist/sends-RS4LWRAC.js +0 -349
- package/dist/sequences-2RPKDKGQ.js +0 -146
- package/dist/set-prompt-YKDH6FYK.js +0 -199
- package/dist/set-prompt-YKDH6FYK.js.map +0 -1
- package/dist/setup-links-OE6PC2YQ.js +0 -144
- package/dist/shared-4GGUIOF2.js +0 -32
- package/dist/shopify-CCPLZI2H.js +0 -4009
- package/dist/site-FW5BBLYG.js +0 -180
- package/dist/sitemaps-Z6IELTQV.js +0 -77
- package/dist/sites-KLAKI2EY.js +0 -97
- package/dist/skills-OJP36EVR.js +0 -47
- package/dist/sources-WPHMWBEK.js +0 -30
- package/dist/sources-X77TGJ52.js +0 -457
- package/dist/stale-SPCDL73V.js +0 -90
- package/dist/stale-SPCDL73V.js.map +0 -1
- package/dist/stats-MIMFX4R7.js +0 -34
- package/dist/status-FLETGJ2A.js +0 -65
- package/dist/sticker-IREEEN7I.js +0 -103
- package/dist/stock-5AOSQH52.js +0 -212
- package/dist/studies-YGYAH3JI.js +0 -250
- package/dist/studio-4EV5S7PR.js +0 -49
- package/dist/study-writes-UPGJB36A.js +0 -471
- package/dist/study-writes-UPGJB36A.js.map +0 -1
- package/dist/suggest-5RTISDLI.js +0 -66
- package/dist/sync-363VKXU3.js +0 -57
- package/dist/sync-OHIXI4I6.js +0 -55
- package/dist/sync-VCAFAYW4.js +0 -279
- package/dist/sync-definition-ZDE5L644.js +0 -70
- package/dist/tag-DSCUKNC3.js +0 -57
- package/dist/tag-manager-IINALUEJ.js +0 -43
- package/dist/tags-6MN3AWKN.js +0 -23
- package/dist/tags-VOKUNEIW.js +0 -227
- package/dist/tags-Y6MNMIEA.js +0 -23
- package/dist/tags-YHAC3NVY.js +0 -23
- package/dist/tags-ZCQMJ5YH.js +0 -26
- package/dist/targeting-BM72UTI6.js +0 -762
- package/dist/targeting-BM72UTI6.js.map +0 -1
- package/dist/targeting-constants-54S3FXIF.js +0 -118
- package/dist/targeting-criteria-ECQFHQF3.js +0 -113
- package/dist/targets-U2JHTB5U.js +0 -106
- package/dist/terms-OFHNLW6U.js +0 -102
- package/dist/testimonials-IDVLMXDT.js +0 -32
- package/dist/themes-FW3VWZJE.js +0 -95
- package/dist/themes-FW3VWZJE.js.map +0 -1
- package/dist/top-companies-CBI4O3ZB.js +0 -111
- package/dist/transcript-IIRFTFRW.js +0 -165
- package/dist/translate-N6QW4FZB.js +0 -603
- package/dist/translate-N6QW4FZB.js.map +0 -1
- package/dist/triggers-Q3KRAMA3.js +0 -144
- package/dist/tweets-TRTXC6O4.js +0 -123
- package/dist/unfollow-DATOGPLZ.js +0 -46
- package/dist/unlink-7RVQXKAR.js +0 -70
- package/dist/unstage-3LPHNZKR.js +0 -88
- package/dist/unstage-LLQCMZ5H.js +0 -96
- package/dist/update-AL3LBHGK.js +0 -192
- package/dist/update-AWR7EHGA.js +0 -155
- package/dist/update-LNSSLZXG.js +0 -66
- package/dist/update-SD5YQIJC.js +0 -81
- package/dist/update-YBTFH5MN.js +0 -101
- package/dist/upload-45GCGMA5.js +0 -137
- package/dist/upload-7PPMVWVA.js +0 -155
- package/dist/upscale-WVJZG76V.js +0 -109
- package/dist/url-options-AHJPR5VY.js +0 -131
- package/dist/url-params-U6ZM4LL2.js +0 -101
- package/dist/use-6FADOAFZ.js +0 -111
- package/dist/validate-S325RXPH.js +0 -135
- package/dist/validate-S325RXPH.js.map +0 -1
- package/dist/variant-RNM36P4J.js +0 -338
- package/dist/videos-GHFCOTT7.js +0 -146
- package/dist/videos-NW2UP342.js +0 -41
- package/dist/view-YR6MDLWL.js +0 -133
- package/dist/viewer-check-IDXFRRCO.js +0 -83
- package/dist/web-VMPKMBKA.js +0 -173
- package/dist/winners-4T5RFQXU.js +0 -113
- package/dist/winning-ads-7UJXCWFH.js +0 -86
- package/dist/write-commands-6D55SB56.js +0 -206
- package/dist/write-commands-AIWLEGO2.js +0 -1169
- package/dist/write-commands-AIWLEGO2.js.map +0 -1
- package/dist/write-commands-R42DQEW6.js +0 -1524
- package/dist/write-commands-R42DQEW6.js.map +0 -1
- package/dist/write-commands-UO3OQIHH.js +0 -721
- package/dist/x-UGTUOCVR.js +0 -47
- /package/dist/{account-52WDLW4Z.js.map → account-6RJ6ZI3B.js.map} +0 -0
- /package/dist/{account-7KZ7MHMN.js.map → account-AIGNJ2RP.js.map} +0 -0
- /package/dist/{account-NSBALYYS.js.map → account-E5LLPRZ6.js.map} +0 -0
- /package/dist/{account-assets-EPEYTJFD.js.map → account-assets-J6SVHSXR.js.map} +0 -0
- /package/dist/{account-writes-3BJSUM2V.js.map → account-writes-XNS4IKZV.js.map} +0 -0
- /package/dist/{accounts-I2ZLR76R.js.map → accounts-3ZWYGRVM.js.map} +0 -0
- /package/dist/{accounts-ZV4IXOF5.js.map → accounts-5TLHSEZR.js.map} +0 -0
- /package/dist/{accounts-FLKNFDIE.js.map → accounts-BAZYYDFV.js.map} +0 -0
- /package/dist/{accounts-A47QUTTB.js.map → accounts-L2HVNJUF.js.map} +0 -0
- /package/dist/{accounts-E5TF2AFI.js.map → accounts-NTBIRB52.js.map} +0 -0
- /package/dist/{actions-IR47GVZ6.js.map → actions-N2FBJMT4.js.map} +0 -0
- /package/dist/{active-entities-XRSJNBOV.js.map → active-entities-IJPRN45K.js.map} +0 -0
- /package/dist/{activecampaign-MNJYIWJL.js.map → activecampaign-U77COT2F.js.map} +0 -0
- /package/dist/{activities-ZDWREYR7.js.map → activities-SS3SUWSS.js.map} +0 -0
- /package/dist/{ad-group-writes-KU4QMQZP.js.map → ad-group-writes-DTQSUNE2.js.map} +0 -0
- /package/dist/{ad-groups-NMW2G32A.js.map → ad-groups-CX23GLVE.js.map} +0 -0
- /package/dist/{ad-writes-7NOFTOM4.js.map → ad-writes-HAAUOJCG.js.map} +0 -0
- /package/dist/{add-QMTD6EGI.js.map → add-ABPQTO2M.js.map} +0 -0
- /package/dist/{add-JO4ZPS23.js.map → add-BK6N7KWU.js.map} +0 -0
- /package/dist/{add-25YZMFSH.js.map → add-ECN2FTMH.js.map} +0 -0
- /package/dist/{add-D44VCDRU.js.map → add-FH7OVKFF.js.map} +0 -0
- /package/dist/{add-7MAL7JRX.js.map → add-KHY3H54G.js.map} +0 -0
- /package/dist/{add-4I25INAO.js.map → add-VDH2VCXR.js.map} +0 -0
- /package/dist/{add-accounts-EKMSHAA4.js.map → add-accounts-6JAOSCXK.js.map} +0 -0
- /package/dist/{ads-4YZYNU66.js.map → ads-BEMEXBDJ.js.map} +0 -0
- /package/dist/{ads-PWTQC6KV.js.map → ads-GAU2XKNL.js.map} +0 -0
- /package/dist/{ads-P4Z3MLKS.js.map → ads-HZOXZ3FY.js.map} +0 -0
- /package/dist/{ads-DGL5SGP3.js.map → ads-I5OBZ5VI.js.map} +0 -0
- /package/dist/{adsets-PSVCPCE3.js.map → adsets-PMQGA6TW.js.map} +0 -0
- /package/dist/{advertisers-LOIXTTGP.js.map → advertisers-EOLL3VFQ.js.map} +0 -0
- /package/dist/{advertisers-7NAPI5ZU.js.map → advertisers-FNKY2PP4.js.map} +0 -0
- /package/dist/{analytics-NL2KGDLK.js.map → analytics-DOAUCF2Y.js.map} +0 -0
- /package/dist/{analytics-6AHC3J4L.js.map → analytics-MR3T34KN.js.map} +0 -0
- /package/dist/{animate-VX7E7KJE.js.map → animate-EKGVDSWM.js.map} +0 -0
- /package/dist/{approved-E4EZA5RT.js.map → approved-WQL4Z4EB.js.map} +0 -0
- /package/dist/{asset-writes-NDSHY5OT.js.map → asset-writes-A5X2T6LQ.js.map} +0 -0
- /package/dist/{assign-NKHIHVGI.js.map → assign-UMNHINRA.js.map} +0 -0
- /package/dist/{audience-size-WEOM6XIL.js.map → audience-size-Q7DZ6TGM.js.map} +0 -0
- /package/dist/{audiences-UHLVATR6.js.map → audiences-HBJGEGKL.js.map} +0 -0
- /package/dist/{audiences-P3SPTAJT.js.map → audiences-RDQZNGPI.js.map} +0 -0
- /package/dist/{audiences-T5LMTT3B.js.map → audiences-TA636UBN.js.map} +0 -0
- /package/dist/{audit-4RIBJ7BR.js.map → audit-H3F6FZNE.js.map} +0 -0
- /package/dist/{audit-46DO2HV3.js.map → audit-QMCK76AT.js.map} +0 -0
- /package/dist/{autocomplete-FMTJDXTL.js.map → autocomplete-DIBJ57VC.js.map} +0 -0
- /package/dist/{avatars-LY5SFMWO.js.map → avatars-UIXRGLPA.js.map} +0 -0
- /package/dist/{bid-pricing-MQ7WLV5U.js.map → bid-pricing-OMY2F2SB.js.map} +0 -0
- /package/dist/{brand-LR5IXW3W.js.map → brand-WV6CAU3M.js.map} +0 -0
- /package/dist/{businesses-TRFYMZ4I.js.map → businesses-56IUB5X4.js.map} +0 -0
- /package/dist/{campaign-groups-EZYLKMO2.js.map → campaign-groups-PGJIQV4S.js.map} +0 -0
- /package/dist/{campaign-writes-P5XPFTRK.js.map → campaign-writes-MAJ5FGXG.js.map} +0 -0
- /package/dist/{campaign-writes-UMENYMKO.js.map → campaign-writes-WL3YAEGJ.js.map} +0 -0
- /package/dist/{campaigns-2MTON2IE.js.map → campaigns-5L4ZTGF7.js.map} +0 -0
- /package/dist/{campaigns-PP2DQMJE.js.map → campaigns-EK7EUKZD.js.map} +0 -0
- /package/dist/{campaigns-SWZJVE2T.js.map → campaigns-HCJ3AIDK.js.map} +0 -0
- /package/dist/{campaigns-TAFDM242.js.map → campaigns-NHACWGWS.js.map} +0 -0
- /package/dist/{canvas-RKR3ZB4E.js.map → canvas-INL3J7HO.js.map} +0 -0
- /package/dist/{capabilities-45RZ6E6W.js.map → capabilities-Y33EWDMJ.js.map} +0 -0
- /package/dist/{cards-CXKIVM4D.js.map → cards-IWWKA5WH.js.map} +0 -0
- /package/dist/{catalog-TOHUVBEU.js.map → catalog-NSA2FUI2.js.map} +0 -0
- /package/dist/{catalogs-V7PTEJBO.js.map → catalogs-SJMYID7N.js.map} +0 -0
- /package/dist/{changes-5OW3UYMF.js.map → changes-2HOF2HSV.js.map} +0 -0
- /package/dist/{chatgpt-JBMYNVJB.js.map → chatgpt-J6MNVQVT.js.map} +0 -0
- /package/dist/{chats-VOLBYA3R.js.map → chats-4HK6UYD2.js.map} +0 -0
- /package/dist/{chunk-UK4XSLV2.js.map → chunk-2B2JFTWI.js.map} +0 -0
- /package/dist/{chunk-B4BITHOD.js.map → chunk-2HWX6AWY.js.map} +0 -0
- /package/dist/{chunk-G4FU6VC5.js.map → chunk-2O5CCKV7.js.map} +0 -0
- /package/dist/{chunk-ELC42LJJ.js.map → chunk-2W6DMVGH.js.map} +0 -0
- /package/dist/{chunk-BXTIG5JL.js.map → chunk-3BKESS5W.js.map} +0 -0
- /package/dist/{chunk-FLTAPEVY.js.map → chunk-3VBPJQ7L.js.map} +0 -0
- /package/dist/{chunk-Z5JWFNG4.js.map → chunk-3X262BEG.js.map} +0 -0
- /package/dist/{chunk-DGHSXHZR.js.map → chunk-4CYB33V3.js.map} +0 -0
- /package/dist/{chunk-JT3UUBID.js.map → chunk-4JB556VC.js.map} +0 -0
- /package/dist/{chunk-CDPX6WAL.js.map → chunk-4QYZJPSM.js.map} +0 -0
- /package/dist/{chunk-H6ASYVQX.js.map → chunk-4WLJYLRL.js.map} +0 -0
- /package/dist/{chunk-TEQEZAJI.js.map → chunk-56ZJO7TM.js.map} +0 -0
- /package/dist/{chunk-AQRBEPZL.js.map → chunk-5LQGW5UF.js.map} +0 -0
- /package/dist/{chunk-TEJOILEY.js.map → chunk-6IL7JFX5.js.map} +0 -0
- /package/dist/{chunk-Q5XUFN2W.js.map → chunk-6LNCKT6S.js.map} +0 -0
- /package/dist/{chunk-B64KJW5C.js.map → chunk-6LUDG5AB.js.map} +0 -0
- /package/dist/{chunk-JAC6JVCI.js.map → chunk-6OIKNJ7G.js.map} +0 -0
- /package/dist/{chunk-ZCGM7ZWM.js.map → chunk-6UQV5DOD.js.map} +0 -0
- /package/dist/{chunk-L7I47VGM.js.map → chunk-6WA7QSCN.js.map} +0 -0
- /package/dist/{chunk-4QFMRL6O.js.map → chunk-7CHPHER2.js.map} +0 -0
- /package/dist/{chunk-U6AWJIFP.js.map → chunk-7J7ASYIM.js.map} +0 -0
- /package/dist/{chunk-TPJ34LXX.js.map → chunk-7MMTIJO3.js.map} +0 -0
- /package/dist/{chunk-2N7TB346.js.map → chunk-7Y3LKR4P.js.map} +0 -0
- /package/dist/{chunk-3QPG2D27.js.map → chunk-AA3D7GZF.js.map} +0 -0
- /package/dist/{chunk-Q736UFSD.js.map → chunk-AGL7EWP2.js.map} +0 -0
- /package/dist/{chunk-KGJ6EIX3.js.map → chunk-AHVD6IEI.js.map} +0 -0
- /package/dist/{chunk-3GXHML4V.js.map → chunk-ASJMLTMX.js.map} +0 -0
- /package/dist/{chunk-WZATC4O5.js.map → chunk-AWENMEFC.js.map} +0 -0
- /package/dist/{chunk-EGICPBDY.js.map → chunk-AYX7PB2L.js.map} +0 -0
- /package/dist/{chunk-EJ6EED6I.js.map → chunk-BHZLKLK7.js.map} +0 -0
- /package/dist/{chunk-DHF4FXWS.js.map → chunk-BVER7I36.js.map} +0 -0
- /package/dist/{chunk-MTW2NDDD.js.map → chunk-C3RZNVLM.js.map} +0 -0
- /package/dist/{chunk-6AMN346B.js.map → chunk-CA5QBLIZ.js.map} +0 -0
- /package/dist/{chunk-QLO4RNHU.js.map → chunk-CONTVNSN.js.map} +0 -0
- /package/dist/{chunk-MKG57P2E.js.map → chunk-CUTTTFAU.js.map} +0 -0
- /package/dist/{chunk-IGCS3X4F.js.map → chunk-D32EWSMB.js.map} +0 -0
- /package/dist/{chunk-2CC4CPDT.js.map → chunk-EE6NZ6NG.js.map} +0 -0
- /package/dist/{chunk-M4KFO256.js.map → chunk-EG6HMBCF.js.map} +0 -0
- /package/dist/{chunk-J4BJLHLQ.js.map → chunk-EGZM35HT.js.map} +0 -0
- /package/dist/{chunk-MKOI6QYM.js.map → chunk-FHLAJYZE.js.map} +0 -0
- /package/dist/{chunk-XA76OGSL.js.map → chunk-FSNQFZ2Z.js.map} +0 -0
- /package/dist/{chunk-XGG72YRO.js.map → chunk-G67OBCXI.js.map} +0 -0
- /package/dist/{chunk-2TS2ITSG.js.map → chunk-GFYGVIT3.js.map} +0 -0
- /package/dist/{chunk-CTJWMZPL.js.map → chunk-GRNHQWSV.js.map} +0 -0
- /package/dist/{chunk-JAME5NBT.js.map → chunk-GWQSZWHT.js.map} +0 -0
- /package/dist/{chunk-BFAPSFS7.js.map → chunk-HBXR26LB.js.map} +0 -0
- /package/dist/{chunk-MC5F2L64.js.map → chunk-HUO5MZ7S.js.map} +0 -0
- /package/dist/{chunk-5OC6VUDZ.js.map → chunk-HVL22WUU.js.map} +0 -0
- /package/dist/{chunk-AZIXX73C.js.map → chunk-IA5GLVRV.js.map} +0 -0
- /package/dist/{chunk-JCDCIQMA.js.map → chunk-IEPCI2EB.js.map} +0 -0
- /package/dist/{chunk-HM4NWA72.js.map → chunk-IKSBLQTL.js.map} +0 -0
- /package/dist/{chunk-QSS34JWZ.js.map → chunk-IRLMIKI7.js.map} +0 -0
- /package/dist/{chunk-V5ODOBBI.js.map → chunk-IW4MX7OX.js.map} +0 -0
- /package/dist/{chunk-7NBQQOCU.js.map → chunk-J4WOF6WK.js.map} +0 -0
- /package/dist/{chunk-VAURJ4QJ.js.map → chunk-J63TN3GR.js.map} +0 -0
- /package/dist/{chunk-JSOOLOHP.js.map → chunk-JESSFI7R.js.map} +0 -0
- /package/dist/{chunk-H3RCEM6L.js.map → chunk-K4QPBXV7.js.map} +0 -0
- /package/dist/{chunk-YAMKCMAS.js.map → chunk-K5VDDKKF.js.map} +0 -0
- /package/dist/{chunk-WTPID22G.js.map → chunk-KM5K47TW.js.map} +0 -0
- /package/dist/{chunk-ITIUWJGQ.js.map → chunk-LGJIJVVH.js.map} +0 -0
- /package/dist/{chunk-IAE24RKD.js.map → chunk-LHSSIUU4.js.map} +0 -0
- /package/dist/{chunk-EKOMZH2S.js.map → chunk-LQMPA4DY.js.map} +0 -0
- /package/dist/{chunk-RVIBHENP.js.map → chunk-M3IXPK6U.js.map} +0 -0
- /package/dist/{chunk-2Z6PFHD2.js.map → chunk-MJU5VKX2.js.map} +0 -0
- /package/dist/{chunk-D5HD46VV.js.map → chunk-MRGU3NPN.js.map} +0 -0
- /package/dist/{chunk-2YXTXSYG.js.map → chunk-MSLFPL77.js.map} +0 -0
- /package/dist/{chunk-L4QEMWNJ.js.map → chunk-NKCWJPMN.js.map} +0 -0
- /package/dist/{chunk-LQACNCAV.js.map → chunk-OADMSHME.js.map} +0 -0
- /package/dist/{chunk-X25XRSDP.js.map → chunk-ONGZKI5J.js.map} +0 -0
- /package/dist/{chunk-RRKUXGAU.js.map → chunk-OOZNTJP6.js.map} +0 -0
- /package/dist/{chunk-MIHY534L.js.map → chunk-OP3NHIFH.js.map} +0 -0
- /package/dist/{chunk-5QNW5PCM.js.map → chunk-OU4KWL6B.js.map} +0 -0
- /package/dist/{chunk-COOJKEJE.js.map → chunk-PLIGHRIQ.js.map} +0 -0
- /package/dist/{chunk-4AO3LSYM.js.map → chunk-PLROJ3SX.js.map} +0 -0
- /package/dist/{chunk-VAV5CCDD.js.map → chunk-PSM3RI4B.js.map} +0 -0
- /package/dist/{chunk-Q3G4ZI2U.js.map → chunk-Q4O7ICAK.js.map} +0 -0
- /package/dist/{chunk-TNI7CN4L.js.map → chunk-Q6XM6ZDB.js.map} +0 -0
- /package/dist/{chunk-O2ECZKXP.js.map → chunk-QHRUCSRI.js.map} +0 -0
- /package/dist/{chunk-IYDESWW4.js.map → chunk-QUDPMIW7.js.map} +0 -0
- /package/dist/{chunk-22RM3UOO.js.map → chunk-QZ4YHQLW.js.map} +0 -0
- /package/dist/{chunk-Z3RGBLVJ.js.map → chunk-R2JGUOT6.js.map} +0 -0
- /package/dist/{chunk-YDALLZNS.js.map → chunk-R5I4IHJ5.js.map} +0 -0
- /package/dist/{chunk-MSIOGH67.js.map → chunk-RJXO66C4.js.map} +0 -0
- /package/dist/{chunk-CF5I4Q5M.js.map → chunk-RYNN6UUF.js.map} +0 -0
- /package/dist/{chunk-SIRRBWQ2.js.map → chunk-S4V2GOKV.js.map} +0 -0
- /package/dist/{chunk-6EOWBGGW.js.map → chunk-S7D4GTYY.js.map} +0 -0
- /package/dist/{chunk-MZPS46OR.js.map → chunk-SIKCVWM3.js.map} +0 -0
- /package/dist/{chunk-4HFM5RCP.js.map → chunk-T4RV7XOC.js.map} +0 -0
- /package/dist/{chunk-HPF3USL2.js.map → chunk-TDUAGNSQ.js.map} +0 -0
- /package/dist/{chunk-W3TZPHZO.js.map → chunk-TZRWET3S.js.map} +0 -0
- /package/dist/{chunk-C7KV5O5J.js.map → chunk-U5V4CIIG.js.map} +0 -0
- /package/dist/{chunk-DPOUS5DN.js.map → chunk-U625CQ3Y.js.map} +0 -0
- /package/dist/{chunk-QVHZTCB5.js.map → chunk-UDEVIXKX.js.map} +0 -0
- /package/dist/{chunk-LJEJCIHR.js.map → chunk-UUDWZIDC.js.map} +0 -0
- /package/dist/{chunk-LAOCXV6Z.js.map → chunk-VAQBBNLD.js.map} +0 -0
- /package/dist/{chunk-BIBXZJZI.js.map → chunk-VCDFBFPT.js.map} +0 -0
- /package/dist/{chunk-MPTNN35I.js.map → chunk-VF3W7CI7.js.map} +0 -0
- /package/dist/{chunk-KUI74TNG.js.map → chunk-VHOOAQY4.js.map} +0 -0
- /package/dist/{chunk-6MJKVNLL.js.map → chunk-VK2VC6A2.js.map} +0 -0
- /package/dist/{chunk-3WN5GWX4.js.map → chunk-WWPRSJOS.js.map} +0 -0
- /package/dist/{chunk-BMMXYR7A.js.map → chunk-WZXMZFVB.js.map} +0 -0
- /package/dist/{chunk-O5VSYBUA.js.map → chunk-XKYFNMTB.js.map} +0 -0
- /package/dist/{chunk-I33FO2ON.js.map → chunk-XL42ZEVH.js.map} +0 -0
- /package/dist/{chunk-XWAOECD2.js.map → chunk-XPUQFPIU.js.map} +0 -0
- /package/dist/{chunk-CBVUO7SK.js.map → chunk-XQEHLDGP.js.map} +0 -0
- /package/dist/{chunk-S5S54J2K.js.map → chunk-XQWC223L.js.map} +0 -0
- /package/dist/{chunk-VWHUO3AP.js.map → chunk-XYDHBLZ2.js.map} +0 -0
- /package/dist/{chunk-V7EN5LFS.js.map → chunk-XZO6ONVI.js.map} +0 -0
- /package/dist/{chunk-H25GY4U4.js.map → chunk-YFFQ3HY4.js.map} +0 -0
- /package/dist/{chunk-URGXEDFV.js.map → chunk-YGUGL4ZL.js.map} +0 -0
- /package/dist/{chunk-2Q7K4F4H.js.map → chunk-YOHGEF2N.js.map} +0 -0
- /package/dist/{chunk-TLQY4QBW.js.map → chunk-YT3S2XFG.js.map} +0 -0
- /package/dist/{chunk-IJ6WA2JW.js.map → chunk-ZPCZ4XDB.js.map} +0 -0
- /package/dist/{cite-WCAOCOO5.js.map → cite-2ZJG3FBV.js.map} +0 -0
- /package/dist/{claim-3UMAFZEM.js.map → claim-IGU5W4CT.js.map} +0 -0
- /package/dist/{client-VCKP6WBR.js.map → client-MSRCSDB7.js.map} +0 -0
- /package/dist/{code-VXOTFGD2.js.map → code-T7Z5JDQ2.js.map} +0 -0
- /package/dist/{companies-RL5A26AT.js.map → companies-HCSBVXCE.js.map} +0 -0
- /package/dist/{company-DJ44F5C6.js.map → company-SSMY4G2T.js.map} +0 -0
- /package/dist/{complete-PGNIP3LN.js.map → complete-FQNRXUI5.js.map} +0 -0
- /package/dist/{config-UR45YCIN.js.map → config-XRPKA5QR.js.map} +0 -0
- /package/dist/{connect-ROARWN63.js.map → connect-VXEE3QBU.js.map} +0 -0
- /package/dist/{content-EQQIKG5H.js.map → content-2JFP747N.js.map} +0 -0
- /package/dist/{conversation-GDFMJL7X.js.map → conversation-KKJKZIX5.js.map} +0 -0
- /package/dist/{conversion-report-2FREFML5.js.map → conversion-report-G65UHQRO.js.map} +0 -0
- /package/dist/{conversion-writes-JZIJSQ7T.js.map → conversion-writes-333V4OVR.js.map} +0 -0
- /package/dist/{conversions-2IFWDQKK.js.map → conversions-7UHCNIAO.js.map} +0 -0
- /package/dist/{conversions-Q5EBTEXA.js.map → conversions-L6775Q22.js.map} +0 -0
- /package/dist/{countries-GRCU4IGM.js.map → countries-XJVDM635.js.map} +0 -0
- /package/dist/{create-BRCSXXFO.js.map → create-AXWJECPP.js.map} +0 -0
- /package/dist/{create-PXAUL6FF.js.map → create-B24XHUGZ.js.map} +0 -0
- /package/dist/{create-B5DIYK5D.js.map → create-HJKTD5FN.js.map} +0 -0
- /package/dist/{create-R6CMATVY.js.map → create-V4NGP5KB.js.map} +0 -0
- /package/dist/{creatives-4EPM3RHG.js.map → creatives-OKFLX67Y.js.map} +0 -0
- /package/dist/{creatives-D6O6Z46U.js.map → creatives-WX6GQ37F.js.map} +0 -0
- /package/dist/{credentials-CLJO7WWY.js.map → credentials-4JFUH6FN.js.map} +0 -0
- /package/dist/{crm-JJHYRABB.js.map → crm-6MLYUEK7.js.map} +0 -0
- /package/dist/{crm-H5ITJ2RC.js.map → crm-PUQBWZKE.js.map} +0 -0
- /package/dist/{crop-NE7YX4SS.js.map → crop-V5MSIY5F.js.map} +0 -0
- /package/dist/{currency-EFDQYW5B.js.map → currency-SCSJ5FW2.js.map} +0 -0
- /package/dist/{custom-conversions-GQTU5E6X.js.map → custom-conversions-GN4JDS5F.js.map} +0 -0
- /package/dist/{customers-C5YXAVXI.js.map → customers-WXD2LTUC.js.map} +0 -0
- /package/dist/{decide-6Q5X3V3F.js.map → decide-PW2NRMRK.js.map} +0 -0
- /package/dist/{delete-WZ3KVVX5.js.map → delete-EAJN6ZHT.js.map} +0 -0
- /package/dist/{delete-NBUDIGSD.js.map → delete-GDIFIYA2.js.map} +0 -0
- /package/dist/{delete-3GYCQK6B.js.map → delete-JQG3ZWQX.js.map} +0 -0
- /package/dist/{delete-SP66F7ZV.js.map → delete-L7CGJ23X.js.map} +0 -0
- /package/dist/{delete-QHDDR66K.js.map → delete-OQREQEGN.js.map} +0 -0
- /package/dist/{delete-EKKOEB3N.js.map → delete-ZR3DVLWU.js.map} +0 -0
- /package/dist/{demographics-O7AJW7DO.js.map → demographics-LMRGNO7J.js.map} +0 -0
- /package/dist/{describe-MAGTSOW4.js.map → describe-OHWLLBDE.js.map} +0 -0
- /package/dist/{describe-DJPIUEFE.js.map → describe-YELOXWHY.js.map} +0 -0
- /package/dist/{dimensions-IC2H7V3H.js.map → dimensions-CLLCVVRY.js.map} +0 -0
- /package/dist/{discard-RMVZAX2J.js.map → discard-K2KIIFJQ.js.map} +0 -0
- /package/dist/{discover-PSL2NBJL.js.map → discover-SQJLRS4G.js.map} +0 -0
- /package/dist/{discover-BPUUWRBP.js.map → discover-UJMDGDQO.js.map} +0 -0
- /package/dist/{domain-J3ZMBOHS.js.map → domain-CJX5JSLS.js.map} +0 -0
- /package/dist/{download-ZVOGLTFB.js.map → download-HFDBP6BO.js.map} +0 -0
- /package/dist/{download-EHDJXBAC.js.map → download-SZ5P3GLV.js.map} +0 -0
- /package/dist/{draft-GCOCG4PO.js.map → draft-7QDE2Z3N.js.map} +0 -0
- /package/dist/{draft-27NMTARB.js.map → draft-ILXHFWTT.js.map} +0 -0
- /package/dist/{draft-6PJD3MCW.js.map → draft-NUFU5YME.js.map} +0 -0
- /package/dist/{draft-TPR3DH5N.js.map → draft-QSTD3DH2.js.map} +0 -0
- /package/dist/{draft-MWYKIZC4.js.map → draft-TV5IH5U4.js.map} +0 -0
- /package/dist/{draft-JESKGZ6O.js.map → draft-WNMHUFAH.js.map} +0 -0
- /package/dist/{env-NZXNMWSD.js.map → env-3256G2OE.js.map} +0 -0
- /package/dist/{experiment-XAYSEYTU.js.map → experiment-5L5USMAL.js.map} +0 -0
- /package/dist/{export-W54UZ62P.js.map → export-YSOM4E3B.js.map} +0 -0
- /package/dist/{extract-JMY6YRPW.js.map → extract-7FYXXEQZ.js.map} +0 -0
- /package/dist/{facets-B5AZAU2C.js.map → facets-2FRELYRC.js.map} +0 -0
- /package/dist/{favorites-Y6CT6NSQ.js.map → favorites-LTG2F6W2.js.map} +0 -0
- /package/dist/{feed-35BRQPTH.js.map → feed-RSBWEI75.js.map} +0 -0
- /package/dist/{feedback-4MCMOMVN.js.map → feedback-PQUM7UBT.js.map} +0 -0
- /package/dist/{fetch-I6P72CDL.js.map → fetch-3PWYTX4R.js.map} +0 -0
- /package/dist/{fetch-JDNFK476.js.map → fetch-FLQYW27W.js.map} +0 -0
- /package/dist/{find-SVGRA7IA.js.map → find-SHHDWCPM.js.map} +0 -0
- /package/dist/{fit-DKVH5BDW.js.map → fit-4XCDLF7C.js.map} +0 -0
- /package/dist/{flows-LURTZICL.js.map → flows-4ALWJVNF.js.map} +0 -0
- /package/dist/{follow-24QSDNAG.js.map → follow-N4TKU3UM.js.map} +0 -0
- /package/dist/{follow-competitors-AG4E4XFA.js.map → follow-competitors-AHQ57BWS.js.map} +0 -0
- /package/dist/{following-YGM6TBK3.js.map → following-CEYH33DW.js.map} +0 -0
- /package/dist/{fonts-HUXFDDAE.js.map → fonts-CYJ5EFR4.js.map} +0 -0
- /package/dist/{forecast-UHTW4Y7Q.js.map → forecast-SG2VUBZD.js.map} +0 -0
- /package/dist/{funding-WZNGXRLJ.js.map → funding-X7M5WLDX.js.map} +0 -0
- /package/dist/{funnel-QM7WFFMD.js.map → funnel-F7DS7PUN.js.map} +0 -0
- /package/dist/{ga4-W3U5YTRT.js.map → ga4-QPBAKGSH.js.map} +0 -0
- /package/dist/{generate-KAWRRYTT.js.map → generate-LVBI3VDD.js.map} +0 -0
- /package/dist/{get-YWDZYEAC.js.map → get-DMV7KG2F.js.map} +0 -0
- /package/dist/{get-GEUSRD5Y.js.map → get-EA7AX4NW.js.map} +0 -0
- /package/dist/{get-TS2ZJDCQ.js.map → get-EOSJWMWT.js.map} +0 -0
- /package/dist/{get-JIZPYK3Z.js.map → get-HVQHHDW6.js.map} +0 -0
- /package/dist/{get-3MTAVNTP.js.map → get-KQLCVQCK.js.map} +0 -0
- /package/dist/{get-FWPR2YPC.js.map → get-NAOMB6Q2.js.map} +0 -0
- /package/dist/{get-5SPNAIUQ.js.map → get-XYJBQFIT.js.map} +0 -0
- /package/dist/{get-237TYJZT.js.map → get-XZ7XPXZE.js.map} +0 -0
- /package/dist/{gif-NP6EDGEE.js.map → gif-XJ26IWAP.js.map} +0 -0
- /package/dist/{google-DTSLO3PT.js.map → google-QOKWSPOA.js.map} +0 -0
- /package/dist/{google-ads-RZOQQDQN.js.map → google-ads-B4FBPQ7O.js.map} +0 -0
- /package/dist/{group-3DT4UYSR.js.map → group-7EYM3PNJ.js.map} +0 -0
- /package/dist/{group-OEKKCFXT.js.map → group-GDTEICRY.js.map} +0 -0
- /package/dist/{gsc-4FEFPFPB.js.map → gsc-KVIAZMF4.js.map} +0 -0
- /package/dist/{history-YQSYXBJH.js.map → history-22YGILIT.js.map} +0 -0
- /package/dist/{history-XL52537O.js.map → history-E3JGYADF.js.map} +0 -0
- /package/dist/{history-H7S7XRBX.js.map → history-HKCSYH5L.js.map} +0 -0
- /package/dist/{hubspot-2DSISSUI.js.map → hubspot-LEW2RP5D.js.map} +0 -0
- /package/dist/{icon-43UJTGGE.js.map → icon-JLVEYF34.js.map} +0 -0
- /package/dist/{ideas-2XBFQJ56.js.map → ideas-JAIU4GC4.js.map} +0 -0
- /package/dist/{images-VFRQ32G5.js.map → images-ZG6RRAEP.js.map} +0 -0
- /package/dist/{improve-IMXQN6OD.js.map → improve-XSHWCMZS.js.map} +0 -0
- /package/dist/{ingest-4RPLN54K.js.map → ingest-GTXBGUNQ.js.map} +0 -0
- /package/dist/{ingest-TPVH44VI.js.map → ingest-SX7K6GNE.js.map} +0 -0
- /package/dist/{insights-UVCFOB3N.js.map → insights-IVUUWSQL.js.map} +0 -0
- /package/dist/{insights-BR3456EI.js.map → insights-PJPQB46E.js.map} +0 -0
- /package/dist/{inspect-VD3GVXDU.js.map → inspect-55BXSPJG.js.map} +0 -0
- /package/dist/{inspiration-XZI5KCQW.js.map → inspiration-NBOKHPZ5.js.map} +0 -0
- /package/dist/{intent-F5NTOSQC.js.map → intent-KSVTHFFE.js.map} +0 -0
- /package/dist/{job-GOX3KIKG.js.map → job-4VXDCYSG.js.map} +0 -0
- /package/dist/{job-create-F2PQSN3C.js.map → job-create-NZEZDOZT.js.map} +0 -0
- /package/dist/{job-status-3FMA5D7T.js.map → job-status-XI3ENS7D.js.map} +0 -0
- /package/dist/{keep-23ZYMWPG.js.map → keep-UYNOC3JZ.js.map} +0 -0
- /package/dist/{keyword-gap-EB5QATYN.js.map → keyword-gap-7UVDSID5.js.map} +0 -0
- /package/dist/{keyword-metrics-PW2DDIJW.js.map → keyword-metrics-QFRXZRAQ.js.map} +0 -0
- /package/dist/{keywords-for-site-JEPABY6E.js.map → keywords-for-site-Q4BCJ4PQ.js.map} +0 -0
- /package/dist/{knowledge-7M7DSRF3.js.map → knowledge-LVE3J3AK.js.map} +0 -0
- /package/dist/{landing-4N6YSB4L.js.map → landing-AJYM5GBY.js.map} +0 -0
- /package/dist/{landings-VNQ4VA2U.js.map → landings-SIN3MTUZ.js.map} +0 -0
- /package/dist/{languages-4S26FJDP.js.map → languages-AIASAINW.js.map} +0 -0
- /package/dist/{languages-2X22HXM3.js.map → languages-RDR6EBNJ.js.map} +0 -0
- /package/dist/{launches-L4EUROCJ.js.map → launches-4TVHXAZT.js.map} +0 -0
- /package/dist/{layerize-6QHQMA7Q.js.map → layerize-OLVGZRND.js.map} +0 -0
- /package/dist/{lead-routes-5TPFJEVH.js.map → lead-routes-ZOQDPCR3.js.map} +0 -0
- /package/dist/{leads-R5OZJQHW.js.map → leads-YSDLFBHN.js.map} +0 -0
- /package/dist/{learn-AQ2FRFB7.js.map → learn-FDQZNIP3.js.map} +0 -0
- /package/dist/{library-MNJC24E4.js.map → library-7CLWRDM3.js.map} +0 -0
- /package/dist/{lighthouse-DJMAXFTD.js.map → lighthouse-3ACQ3MVG.js.map} +0 -0
- /package/dist/{line-item-writes-LGO7HIJJ.js.map → line-item-writes-JARN73DV.js.map} +0 -0
- /package/dist/{line-items-AAZVKQ7E.js.map → line-items-B5GLDAJ2.js.map} +0 -0
- /package/dist/{link-7IGHVARH.js.map → link-YAZF34BZ.js.map} +0 -0
- /package/dist/{linkedin-person-D6U2ZAUW.js.map → linkedin-person-XDH7Q3PB.js.map} +0 -0
- /package/dist/{list-537S75BZ.js.map → list-6NYRZXKQ.js.map} +0 -0
- /package/dist/{list-WIXQXNKB.js.map → list-6WISGNQ2.js.map} +0 -0
- /package/dist/{list-Q52FPW3H.js.map → list-6YBIWX44.js.map} +0 -0
- /package/dist/{list-P44QRX2O.js.map → list-72JQGWNO.js.map} +0 -0
- /package/dist/{list-UMJACDTQ.js.map → list-FX7OG3OJ.js.map} +0 -0
- /package/dist/{list-2277GCPH.js.map → list-ITPBLMV3.js.map} +0 -0
- /package/dist/{list-XK33NCSC.js.map → list-J43GOBOX.js.map} +0 -0
- /package/dist/{list-V4PSDBLX.js.map → list-K4Z3BOWI.js.map} +0 -0
- /package/dist/{list-VZKUHY4Y.js.map → list-ONSYTCX2.js.map} +0 -0
- /package/dist/{locations-WXGOI3VV.js.map → locations-UNSREUBX.js.map} +0 -0
- /package/dist/{locations-UWBQLHXW.js.map → locations-XAC3GME3.js.map} +0 -0
- /package/dist/{log-6ZKMUTYS.js.map → log-PPNNFETI.js.map} +0 -0
- /package/dist/{logo-4LSFZ3ZO.js.map → logo-UNVIMA4B.js.map} +0 -0
- /package/dist/{lookup-WIM5WR25.js.map → lookup-L5QG3BWH.js.map} +0 -0
- /package/dist/{map-ZL4MQVJZ.js.map → map-QILMIKS7.js.map} +0 -0
- /package/dist/{mcp-GSRYLRD4.js.map → mcp-GOKFM4PF.js.map} +0 -0
- /package/dist/{media-KKI3KWLR.js.map → media-BN6B75NF.js.map} +0 -0
- /package/dist/{media-34I7UB7Z.js.map → media-YDDWV32Y.js.map} +0 -0
- /package/dist/{media-sources-VSPVHLYN.js.map → media-sources-HABLVJE3.js.map} +0 -0
- /package/dist/{members-L6SXP6GC.js.map → members-B4UI6ISY.js.map} +0 -0
- /package/dist/{meme-6NFYFQ7T.js.map → meme-2MERLAVW.js.map} +0 -0
- /package/dist/{meta-2UK7KIE4.js.map → meta-7FJQD44L.js.map} +0 -0
- /package/dist/{metrics-4AFEEDVP.js.map → metrics-SBKBEZJR.js.map} +0 -0
- /package/dist/{models-2ZEM64H5.js.map → models-ZBLBNNEH.js.map} +0 -0
- /package/dist/{normalize-G75RDSE4.js.map → normalize-5WVEQJXD.js.map} +0 -0
- /package/dist/{normalize-GK7DH7ZP.js.map → normalize-YPQBHWYS.js.map} +0 -0
- /package/dist/{options-FDAAHG7C.js.map → options-BV3TVUCK.js.map} +0 -0
- /package/dist/{organization-K2FTFAAO.js.map → organization-4OTGNRHP.js.map} +0 -0
- /package/dist/{output-ELEO2Z6R.js.map → output-FX4KJAO5.js.map} +0 -0
- /package/dist/{page-4X6IBUWG.js.map → page-5KWQ7PM3.js.map} +0 -0
- /package/dist/{pages-7HW5YOZV.js.map → pages-HKTAGXH3.js.map} +0 -0
- /package/dist/{performance-N3UROH7Z.js.map → performance-4MWQVTTA.js.map} +0 -0
- /package/dist/{performance-RG2HR46T.js.map → performance-TKE7NQF6.js.map} +0 -0
- /package/dist/{pinterest-KA6VFDM4.js.map → pinterest-UDX53CWY.js.map} +0 -0
- /package/dist/{pixels-D5HF24FI.js.map → pixels-BSNCVT77.js.map} +0 -0
- /package/dist/{pixels-HEI5WVAO.js.map → pixels-TR2PAYWV.js.map} +0 -0
- /package/dist/{plan-XCA6R3HZ.js.map → plan-V57AATQ5.js.map} +0 -0
- /package/dist/{posts-ALGM6ONV.js.map → posts-JHMXNHDV.js.map} +0 -0
- /package/dist/{preview-55TRUF4Q.js.map → preview-VY7UH2SK.js.map} +0 -0
- /package/dist/{preview-NVWIEUHF.js.map → preview-XUG4K4KV.js.map} +0 -0
- /package/dist/{profile-NHUPUCBR.js.map → profile-PV3R3BEG.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-7QZRFDOM.js.map → promoted-tweet-writes-O3S5OKUZ.js.map} +0 -0
- /package/dist/{promoted-tweets-V555Y7DN.js.map → promoted-tweets-4ZKSEC4I.js.map} +0 -0
- /package/dist/{properties-2ZXA5BPJ.js.map → properties-U2XUD2M6.js.map} +0 -0
- /package/dist/{publish-5KR6YLA6.js.map → publish-4RAYD7VI.js.map} +0 -0
- /package/dist/{query-K7MYBRTS.js.map → query-4C6UQN42.js.map} +0 -0
- /package/dist/{query-63CTX2PH.js.map → query-7FWE7GLV.js.map} +0 -0
- /package/dist/{query-DMWY3TDD.js.map → query-7Y2Y6YFI.js.map} +0 -0
- /package/dist/{questionnaire-WHE42RD4.js.map → questionnaire-3IPJXJT7.js.map} +0 -0
- /package/dist/{read-NESEKULG.js.map → read-WEQLEI7R.js.map} +0 -0
- /package/dist/{reddit-XPQ7YAJW.js.map → reddit-2FWCB7XY.js.map} +0 -0
- /package/dist/{refresh-XFHEBSDU.js.map → refresh-SGDB4QOD.js.map} +0 -0
- /package/dist/{refresh-ILDEPU5A.js.map → refresh-WZBVPKWE.js.map} +0 -0
- /package/dist/{release-3ECEF26P.js.map → release-YL3ZII3Z.js.map} +0 -0
- /package/dist/{relevant-pages-XYQKVX3U.js.map → relevant-pages-PF3LLUED.js.map} +0 -0
- /package/dist/{remove-NHE4UT7G.js.map → remove-52MSQXSW.js.map} +0 -0
- /package/dist/{remove-OCTUC3RB.js.map → remove-EIV7LJUA.js.map} +0 -0
- /package/dist/{reopen-JRI3TYD4.js.map → reopen-CW27MUJH.js.map} +0 -0
- /package/dist/{research-ODPU62BA.js.map → research-234BOCKM.js.map} +0 -0
- /package/dist/{research-TG5CBTYP.js.map → research-RABLL4HR.js.map} +0 -0
- /package/dist/{reset-J2NLNITD.js.map → reset-5KJDDVJL.js.map} +0 -0
- /package/dist/{reset-SRU7YJUR.js.map → reset-REUL47CB.js.map} +0 -0
- /package/dist/{resolve-KHMMUGB2.js.map → resolve-WRDEHLYL.js.map} +0 -0
- /package/dist/{retry-WP7LWKZF.js.map → retry-2A5HV4SN.js.map} +0 -0
- /package/dist/{retry-VLH4AO7F.js.map → retry-FNT2XVH3.js.map} +0 -0
- /package/dist/{retry-failed-R5HPQ3KQ.js.map → retry-failed-ND7UXYTJ.js.map} +0 -0
- /package/dist/{rules-FYVD2QBB.js.map → rules-2CUG2YG7.js.map} +0 -0
- /package/dist/{run-YA6IWQAJ.js.map → run-RKLNKV2U.js.map} +0 -0
- /package/dist/{run-AQTACLY6.js.map → run-YKGN3GQR.js.map} +0 -0
- /package/dist/{schedule-D7EDEM45.js.map → schedule-774JCRVM.js.map} +0 -0
- /package/dist/{schedule-EH2MOC5C.js.map → schedule-PKKSZ5RX.js.map} +0 -0
- /package/dist/{scheduled-agents-DTAEP25E.js.map → scheduled-agents-ZI3EWKAT.js.map} +0 -0
- /package/dist/{schema-7B4MVVAS.js.map → schema-BXNL4LKR.js.map} +0 -0
- /package/dist/{schema-Z43AJOJ4.js.map → schema-GFMVUZL2.js.map} +0 -0
- /package/dist/{scrape-VL2RWSTW.js.map → scrape-KKLE4WAU.js.map} +0 -0
- /package/dist/{screenshot-Y6EEXS3Q.js.map → screenshot-K6XOER6Z.js.map} +0 -0
- /package/dist/{search-TXBYKNQC.js.map → search-43ULIJL3.js.map} +0 -0
- /package/dist/{search-CXC7N5XJ.js.map → search-AXUNJUWY.js.map} +0 -0
- /package/dist/{search-XHSTUBDY.js.map → search-DLLJEYMB.js.map} +0 -0
- /package/dist/{search-L3GTZYRW.js.map → search-LWWTXBB2.js.map} +0 -0
- /package/dist/{search-JEXYEAPQ.js.map → search-VU6GI3U3.js.map} +0 -0
- /package/dist/{search-ZZWIJRXJ.js.map → search-XO365KES.js.map} +0 -0
- /package/dist/{search-copy-FIPG7OCC.js.map → search-copy-BHNLLCUV.js.map} +0 -0
- /package/dist/{seeds-ADJKURNG.js.map → seeds-6ROVZBFB.js.map} +0 -0
- /package/dist/{sends-RS4LWRAC.js.map → sends-P6OPCYH5.js.map} +0 -0
- /package/dist/{sequences-2RPKDKGQ.js.map → sequences-DP4BHM3E.js.map} +0 -0
- /package/dist/{setup-links-OE6PC2YQ.js.map → setup-links-T5TJZA3E.js.map} +0 -0
- /package/dist/{shared-4GGUIOF2.js.map → shared-24IPELBM.js.map} +0 -0
- /package/dist/{shopify-CCPLZI2H.js.map → shopify-OQEKI7HC.js.map} +0 -0
- /package/dist/{site-FW5BBLYG.js.map → site-QRLBZPEV.js.map} +0 -0
- /package/dist/{sitemaps-Z6IELTQV.js.map → sitemaps-SWADO4SI.js.map} +0 -0
- /package/dist/{sites-KLAKI2EY.js.map → sites-H3FYJQFO.js.map} +0 -0
- /package/dist/{skills-OJP36EVR.js.map → skills-OYO6Y3DQ.js.map} +0 -0
- /package/dist/{sources-X77TGJ52.js.map → sources-U2WRH6D7.js.map} +0 -0
- /package/dist/{sources-WPHMWBEK.js.map → sources-Y2BKZVXA.js.map} +0 -0
- /package/dist/{stats-MIMFX4R7.js.map → stats-TTJHXR3E.js.map} +0 -0
- /package/dist/{status-FLETGJ2A.js.map → status-4BSXND3I.js.map} +0 -0
- /package/dist/{sticker-IREEEN7I.js.map → sticker-CRIAIO75.js.map} +0 -0
- /package/dist/{stock-5AOSQH52.js.map → stock-TOFKLWSR.js.map} +0 -0
- /package/dist/{studies-YGYAH3JI.js.map → studies-VFNWS6ND.js.map} +0 -0
- /package/dist/{studio-4EV5S7PR.js.map → studio-WD364TWB.js.map} +0 -0
- /package/dist/{suggest-5RTISDLI.js.map → suggest-GX4IROQN.js.map} +0 -0
- /package/dist/{sync-OHIXI4I6.js.map → sync-BU7HU3FS.js.map} +0 -0
- /package/dist/{sync-363VKXU3.js.map → sync-GQL5JX4U.js.map} +0 -0
- /package/dist/{sync-VCAFAYW4.js.map → sync-VNBBOVBU.js.map} +0 -0
- /package/dist/{sync-definition-ZDE5L644.js.map → sync-definition-EOARPSBS.js.map} +0 -0
- /package/dist/{tag-DSCUKNC3.js.map → tag-SQ5ROLTP.js.map} +0 -0
- /package/dist/{tag-manager-IINALUEJ.js.map → tag-manager-7S7PVYIJ.js.map} +0 -0
- /package/dist/{tags-YHAC3NVY.js.map → tags-2226Q3VK.js.map} +0 -0
- /package/dist/{tags-VOKUNEIW.js.map → tags-7QIBFIBX.js.map} +0 -0
- /package/dist/{tags-Y6MNMIEA.js.map → tags-BNWKAV3H.js.map} +0 -0
- /package/dist/{tags-6MN3AWKN.js.map → tags-HG5EBHSO.js.map} +0 -0
- /package/dist/{tags-ZCQMJ5YH.js.map → tags-WTN4EBT5.js.map} +0 -0
- /package/dist/{targeting-constants-54S3FXIF.js.map → targeting-constants-6KZXMRNI.js.map} +0 -0
- /package/dist/{targeting-criteria-ECQFHQF3.js.map → targeting-criteria-QSCRW75G.js.map} +0 -0
- /package/dist/{targets-U2JHTB5U.js.map → targets-3KT3DO6O.js.map} +0 -0
- /package/dist/{terms-OFHNLW6U.js.map → terms-IRLEAMIY.js.map} +0 -0
- /package/dist/{testimonials-IDVLMXDT.js.map → testimonials-35FTFNQ5.js.map} +0 -0
- /package/dist/{top-companies-CBI4O3ZB.js.map → top-companies-JAWMSK2Q.js.map} +0 -0
- /package/dist/{transcript-IIRFTFRW.js.map → transcript-OIYU7F4E.js.map} +0 -0
- /package/dist/{triggers-Q3KRAMA3.js.map → triggers-7QRQFTVM.js.map} +0 -0
- /package/dist/{tweets-TRTXC6O4.js.map → tweets-7XVF7PJO.js.map} +0 -0
- /package/dist/{unfollow-DATOGPLZ.js.map → unfollow-ZCP6D2SC.js.map} +0 -0
- /package/dist/{unlink-7RVQXKAR.js.map → unlink-PYCYTYVN.js.map} +0 -0
- /package/dist/{unstage-3LPHNZKR.js.map → unstage-2OUF6ELM.js.map} +0 -0
- /package/dist/{unstage-LLQCMZ5H.js.map → unstage-YADONHH6.js.map} +0 -0
- /package/dist/{update-SD5YQIJC.js.map → update-DEBDSBDI.js.map} +0 -0
- /package/dist/{update-AL3LBHGK.js.map → update-IDUSNDOI.js.map} +0 -0
- /package/dist/{update-YBTFH5MN.js.map → update-NG3HUYZZ.js.map} +0 -0
- /package/dist/{update-AWR7EHGA.js.map → update-P5IT7AIN.js.map} +0 -0
- /package/dist/{update-LNSSLZXG.js.map → update-U6NU7OXI.js.map} +0 -0
- /package/dist/{upload-45GCGMA5.js.map → upload-4F2JICEH.js.map} +0 -0
- /package/dist/{upload-7PPMVWVA.js.map → upload-SS64KHDS.js.map} +0 -0
- /package/dist/{upscale-WVJZG76V.js.map → upscale-JNNXDN6X.js.map} +0 -0
- /package/dist/{url-options-AHJPR5VY.js.map → url-options-EDPKAPPP.js.map} +0 -0
- /package/dist/{url-params-U6ZM4LL2.js.map → url-params-4G26OEOO.js.map} +0 -0
- /package/dist/{use-6FADOAFZ.js.map → use-TKFP6WVP.js.map} +0 -0
- /package/dist/{variant-RNM36P4J.js.map → variant-3VTKOQUR.js.map} +0 -0
- /package/dist/{videos-GHFCOTT7.js.map → videos-EDTBHLOZ.js.map} +0 -0
- /package/dist/{videos-NW2UP342.js.map → videos-JRNJH66J.js.map} +0 -0
- /package/dist/{view-YR6MDLWL.js.map → view-6HX3FYMS.js.map} +0 -0
- /package/dist/{viewer-check-IDXFRRCO.js.map → viewer-check-OBBBAYV5.js.map} +0 -0
- /package/dist/{web-VMPKMBKA.js.map → web-GPUEUIDT.js.map} +0 -0
- /package/dist/{winners-4T5RFQXU.js.map → winners-MEC77MZ4.js.map} +0 -0
- /package/dist/{winning-ads-7UJXCWFH.js.map → winning-ads-2DECFON4.js.map} +0 -0
- /package/dist/{write-commands-UO3OQIHH.js.map → write-commands-D5M5A4YI.js.map} +0 -0
- /package/dist/{write-commands-6D55SB56.js.map → write-commands-LQVERLAQ.js.map} +0 -0
- /package/dist/{x-UGTUOCVR.js.map → x-4TM5RET4.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/scaffold/lib/elements.ts","../src/engine/scaffold/review-platforms.ts","../src/engine/scaffold/static-copy.ts","../src/engine/scaffold/static-ad-spec.ts","../src/engine/scaffold/native-surface.ts"],"sourcesContent":["import { REFERENCE_SHEET_MODEL } from \"@baker/canvas-contract\";\n\n/**\n * The model every scaffold fuses a recurring element's multi-view reference sheet on:\n * the registry's `referenceSheet` role, which a test keeps registered for\n * `image_reference_sheet` (a sheet node on any other model is `unknown_model`).\n */\nexport const ACTOR_SHEET_MODEL = REFERENCE_SHEET_MODEL;\n\n/** lower_snake_case id that satisfies the canvas NodeIdRe; falls back to a stable default. */\nexport function sanitizeId(raw: string, fallback: string): string {\n const id = raw\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return /^[a-z]/.test(id) ? id : `${fallback}_${id}`.replace(/_+$/g, \"\") || fallback;\n}\n\n/**\n * What the video and static scaffolds both know about a selected identity element: the\n * AI selection pass names its type, a label and how it looks; a video element may also be\n * a second look (`same_as`) of another.\n */\nexport type SelectedElement = {\n type: string;\n label?: string;\n description?: string;\n expression?: string | null;\n same_as?: string | null;\n};\n\n/** Which scaffold is asking: the two write different instructions for the same element. */\nexport type ScaffoldMedium = \"video\" | \"static\";\n\n/**\n * Assign each element its UPPER_SNAKE reference label, deduped in order (HERO, HERO_2, ...)\n * — one source of truth shared by every consumer: the slot id, the prompt legend and the\n * annotation in prompt.json all read the same label.\n *\n * A video names every logo BRAND_LOGO: a logo's detected label carries the SOURCE brand\n * (\"LEMONADE_LOGO\"), which leaked the reference brand into the canvas ids and legends, and a\n * reproduction's brand swap must leave no trace. A static ad goes further and labels every\n * element by its role (PRODUCT_1, PERSON_1, PROP_1, LOGO): the selector labels what it sees\n * on the SOURCE ad, and a competitor's \"DOORDASH_DELIVERY_BAG\" reached every render prompt\n * as \"the showcased product\" of an ad that had none (prompt-audit.md §1a.3).\n */\nexport function assignElementLabels<T extends SelectedElement>(\n elements: readonly T[],\n medium: ScaffoldMedium,\n): Array<{ el: T; label: string }> {\n if (medium === \"static\") return staticElementLabels(elements);\n const used = new Set<string>();\n return elements.map((el) => {\n const raw =\n medium === \"video\" && el.type?.toLowerCase() === \"logo\" ? \"BRAND_LOGO\" : (el.label ?? el.type ?? \"ELEMENT\");\n const base =\n raw\n .toUpperCase()\n .replace(/[^A-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\") || \"ELEMENT\";\n let label = base;\n let n = 2;\n while (used.has(label)) label = `${base}_${n++}`;\n used.add(label);\n return { el, label };\n });\n}\n\nconst STATIC_LABEL_PREFIX: Record<string, string> = {\n person: \"PERSON\",\n animal: \"ANIMAL\",\n product: \"PRODUCT\",\n badge: \"BADGE\",\n};\n\n/** A static ad's role-based labels, numbered per role in order: PRODUCT_1, PRODUCT_2, PROP_1, LOGO, LOGO_2. */\nfunction staticElementLabels<T extends SelectedElement>(elements: readonly T[]): Array<{ el: T; label: string }> {\n const counts = new Map<string, number>();\n return elements.map((el) => {\n const type = el.type?.toLowerCase() ?? \"\";\n const prefix = type === \"logo\" ? \"LOGO\" : (STATIC_LABEL_PREFIX[type] ?? \"PROP\");\n const n = (counts.get(prefix) ?? 0) + 1;\n counts.set(prefix, n);\n const label = prefix === \"LOGO\" ? (n === 1 ? \"LOGO\" : `LOGO_${n}`) : `${prefix}_${n}`;\n return { el, label };\n });\n}\n\n// What the generator should do with each reference, by element type. A video's roles stress\n// consistency ACROSS frames; a static ad renders one frame, and its person is always a cast\n// Avatar's sheet, so its roles say what to take from the reference instead.\nconst REFERENCE_ROLES: Record<ScaffoldMedium, { byType: Record<string, string>; fallback: string }> = {\n video: {\n byType: {\n logo: \"the brand wordmark/logo; reproduce it exactly, do not redraw or restyle it.\",\n badge: \"a trust/rating badge; reproduce it exactly, do not invent ratings or seals.\",\n product:\n \"the showcased product; keep this exact product identity consistent across every frame. Ignore any caption text printed on this reference.\",\n person:\n \"a recurring cast member; render the SAME individual as this reference image and keep them consistent across EVERY frame — their appearance comes from this reference, never from prose. Ignore any caption text printed on this reference.\",\n animal:\n \"a recurring cast member; render the SAME individual as this reference image and keep them consistent across EVERY frame — their appearance comes from this reference, never from prose. Ignore any caption text printed on this reference.\",\n location:\n \"the fixed set/location; keep the room, background, and layout identical to this reference across EVERY frame — do not re-invent the environment. Ignore any caption text printed on this reference.\",\n },\n fallback:\n \"a recurring identity element; reproduce it faithfully and keep it consistent across every frame. Ignore any caption text printed on it.\",\n },\n static: {\n byType: {\n logo: \"the brand wordmark/logo; reproduce it as closely as possible, do not redraw or restyle it.\",\n badge: \"a trust/rating badge; reproduce it exactly, do not invent ratings or seals.\",\n product:\n \"the showcased product; keep this exact product identity. Ignore any caption text printed on this reference.\",\n person:\n \"the emotional hero — the brand's cast person: a company Avatar's identity sheet, a multi-view turnaround of ONE person the brand may show. Keep this exact face, hair and build, and render them once in the pose, gaze, wardrobe and expression the blueprint specifies — never as a grid. Ignore the cell labels printed on the sheet.\",\n animal:\n \"the emotional hero — the face/muzzle/eyes the viewer locks onto and exactly where AI artifacts (malformed mouths, teeth, foam, extra fingers) betray a fake. It MUST be grounded in this real reference, never invented from prose. Keep this identity AND the expression the blueprint specifies. Ignore any caption text printed on this reference.\",\n },\n fallback:\n \"an identity-bearing element; reproduce it faithfully from this reference. Ignore any caption text printed on it.\",\n },\n};\n\n/** The reference legend's instruction for one element type. */\nexport function referenceRole(type: string, medium: ScaffoldMedium): string {\n const roles = REFERENCE_ROLES[medium];\n return roles.byType[type.toLowerCase()] ?? roles.fallback;\n}\n\n/**\n * The `[TODO]` an element's empty slot carries: what to drop there, and what never to.\n *\n * A person is cast from a company Avatar, never grounded on a photo of somebody real: the\n * image model copies the face of whoever is in the reference, whatever the prompt says\n * (measured on gpt-image-2 and Gemini 3 Pro Image, BAKER-646/652). Everything else is one\n * real image, as a path RELATIVE to the canvas file: an absolute one resolves only in the\n * workspace that wrote it and fails the publish build (validate-creatives:\n * absolute-reference).\n */\nexport function elementTodo(el: SelectedElement, label: string, medium: ScaffoldMedium): string {\n const desc = el.description ? ` — ${el.description}` : \"\";\n const expr = el.expression ? `, with a ${el.expression} expression` : \"\";\n const t = el.type.toLowerCase();\n return medium === \"video\"\n ? videoElementTodo(el, t, label, `${desc}${expr}`)\n : staticElementTodo(el, t, label, `${desc}${expr}`);\n}\n\nfunction videoElementTodo(el: SelectedElement, t: string, label: string, brief: string): string {\n // Animals/sets are RE-SHOT fresh — never the source ad's own.\n const fresh =\n t === \"animal\" || t === \"location\"\n ? \" [SOURCE FRESH — a DIFFERENT animal/set than the original ad; do not reuse the source's]\"\n : \"\";\n // A same_as element is the same recast person in another outfit — source the\n // SAME individual you cast for the linked slot, only in this wardrobe.\n const same = el.same_as\n ? ` [SAME INDIVIDUAL as ${el.same_as} — a different wardrobe/look of the same person; reuse that cast person, change only the outfit]`\n : \"\";\n if (t === \"person\") {\n return `[TODO: cast a company Avatar as ${label} (person)${brief}${same} — re-run scaffold-video with \\`--avatar <handle>\\` (\\`baker avatars list\\`; \\`baker avatars create\\` invents a new face). NEVER a photo of a real person found on the web or taken from the source ad: the image model reproduces that face]`;\n }\n return `[TODO: drop one real source image for ${label} (${el.type})${brief} — reused across every frame it appears in${fresh}${same}; use a path relative to this canvas file, never an absolute path]`;\n}\n\nfunction staticElementTodo(el: SelectedElement, t: string, label: string, brief: string): string {\n // The emotional hero must stay grounded — do NOT delete this slot and let the generator\n // dream the subject up; a free-generated face/muzzle reads as AI and grows artifacts.\n // A person's face has to be one the brand may show: the render keeps whatever face it is\n // given (a \"use the look, not the face\" instruction does not stop gpt-image-2 or Gemini\n // from copying it), so it is a company Avatar, synthetic or likeness-confirmed.\n if (t === \"person\") {\n return `[TODO: cast a company Avatar as ${label} (person)${brief} — REQUIRED: this is the emotional hero and the render keeps this face, so re-run scaffold-static-ad with \\`--avatar <handle>\\` (\\`baker avatars list\\`; \\`baker avatars create\\` invents a new face); never a found photo of a real person (web search, the source ad), who never agreed to appear in this ad]`;\n }\n const lock =\n t === \"animal\"\n ? \" — REQUIRED: this is the emotional hero; ground it in a real reference (image-library / video-library / Pinterest), do not delete this slot and free-generate\"\n : \"\";\n return `[TODO: drop a real image for ${label} (${el.type})${brief}${lock} — replace with a path relative to this canvas file, never an absolute path]`;\n}\n","/**\n * Review platforms and ratings: a line that names a platform or shows a rating is a claim, and a\n * claim needs its source on the ad and its figure in the company's own records (D3, audited Sept\n * 2026: \"Reseña verificada en Trustpilot\" over generic gold stars with no Trustpilot logo; five-star\n * reviews with no source at all). One table of the platforms' names (proper nouns, the same in\n * every language), read by the review of the finished ad, the proof check before a render and the\n * scaffold that wires each platform's real logo. Whether a line that names Google cites it for\n * reviews is read, in any language, by the decision model (`citedPlatforms`).\n */\nimport { askJev } from \"../nodes/local/lib/jev.ts\";\nimport type { ReviewUsage } from \"../nodes/local/lib/render-review.ts\";\n\nexport type ReviewPlatform = {\n name: string;\n /** Where its real logo is fetched from (`baker images logo <domain>`). */\n domain: string;\n pattern: RegExp;\n /** The name alone is a review claim (Trustpilot); otherwise only where the line cites it for a rating or reviews (Google). */\n reviewOnly: boolean;\n};\n\nexport const REVIEW_PLATFORMS: readonly ReviewPlatform[] = [\n { name: \"Trustpilot\", domain: \"trustpilot.com\", pattern: /\\btrust ?pilot\\b/i, reviewOnly: true },\n { name: \"G2\", domain: \"g2.com\", pattern: /\\bG2\\b/, reviewOnly: true },\n { name: \"Capterra\", domain: \"capterra.com\", pattern: /\\bcapterra\\b/i, reviewOnly: true },\n { name: \"Tripadvisor\", domain: \"tripadvisor.com\", pattern: /\\btrip ?advisor\\b/i, reviewOnly: true },\n { name: \"Yelp\", domain: \"yelp.com\", pattern: /\\byelp\\b/i, reviewOnly: true },\n { name: \"Feefo\", domain: \"feefo.com\", pattern: /\\bfeefo\\b/i, reviewOnly: true },\n // Before Google: the first match names the platform.\n { name: \"Google Play\", domain: \"play.google.com\", pattern: /\\bgoogle play\\b/i, reviewOnly: false },\n { name: \"Google\", domain: \"google.com\", pattern: /\\bgoogle\\b/i, reviewOnly: false },\n { name: \"the App Store\", domain: \"apple.com\", pattern: /\\bapp ?store\\b/i, reviewOnly: false },\n];\n\n/**\n * Signs every language writes a rating with: stars, or a score out of 5 (\"4.9/5\"). Beside one, any\n * platform's name is the rating's source. A bare decimal (\"4,8 en Google\", \"3,5 kW … Google Home\")\n * is a rating or a speed alike: the decision model reads it (`citedPlatforms`).\n */\nconst RATING_SIGN = /[★☆⭐]|(?<![\\d.,])[1-5](?:[.,]\\d)?\\s*\\/\\s*5(?![\\d.,]\\d)/u;\n\n/** The platform a text names, the most specific first (a \"Google Play\" logo is Google Play's, not Google's). */\nexport function namedPlatform(text: string): ReviewPlatform | null {\n return REVIEW_PLATFORMS.find((p) => p.pattern.test(text)) ?? null;\n}\n\n/**\n * The review platform a line cites by what it shows alone: a platform whose name is a review claim\n * (Trustpilot), or any beside stars or a rating score. Whether \"Opiniones en Google\" cites Google is\n * a reading of the words (`citedPlatforms`). Pure.\n */\nexport function claimedPlatform(text: string): ReviewPlatform | null {\n const platform = namedPlatform(text);\n return platform && (platform.reviewOnly || RATING_SIGN.test(text)) ? platform : null;\n}\n\n/**\n * At or above this, the decision model says a line cites the platform for a rating or reviews.\n * Measured on 26 lines in 9 languages (scripts/review-citation-evals): cited 0.86–0.98, only\n * named (\"Descárgala en Google Play\", \"Google Partner\") 0.30 or less.\n */\nexport const CITES_PLATFORM = 0.5;\n\nconst CITATION_QUESTION =\n \"Does `line` cite `platform` as the source of a rating or of customers' reviews (stars, a score, reviews or opinions on it), in whatever language it is written? Only naming the platform (download it on, find us on, search on, sign in with) is not citing it for reviews.\";\n\n/** For each line, the probability it cites its platform for a rating or reviews; null when no judgment came back. */\nexport type CitationJudge = (items: ReadonlyArray<{ line: string; platform: string }>) => Promise<number[] | null>;\n\n/** The decision model as the judge, its spend reported to `onSpend`: one Noul per line, one request. */\nexport function jevCitationJudge(onSpend?: (usage: ReviewUsage) => void): CitationJudge {\n return (items) =>\n askJev(\n items.map((i) => ({ instructions: { line: i.line, platform: i.platform, question: CITATION_QUESTION } })),\n onSpend,\n );\n}\n\n/** The platform each line cites as the source of a rating or reviews, by the line's text; a line citing none is not in it. */\nexport type Citations = ReadonlyMap<string, ReviewPlatform>;\n\n/**\n * The review platform each line cites as the source of a rating or reviews: by what it shows\n * (`claimedPlatform`), else, for a line naming a platform whose name alone is no claim, by the\n * decision model's reading, one request for every such line. With no judgment, only what the line\n * shows counts: the ad is never asked for a badge on a guess.\n */\nexport async function citedPlatforms(\n lines: readonly string[],\n judge: CitationJudge = jevCitationJudge(),\n): Promise<Citations> {\n const cited = new Map<string, ReviewPlatform>();\n const asked: Array<{ line: string; platform: ReviewPlatform }> = [];\n for (const line of new Set(lines)) {\n const shown = claimedPlatform(line);\n const platform = namedPlatform(line);\n if (shown) cited.set(line, shown);\n else if (platform) asked.push({ line, platform });\n }\n if (asked.length === 0) return cited;\n const judged = await judge(asked.map((a) => ({ line: a.line, platform: a.platform.name }))).catch(() => null);\n asked.forEach((a, k) => {\n if ((judged?.[k] ?? 0) >= CITES_PLATFORM) cited.set(a.line, a.platform);\n });\n return cited;\n}\n\n/** The platform `line` cites: by `cited` when the lines were read, else by what it shows alone. Pure. */\nexport function citedBy(line: string, cited?: Citations): ReviewPlatform | null {\n return cited ? (cited.get(line) ?? null) : claimedPlatform(line);\n}\n\n/**\n * A figure as the records may write it: \"4,8\" and \"4.8\" alike, and \"2.000\", \"2,000\" and \"2000\"\n * alike. Only a count in thousands is also read bare: \"4,8\" as \"48\" would match any 48. A bare\n * \"2340\" is also read grouped, as \"2,340\", \"2.340\" or \"2 340\".\n */\nexport function figureForms(figure: string): string[] {\n const forms = [figure, figure.replace(/,/g, \".\"), figure.replace(/\\./g, \",\")];\n if (/^\\d{1,3}(?:[.,]\\d{3})+$/.test(figure)) forms.push(figure.replace(/[.,]/g, \"\"));\n if (/^\\d{4,}$/.test(figure)) {\n const grouped = (separator: string) => figure.replace(/\\B(?=(\\d{3})+$)/g, separator);\n forms.push(grouped(\",\"), grouped(\".\"), grouped(\" \"), grouped(\" \"), grouped(\" \"));\n }\n return [...new Set(forms)];\n}\n","/**\n * What a static ad's blueprint says, read the one way every reader agrees on.\n *\n * The copy is edited in `prompt.json` after the scaffold writes the canvas, so anything\n * derived from it has to be derived again when the canvas runs. Frozen at scaffold time,\n * the render was told \"render these exact strings: <the source ad's copy>\" while the\n * blueprint below it carried ours, and the model drew the competitor's words.\n *\n * Pure: blueprint in, strings out. The run-time sync (`static-copy-projection.ts`), the\n * scaffold and the review all go through here, so no two can disagree about what the\n * copy, the logo or the mechanisms are.\n */\nimport { z } from \"zod\";\n\n/** The header the render prompt's copy block starts with. The block ends at the next blank line. */\nexport const COPY_DIRECTIVE_HEADER = \"TEXT — RENDER THE COPY EXACTLY:\";\n\ntype TextEntry = { text?: unknown; role?: unknown; surface?: unknown; placement?: unknown };\n\nconst normalize = (s: unknown): string => (typeof s === \"string\" ? s.trim().toLowerCase() : \"\");\n\nfunction textEntries(blueprint: unknown): TextEntry[] {\n const entries = (blueprint as { text_content?: unknown } | null)?.text_content;\n return Array.isArray(entries) ? (entries as TextEntry[]) : [];\n}\n\n/**\n * The visible copy, in blueprint order, without the logo.\n *\n * A wordmark is transcribed into `text_content` with role `logo` (the describe pass is told\n * to), but it is an image, not copy: quoting it as a string to render is how an ad came back\n * with the brand name drawn twice, once as the mark and once as a line of type.\n */\nexport function copyStrings(blueprint: unknown): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const entry of textEntries(blueprint)) {\n if (normalize(entry?.role) === \"logo\") continue;\n const text = typeof entry?.text === \"string\" ? entry.text.trim() : \"\";\n if (!text || seen.has(text)) continue;\n seen.add(text);\n out.push(text);\n }\n return out;\n}\n\nconst IN_SCENE_ROLES = new Set([\"in_scene\", \"scene\", \"ui\", \"screen\", \"screenshot\", \"packaging\", \"signage\", \"sign\"]);\n/** Placements that put a line on an object in the picture rather than over it. */\nconst IN_SCENE_PLACEMENT =\n /\\b(phone|screen|screenshot|app|packaging|package|bottle|jar|signage|signboard|handwritten|receipt|whiteboard|sticky note|notepad)\\b/;\n\n/**\n * Text that belongs to something in the scene (a phone note, a screenshot, a sign,\n * packaging): the describe pass marks it `surface: in_scene`, and an older blueprint\n * says so through its role or placement.\n */\nexport function isInScene(entry: TextEntry): boolean {\n const surface = normalize(entry.surface);\n if (surface === \"in_scene\") return true;\n if (surface === \"overlay\") return false;\n return IN_SCENE_ROLES.has(normalize(entry.role)) || IN_SCENE_PLACEMENT.test(normalize(entry.placement));\n}\n\n/** The lines written on something in the scene, verbatim, with where the concept places them. */\nexport function inSceneText(blueprint: unknown): Array<{ text: string; placement: string }> {\n const seen = new Set<string>();\n return textEntries(blueprint).flatMap((entry) => {\n const text = typeof entry?.text === \"string\" ? entry.text.trim() : \"\";\n if (!text || normalize(entry.role) === \"logo\" || !isInScene(entry) || seen.has(text)) return [];\n seen.add(text);\n return [{ text, placement: typeof entry.placement === \"string\" ? entry.placement.trim() : \"\" }];\n });\n}\n\n/**\n * Whether the reference showed the advertiser's own mark. It decides the logo only for a native\n * disguise (the logo small, as the sender); a standard ad shows its logo whatever the reference did.\n */\nexport function conceptHasLogo(blueprint: unknown): boolean {\n const logos = (blueprint as { brands_logos?: unknown } | null)?.brands_logos;\n return (\n Array.isArray(logos) &&\n logos.some(\n (l) => normalize((l as { function_in_image?: unknown } | null)?.function_in_image) === \"advertiser_brand\",\n )\n );\n}\n\n/** A named device that makes the source ad work, as the describe pass records it. */\nconst WinningMechanismSchema = z\n .object({ kind: z.string(), device: z.string(), why_it_works: z.string().optional() })\n .loose();\nexport type WinningMechanism = z.infer<typeof WinningMechanismSchema>;\n\n/** The mechanisms the blueprint names, skipping any entry too malformed to act on. */\nexport function winningMechanisms(blueprint: unknown): WinningMechanism[] {\n const raw = (blueprint as { winning_mechanisms?: unknown } | null)?.winning_mechanisms;\n if (!Array.isArray(raw)) return [];\n return raw.flatMap((entry) => {\n const parsed = WinningMechanismSchema.safeParse(entry);\n return parsed.success ? [parsed.data] : [];\n });\n}\n\n/** The type specimen's text: the ad's own copy, so the specimen shows the letters the ad needs. */\nexport function specimenText(strings: string[]): string {\n return strings.length > 0 ? strings.join(\"\\n\") : \"Brand Headline\";\n}\n\n/**\n * The typography-fidelity lines for a render that sets its own text. Garbled, duplicated\n * or dropped copy is the #1 static-ad defect, so every displayed string is quoted, asked\n * for exactly once, and nothing else is allowed.\n */\nexport function textFidelityDirective(strings: string[], hasFont: boolean): string {\n const specimen = hasFont ? \" in the specimen's typeface,\" : \"\";\n const exact =\n strings.length > 0\n ? `Render these exact strings${specimen} each once, verbatim, with no extra, missing, or altered characters: ${strings.map((s) => `\"${s}\"`).join(\" / \")}.`\n : \"This ad has no copy: render no words at all.\";\n return [\n exact,\n \"Render NO other words anywhere in the image — no invented labels, captions, sub-headers, or filler text.\",\n \"Any bill, quote, receipt, screen or price tag in the scene shows no readable prices or amounts beyond these strings: its figures are blurred or out of focus.\",\n \"For any brand name or uncommon word, lock its letters exactly as written (spell it out letter-by-letter if that helps the characters render correctly).\",\n \"Keep all type crisp, legible, and large enough to read cleanly; no garbled, warped, or duplicated characters, and no unreadable microtext.\",\n ].join(\"\\n\");\n}\n\n/**\n * Swap the copy block of a render prompt for `directive`. The block is the header line plus\n * everything up to the next blank line. A prompt without the header is returned unchanged:\n * a canvas somebody wrote by hand.\n */\nexport function replaceCopyDirective(prompt: string, directive: string): string {\n const start = prompt.indexOf(COPY_DIRECTIVE_HEADER);\n if (start === -1) return prompt;\n const bodyStart = start + COPY_DIRECTIVE_HEADER.length;\n const end = prompt.indexOf(\"\\n\\n\", bodyStart);\n const tail = end === -1 ? \"\" : prompt.slice(end);\n return `${prompt.slice(0, bodyStart)}\\n${directive}${tail}`;\n}\n","/**\n * The static ad spec: what the agent writes in a static ad's `prompt.json`, and the one\n * shape every reader of that file goes through.\n *\n * The spec says what the ad is, never how to prompt a model for it: who will see it, the\n * one thing it tells them, each line of copy and whether it is lettered on something in the\n * scene or set as designed type, the scene and its mood, the brand, the pictures it grounds\n * on (each with one role), and an optional direction note. `static-brief.ts` compiles it\n * into the prompt each model is sent, so the model's rules live in one place and the agent\n * never writes a model prompt.\n *\n * A `prompt.json` written before the spec is the describe pass's blueprint of the source\n * ad, rewritten by the agent. `readAdSpec` reads it through `adSpecFromBlueprint`, a pure\n * adapter, so existing creatives render from the same compiler without a migration.\n */\nimport { z } from \"zod\";\nimport type { ConceptClass } from \"../lib/image-model-router.ts\";\nimport { sanitizeId } from \"./lib/elements.ts\";\nimport { NativeSurfaceSchema } from \"./native-surface.ts\";\nimport { conceptHasLogo, isInScene, winningMechanisms } from \"./static-copy.ts\";\n\n/**\n * The `schema` a `prompt.json` written as an ad spec carries: /3 adds the concept the ad is built\n * on, the market, how the ad shows the brand and how a stranger recognises it; /2 still reads.\n * Anything else is an older blueprint.\n */\nexport const AD_SPEC_SCHEMA = \"baker-static-ad/3\";\nexport const AD_SPEC_SCHEMAS = [\"baker-static-ad/2\", AD_SPEC_SCHEMA] as const;\n\nconst Hex = z\n .string()\n .regex(/^#[0-9a-fA-F]{6}$/, \"a colour is a 6-digit hex like #123551\")\n .transform((h) => h.toLowerCase());\n\n/** One line of copy. `in_scene` is lettered on something in the picture; `designed` is set in the brand's face. */\nconst AdCopyLine = z\n .object({\n text: z.string().trim().min(1),\n lettering: z.enum([\"in_scene\", \"designed\"]),\n /** headline | body | cta | caption | fine_print | label. */\n role: z.string().optional(),\n /** In-scene lines: the object it is written on (a whiteboard, a phone's notes app, a sticky note). */\n on: z.string().optional(),\n /** How it looks: an in-scene line's own lettering (chunky navy marker), a designed line's size or treatment. */\n look: z.string().optional(),\n /** Where it sits, by what is around it (\"top of the board\", \"under the headline\"). */\n position: z.string().optional(),\n })\n .strict();\nexport type AdCopyLine = z.infer<typeof AdCopyLine>;\n\n/** The role a picture plays: whose identity it fixes, which product it shows, or a prop in the scene. */\nexport const AD_REFERENCE_ROLES = [\"identity\", \"product\", \"prop\"] as const;\nexport type AdReferenceRole = (typeof AD_REFERENCE_ROLES)[number];\n\nconst AdReference = z\n .object({\n /** A role-based label, never a brand's: PERSON_1, ANIMAL_1, PRODUCT_1, BADGE_1, PROP_1. */\n id: z\n .string()\n .regex(\n /^(PERSON|ANIMAL|PRODUCT|BADGE|PROP)_\\d+$/,\n \"a reference id is PERSON_1, ANIMAL_1, PRODUCT_1, BADGE_1 or PROP_1\",\n ),\n role: z.enum(AD_REFERENCE_ROLES),\n /** The canvas ingest node that holds its picture (bookkeeping, never sent to a model). */\n slot: z.string().optional(),\n /** How it appears in this ad. */\n what: z.string().trim().min(1),\n /** What must stay exactly as in the picture, when more than the default for its role. */\n keep: z.string().optional(),\n /** The company avatar cast in this role (`baker avatars list`): a licensed face, never an invented one. */\n avatar: z.string().optional(),\n /**\n * A picture of ours that shows it (a path from the creative's folder, or a URL): every run\n * wires it into the renders (`ref_<id>`), so a picture is named here, never hand-wired.\n */\n image: z.string().trim().min(1).optional(),\n })\n .strict();\nexport type AdReference = z.infer<typeof AdReference>;\n\n/** Whether a reference is a real meme template: its picture comes from Imgflip, or its use says it is a meme. Pure. */\nexport function isMemeTemplate(reference: Pick<AdReference, \"what\" | \"image\">): boolean {\n return /(^|\\/\\/)i\\.imgflip\\.com\\//i.test(reference.image ?? \"\") || /\\bmemes?\\b/i.test(reference.what);\n}\n\n/**\n * Where the viewer lives and how they are spoken to: the language variant (es-ES, es-MX, pt-BR,\n * en-GB…), the currency and the form of address (tú, usted, vos). Read off the ad set's countries,\n * else COMPANY.md (`scaffold-viewer.ts`). One per creative: a campaign that runs in several\n * countries gets one global version with market-neutral people, places and money.\n */\nconst Market = z\n .object({\n /** ISO country code (ES, MX), or \"global\" for a version that runs in several. */\n country: z.string().trim().min(2),\n language: z.string().trim().min(2).optional(),\n currency: z.string().trim().min(1).optional(),\n /** How the copy addresses the viewer: tú, usted, vos, você, du, Sie, vous… */\n address: z.string().trim().min(1).optional(),\n })\n .strict();\nexport type AdMarket = z.infer<typeof Market>;\n\nconst Viewer = z\n .object({\n /** Who will see the ad, in the words a marketer would use. */\n who: z.string().trim().min(1),\n market: Market.optional(),\n /** What they already know about the brand and the offer; a list (as _definition.md keeps it) reads as one line. */\n knows: z.preprocess((v) => (Array.isArray(v) ? v.map(String).join(\"; \") || undefined : v), z.string().optional()),\n temperature: z.enum([\"cold\", \"warm\", \"hot\"]).optional(),\n /** Where they meet it (feed, Stories, Reels). */\n placement: z.string().optional(),\n })\n .strict();\nexport type AdViewer = z.infer<typeof Viewer>;\n\n/** A scene with the idea's format written into it as `concept` (agents do): the format is the idea's, not the scene's. */\nconst withoutFormatName = (v: unknown): unknown => {\n if (!v || typeof v !== \"object\" || Array.isArray(v) || typeof (v as { concept?: unknown }).concept !== \"string\")\n return v;\n const { concept: _format, ...scene } = v as Record<string, unknown>;\n return scene;\n};\n\nconst SceneFields = z\n .object({\n description: z.string().trim().min(1),\n /** A photograph, a designed graphic, or an illustration; plain synonyms (\"photography\") read as them. */\n look: z.preprocess(\n (v) =>\n typeof v !== \"string\"\n ? v\n : /^photo/i.test(v.trim())\n ? \"photo\"\n : /^illustrat/i.test(v.trim())\n ? \"illustration\"\n : /^(design|graphic)/i.test(v.trim())\n ? \"designed\"\n : v,\n z.enum([\"photo\", \"designed\", \"illustration\"]),\n ),\n /** How a photo was taken, in plain words (handheld at standing height, window light, faint glare). */\n capture: z.string().optional(),\n mood: z.string().optional(),\n /** How the frame is arranged, by what fills each part of it. */\n layout: z.string().optional(),\n })\n .strict();\nconst Scene = z.preprocess(withoutFormatName, SceneFields);\nexport type AdScene = z.infer<typeof SceneFields>;\n\nconst Brand = z\n .object({\n name: z.string().optional(),\n /** The words the brand's logo prints (its wordmark), so a check reads them as the logo, never as copy. */\n lockup: z.array(z.string().trim().min(1)).optional(),\n /** The brand's face in words, when no specimen of it is wired (\"a heavy geometric sans\"). */\n typeface: z.string().optional(),\n ground: Hex.optional(),\n ink: Hex.optional(),\n accent: Hex.optional(),\n cta: Hex.optional(),\n palette: z.array(Hex).default([]),\n })\n .strict();\nexport type AdBrand = z.infer<typeof Brand>;\n\n/** A colour tied to the object that carries it. A hex outside the brand palette never reaches a model. */\nconst ColorUse = z\n .object({ object: z.string().trim().min(1), name: z.string().trim().min(1), hex: Hex.optional() })\n .strict();\nexport type AdColorUse = z.infer<typeof ColorUse>;\n\nconst Mechanism = z.object({ device: z.string().trim().min(1), why_it_works: z.string().optional() }).strict();\n\n/**\n * Another brand on the ad: the one the offer is about (the car brand a dealer's loan is for, a\n * partner, the platform an app runs on), the review platform a rating comes from, or a category\n * signal: its logo may appear, exactly as that brand draws it. Never the source ad's advertiser\n * or a competitor.\n */\nconst ThirdPartyBrand = z\n .object({\n name: z.string().trim().min(1),\n /** Where it shows in this ad, by what carries it (\"the car the loan is for\"). */\n what: z.string().optional(),\n /** The reference (BADGE_1) that holds a picture of its logo, when one is wired. */\n logo: z\n .string()\n .regex(/^(PERSON|ANIMAL|PRODUCT|BADGE|PROP)_\\d+$/, \"a logo is a reference id like BADGE_1\")\n .optional(),\n /**\n * Why its logo is on our ad: `partner` (the offer is about it), `proof` (the review platform a\n * rating comes from), `category_signal` (how a stranger knows in a second what this is: the\n * Instagram and TikTok marks on a social media tool's ad).\n */\n role: z.enum([\"partner\", \"proof\", \"category_signal\"]).optional(),\n })\n .strict();\nexport type AdThirdPartyBrand = z.infer<typeof ThirdPartyBrand>;\n\n/**\n * What made a reference win, so what an ad built on it carries: `whole_ad` (it wins as one piece:\n * its disguise, layout and hook together), `layout` (the composition or container does the work),\n * `hook` (its opening line or first visual, the pattern that stops the scroll), `angle` (the\n * argument or need it pulls; its look is ordinary).\n */\nexport const CONCEPT_CARRY_LEVELS = [\"whole_ad\", \"layout\", \"hook\", \"angle\"] as const;\nexport type ConceptCarry = (typeof CONCEPT_CARRY_LEVELS)[number];\n\n/**\n * What a load-bearing element does for the reference: `stop`, what stops the scroll (a face, a joke, a\n * meme people know, an odd photo); `proof`, the device that makes it believed (the ✗/✓ checklist, the\n * before and after, the rating); `other`, anything else its win rests on. Dev, Oct 2026: a then/now\n * meme's fit named \"the contrast\" and never the reaction faces that stopped the scroll, and the ad\n * built on it lost them; a before/after kept its two columns and lost the ✗/✓ marks that were its proof.\n */\nconst LOAD_BEARING_JOBS = [\"stop\", \"proof\", \"other\"] as const;\nexport type LoadBearingJob = (typeof LOAD_BEARING_JOBS)[number];\n\n/**\n * What our ad does with a load-bearing element: `keep` it as it is, `replace` it with something of ours\n * that does the same job (named in `ours`), or it is `impossible` for us (a company rule forbids it,\n * quoted in `rule`, or nothing of ours can do its job).\n */\nconst KEEP_DECISIONS = [\"keep\", \"replace\", \"impossible\"] as const;\nexport type KeepDecision = (typeof KEEP_DECISIONS)[number];\n\nconst HAVE_FOR: Record<KeepDecision, \"have\" | \"adapt\" | \"missing\"> = {\n keep: \"have\",\n replace: \"adapt\",\n impossible: \"missing\",\n};\n\n/** A word of a closed set as written in any case and spacing (\"Stop\", \" keep \"). */\nconst word = (v: unknown): unknown => (typeof v === \"string\" ? v.trim().toLowerCase() : v);\n\n/** A load-bearing element written with its decision and not what we have: what we have follows from it. */\nexport const withDerivedHave = (v: unknown): unknown => {\n if (!v || typeof v !== \"object\" || Array.isArray(v) || \"have\" in v) return v;\n const decision = word((v as { decision?: unknown }).decision);\n const have = KEEP_DECISIONS.find((d) => d === decision);\n return have ? { ...v, have: HAVE_FOR[have] } : v;\n};\n\n/** The fields of one load-bearing element, as the ad spec and the fit both read them. */\nexport const LOAD_BEARING_FIELDS = {\n /** The element, as it shows in the picture (\"the free gift\", \"a peer's face\", \"the red ✗ marks\"). */\n element: z.string().trim().min(1),\n /** What it does for the ad (`LOAD_BEARING_JOBS`). */\n job: z.preprocess(word, z.enum(LOAD_BEARING_JOBS).optional()),\n /** What it takes to carry it (\"something the viewer wants for free\"). */\n needs: z.string().optional(),\n /** Whether we have it as it is, can adapt it, or have nothing for it. */\n have: z.enum([\"have\", \"adapt\", \"missing\"]),\n /** What our ad does with it (`KEEP_DECISIONS`); unset (older specs), it follows from `have`. */\n decision: z.preprocess(word, z.enum(KEEP_DECISIONS).optional()),\n /** What of ours carries it in this ad. */\n ours: z.string().optional(),\n /** The company rule that forbids it as it is, quoted word for word. */\n rule: z.string().optional(),\n};\n\n/** One thing the reference wins on, what it does, what it takes, and what we put in its place. */\nconst LoadBearing = z.preprocess(withDerivedHave, z.object(LOAD_BEARING_FIELDS).strict());\nexport type AdLoadBearing = z.infer<typeof LoadBearing>;\n\n/** What our ad does with an element: its decision, else the one `have` and `ours` imply. Pure. */\nexport function decisionOf(l: Pick<AdLoadBearing, \"have\" | \"decision\" | \"ours\">): KeepDecision {\n if (l.decision) return l.decision;\n if (l.have === \"have\") return \"keep\";\n return l.have === \"adapt\" || l.ours?.trim() ? \"replace\" : \"impossible\";\n}\n\nconst UNFIT_LEAD: Record<LoadBearingJob, (element: string) => string> = {\n stop: (element) => `what stops the scroll there, \"${element}\", cannot be ours`,\n proof: (element) => `its proof, \"${element}\", cannot be ours`,\n other: (element) => `it wins on \"${element}\", which we cannot supply`,\n};\n\nconst JOB_ORDER: Record<LoadBearingJob, number> = { stop: 0, proof: 1, other: 2 };\n\n/** Whether our brand's voice runs memes, and the voice line that says so. */\nexport type MemeAudience = { memes: \"fits\" | \"off_brand\"; why?: string };\n\n/** An element named as a meme or a reaction face. */\nconst MEME_ELEMENT = /\\bmemes?\\b|reaction[\\s-](?:face|image|gif|shot|photo)s?/i;\n\n/** Whether an element is a meme or a reaction face. Pure. */\nconst isMemeElement = (element: string): boolean => MEME_ELEMENT.test(element);\n\n/** The scroll-stoppers that are memes, for an audience that does not read them; none otherwise. Pure. */\nfunction memeReasons(concept: { load_bearing: readonly AdLoadBearing[] }, audience?: MemeAudience): string[] {\n if (audience?.memes !== \"off_brand\") return [];\n return concept.load_bearing\n .filter((l) => l.job === \"stop\" && decisionOf(l) !== \"impossible\" && isMemeElement(l.element))\n .map(\n (l) =>\n `what stops the scroll there, \"${l.element}\", is a meme, and our brand's voice does not run memes${audience.why ? ` (${audience.why})` : \"\"}`,\n );\n}\n\n/**\n * Why a reference cannot carry our ad, one reason per element it wins on that nothing of ours may\n * carry, what stops the scroll and the proof first, each with the company rule that forbids it when\n * one does; a meme that stops the scroll when our brand's voice does not run memes. None when every\n * element is ours to carry. Pure.\n */\nexport function unfitReasons(concept: { load_bearing: readonly AdLoadBearing[] }, audience?: MemeAudience): string[] {\n return [...impossibleReasons(concept), ...memeReasons(concept, audience)];\n}\n\nfunction impossibleReasons(concept: { load_bearing: readonly AdLoadBearing[] }): string[] {\n return concept.load_bearing\n .filter((l) => decisionOf(l) === \"impossible\" || (l.have === \"missing\" && !l.ours?.trim()))\n .sort((a, b) => JOB_ORDER[a.job ?? \"other\"] - JOB_ORDER[b.job ?? \"other\"])\n .map(\n (l) =>\n `${UNFIT_LEAD[l.job ?? \"other\"](l.element)}${l.rule?.trim() ? ` (a company rule: \"${l.rule.trim()}\")` : \"\"}`,\n );\n}\n\n/** An element the reference cannot win without: what stops the scroll, or its proof. */\nexport type VitalJob = Exclude<LoadBearingJob, \"other\">;\n\n/** Whether an element is what stops the scroll or the proof. Pure. */\nexport const isVital = (l: Pick<AdLoadBearing, \"job\">): l is Pick<AdLoadBearing, \"job\"> & { job: VitalJob } =>\n l.job === \"stop\" || l.job === \"proof\";\n\n/**\n * Why the reference won and what of it this ad keeps (`baker winning-ads fit` seeds it). Audited\n * Sept 2026: of 33 creatives built from winning ads, 12 lost what made the reference win. The\n * layers of why it wins: the disguise it wears, the voice it speaks in, the trigger it pulls, what\n * stops the scroll, the logic that convinces.\n */\nconst Concept = z\n .object({\n reference_ad_id: z.string().optional(),\n why_it_wins: z\n .object({\n disguise: z.string().optional(),\n voice: z.string().optional(),\n trigger: z.string().optional(),\n attention: z.string().optional(),\n logic: z.string().optional(),\n })\n .strict()\n .default({}),\n load_bearing: z.array(LoadBearing).default([]),\n verdict: z.enum([\"use\", \"adapt\", \"reject\"]),\n /** How the idea transfers to us, in a sentence. Bookkeeping: never compiled into a render. */\n transfer_note: z.string().optional(),\n /**\n * What made the reference win, so what this ad carries of it (`CONCEPT_CARRY_LEVELS`): the whole\n * ad, its layout, its hook or its angle. The render sees the reference for its structure only\n * for the whole ad or its layout. Unset (older specs): as the whole ad.\n */\n carry: z.enum(CONCEPT_CARRY_LEVELS).optional(),\n /** Why that level, in a sentence. Bookkeeping for the agent. */\n carry_why: z.string().optional(),\n })\n .strict();\nexport type AdConcept = z.infer<typeof Concept>;\n\nexport const AdSpecSchema = z\n .object({\n schema: z.enum(AD_SPEC_SCHEMAS),\n viewer: Viewer.optional(),\n /** The one thing the ad tells the viewer. Intent, never printed. */\n message: z.string().optional(),\n copy: z.array(AdCopyLine).default([]),\n scene: Scene,\n brand: Brand.optional(),\n colors: z.array(ColorUse).default([]),\n references: z.array(AdReference).default([]),\n /** The ad shows the brand's logo (the real file, wired on the canvas): on by default for a standard brand presence, whatever the reference showed. */\n logo: z.boolean().default(false),\n logo_position: z.string().optional(),\n /** Other brands the offer is about, whose logos the ad may show. */\n third_party_brands: z.array(ThirdPartyBrand).default([]),\n /**\n * Words the scene prints by itself, never copy: a phone's status bar and app chrome, a code\n * editor's line numbers, a product's own label, a platform's badge. The render may draw them\n * and the review never calls them extra words.\n */\n scene_text: z.preprocess(\n (v) => (Array.isArray(v) ? v.map((w) => (w && typeof w === \"object\" && \"text\" in w ? w.text : w)) : v),\n z.array(z.string().trim().min(1)).default([]),\n ),\n /** The formats the ad is made for; the canvas delivers them. */\n formats: z.array(z.string()).optional(),\n /** An optional note on direction for this concept. */\n direction: z.string().optional(),\n /** The device the ad is built on, and why it works on a stranger. Judged, never drawn. */\n mechanism: z.preprocess((v) => {\n const list = v && typeof v === \"object\" && !Array.isArray(v) ? [v] : v;\n return Array.isArray(list) ? list.map((m) => (typeof m === \"string\" ? { device: m } : m)) : list;\n }, z.array(Mechanism).default([])),\n /** Why the reference won and what this ad keeps of it (schema /3). */\n concept: Concept.optional(),\n /**\n * How the ad shows the brand, decided by the concept: `native` (a disguise: a note, a post, a\n * chat) carries the logo as the sender or avatar and no big button; `standard` the logo large\n * and a solid button. Unset: standard.\n */\n brand_presence: z.enum([\"native\", \"standard\"]).optional(),\n /** What kind of product a stranger takes it for in one second, never its format (\"a trade course\", \"a payroll app\"). */\n recognition: z.string().optional(),\n /**\n * The ad is a screen people know (a post on X, a WhatsApp chat, a wall of Trustpilot reviews, a\n * note, a Slack message), drawn exactly from HTML at every size (`native-surface.ts`); the image\n * model renders only the photos it holds. For a native disguise, never a painted imitation.\n */\n native: NativeSurfaceSchema.optional(),\n /** The product this ad sells (`src/content/products/<slug>.md`): a business unit's rules hold for it. */\n product: z.string().trim().min(1).optional(),\n /**\n * The company's rules this ad departs from because the person asked for it, each with why\n * (`baker creatives rules list`): a person's explicit ask beats a rule, visibly.\n */\n waive: z.array(z.object({ rule: z.string().trim().min(1), why: z.string().trim().min(1) }).strict()).optional(),\n // Bookkeeping: read by the agent and the judge's context, never compiled into a render.\n source: z.unknown().optional(),\n reference: z.unknown().optional(),\n notes: z.unknown().optional(),\n })\n .strict();\nexport type AdSpec = z.infer<typeof AdSpecSchema>;\n\n/** The canvas node a reference's own `image` is wired as (`syncStaticAdReferences`). */\nexport function referenceNodeId(reference: Pick<AdReference, \"id\">): string {\n return `ref_${reference.id.toLowerCase()}`;\n}\n\n/** Whether `raw` is a `prompt.json` written as an ad spec (rather than an older blueprint). */\nexport function isAdSpec(raw: unknown): boolean {\n const schema = raw && typeof raw === \"object\" ? (raw as { schema?: unknown }).schema : undefined;\n return (AD_SPEC_SCHEMAS as readonly unknown[]).includes(schema);\n}\n\n/**\n * Whether a render sees the reference it is built on, for its structure: only when the ad keeps its\n * concept and what won is the whole ad or its layout (an ad that won on its hook or angle lends no\n * arrangement). An older concept with no `carry` is read as the whole ad. Pure.\n */\nexport function seesReferenceStructure(spec: Pick<AdSpec, \"concept\">): boolean {\n const concept = spec.concept;\n if (!concept || concept.verdict === \"reject\") return false;\n return concept.carry === undefined || concept.carry === \"whole_ad\" || concept.carry === \"layout\";\n}\n\n/**\n * What the ad keeps of the reference it is built on, in words every reader states the same way:\n * each load-bearing element with what of ours carries it (\"the gift (two accounts free\n * forever)\"), and the idea in its layers. Null when the spec keeps no concept. Pure.\n */\nexport function conceptSummary(\n spec: Pick<AdSpec, \"concept\">,\n): { mustKeep: string[]; idea?: string; vital?: Array<{ keep: string; job: VitalJob }> } | null {\n const concept = spec.concept;\n if (!concept || concept.verdict === \"reject\") return null;\n // An ad held to more than it carries is blocked for being the ad it set out to be: an angle lends\n // no picture, a layout no trick and no element to check one by one, a hook only what stops the scroll.\n const carry = concept.carry ?? \"whole_ad\";\n if (carry === \"angle\") return null;\n const carried = carry === \"hook\" ? concept.load_bearing.filter((l) => l.job === \"stop\") : concept.load_bearing;\n // What of ours carries each element: the reference's own form (\"held in hands\") is not ours to keep.\n const keepOf = (l: AdLoadBearing) => (l.ours?.trim() ? `${l.ours.trim()} (the role ${l.element} plays)` : l.element);\n const mustKeep = carried.map(keepOf);\n // What stops the scroll and the proof, which the review asks one by one, per size.\n const vital = carry === \"layout\" ? [] : carried.flatMap((l) => (isVital(l) ? [{ keep: keepOf(l), job: l.job }] : []));\n const { disguise, voice } = concept.why_it_wins;\n const idea =\n carry === \"whole_ad\"\n ? [disguise?.trim(), voice?.trim() ? `in the voice of ${voice.trim()}` : \"\"].filter(Boolean).join(\", \")\n : \"\";\n return { mustKeep, ...(idea ? { idea } : {}), ...(vital.length > 0 ? { vital } : {}) };\n}\n\n/**\n * What stops a spec from rendering, in the agent's words: a reference the fit check rejected,\n * and a load-bearing element we have nothing for and named nothing in its place. Every problem is\n * a reason to pick another reference, not to render a weaker copy. Pure.\n */\nexport function conceptProblems(spec: Pick<AdSpec, \"concept\">): string[] {\n const concept = spec.concept;\n if (!concept) return [];\n const problems: string[] = [];\n if (concept.verdict === \"reject\") {\n problems.push(\n \"The reference was judged not to fit this company (`concept.verdict: reject`): what it wins on is something we cannot supply. Do not stop or ask: check the next candidates from your search (`baker winning-ads fit <adId>`, about three) and scaffold this concept on the first that fits.\",\n );\n }\n // What stops the scroll and the proof are held with the thinking that decided them (`keep-gate.ts`).\n for (const element of concept.load_bearing) {\n if (isVital(element) || element.have !== \"missing\" || element.ours?.trim()) continue;\n problems.push(\n `\"${element.element}\" is what the reference wins on and we have nothing for it: name what of ours carries it (\\`ours\\`), or pick another reference.`,\n );\n }\n return problems;\n}\n\nconst PLACEHOLDER = \"[TODO\";\n\n/**\n * What of the ad is still a placeholder: a spec started from an idea (`baker creatives make`\n * with no reference) leaves the scene and the copy for the agent to write. Pure.\n */\nexport function unwrittenProblems(spec: Pick<AdSpec, \"scene\" | \"copy\">): string[] {\n const problems: string[] = [];\n if (spec.scene.description.includes(PLACEHOLDER)) {\n problems.push(\"The scene is still a placeholder: write what the viewer sees in `scene.description`.\");\n }\n const lines = spec.copy.filter((line) => line.text.includes(PLACEHOLDER));\n if (lines.length > 0) {\n problems.push(`${lines.length} line(s) of copy are still placeholders: write each as it prints, or drop it.`);\n }\n return problems;\n}\n\n/** Words the scene puts in quotes: double quotes, or single quotes that are not an apostrophe. */\nconst QUOTED = /\"([^\"]{2,})\"|“([^”]{2,})”|(?<![\\p{L}\\p{N}])['‘]([^'’]{2,}?)['’](?![\\p{L}\\p{N}])/gu;\n/** A figure a picture would print as a claim: a price or a share. */\nconst FIGURE = /[£$€]\\s?\\d[\\d.,]*|\\d+(?:[.,]\\d+)?\\s?%/g;\n\nconst comparable = (text: string): string =>\n text\n .normalize(\"NFD\")\n .replace(/\\p{M}/gu, \"\")\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}£$€%]+/gu, \" \")\n .trim();\n\n/**\n * Words and figures the scene asks the picture to show that neither the copy nor `scene_text`\n * holds: the model prints them (invented, when only described), and the run then spends a whole\n * correction round erasing them. Dev, Oct 2026: three of three ads did (\"Bill figures are clearly\n * legible (around £400)\", \"a calendar showing 'Install day 9'\"). Pure.\n */\nexport function sceneWordProblems(spec: Pick<AdSpec, \"scene\" | \"copy\" | \"scene_text\">): string[] {\n const held = [...spec.copy.map((l) => l.text), ...spec.scene_text].map(comparable);\n const holds = (text: string) => {\n const want = comparable(text);\n return want.length === 0 || held.some((h) => h.includes(want));\n };\n const scene = [spec.scene.description, spec.scene.layout ?? \"\"].join(\" \");\n const quoted = [...scene.matchAll(QUOTED)].map((m) => (m[1] ?? m[2] ?? m[3] ?? \"\").trim()).filter((q) => !holds(q));\n const figures = (scene.match(FIGURE) ?? []).map((f) => f.trim()).filter((f) => !holds(f));\n const unheld = [...new Set([...quoted, ...figures])];\n if (unheld.length === 0) return [];\n return [\n `The scene asks the picture to show ${unheld.map((w) => `\"${w}\"`).join(\", \")}, which the copy does not hold: the picture would print it and the run would then spend a round erasing it. Put each one the ad needs in \\`copy\\` as an \\`in_scene\\` line with \\`on\\` (the bill, the phone), or describe that surface without words (blank, blurred, face-down).`,\n ];\n}\n\n/** Each field's shape, as the agent writes it: shown beside an error on that field. */\nconst FIELD_SHAPES: Readonly<Record<string, string>> = {\n copy: '\"copy\": [{\"text\": \"Book your free survey\", \"lettering\": \"designed\", \"role\": \"cta\"}]',\n scene: '\"scene\": {\"description\": \"a family on a sunny roof terrace\", \"look\": \"photo\"}',\n colors: '\"colors\": [{\"object\": \"the button\", \"name\": \"deep green\", \"hex\": \"#1F5C3A\"}]',\n references: '\"references\": [{\"id\": \"PRODUCT_1\", \"role\": \"product\", \"what\": \"the solar panel kit\"}]',\n third_party_brands: '\"third_party_brands\": [{\"name\": \"Trustpilot\", \"role\": \"proof\", \"logo\": \"BADGE_1\"}]',\n mechanism: '\"mechanism\": [{\"device\": \"a before and after\", \"why_it_works\": \"the change is seen, not told\"}]',\n viewer: '\"viewer\": {\"who\": \"homeowners with high energy bills\", \"knows\": \"nothing about us yet\"}',\n};\n\n/** The shapes agents get wrong most, said before they write (dev, Oct 2026: three of three producers). */\nexport const SPEC_SHAPES_HINT = `prompt.json shapes: ${[\"copy\", \"colors\", \"viewer\"].map((f) => FIELD_SHAPES[f]).join(\"; \")}.`;\n\n/**\n * Why a spec did not read, for the agent: one line per wrong item, then the shape of each field it\n * names. Dev, Oct 2026: two producers guessed `colors` four times each from a raw schema dump. Pure.\n */\nexport function adSpecErrorText(e: unknown): string {\n if (!(e instanceof z.ZodError)) return e instanceof Error ? e.message : String(e);\n const items = new Map<string, string[]>();\n for (const issue of e.issues) {\n const [field, index, key] = issue.path;\n const at =\n typeof index === \"number\" ? `${String(field)}[${index}]` : issue.path.map(String).join(\".\") || \"the spec\";\n const what =\n issue.code === \"unrecognized_keys\"\n ? `no field ${issue.keys.map((k) => `\"${k}\"`).join(\", \")}`\n : key !== undefined && typeof index === \"number\"\n ? `\"${String(key)}\" ${issue.message.replace(/^Invalid input: /, \"\")}`\n : issue.message.replace(/^Invalid input: /, \"\");\n items.set(at, [...(items.get(at) ?? []), what]);\n }\n const fields = [...new Set(e.issues.map((i) => String(i.path[0] ?? \"\")))].filter((f) => FIELD_SHAPES[f]);\n return [\n ...[...items].map(([at, whats]) => `${at}: ${[...new Set(whats)].join(\"; \")}`),\n ...fields.map((f) => `Shape: ${FIELD_SHAPES[f]}`),\n ].join(\"\\n\");\n}\n\n/**\n * The ad spec a `prompt.json` holds, whichever shape it was written in. An ad spec is\n * validated (a typo throws with the path, before anything bills); an older blueprint is read\n * through `adSpecFromBlueprint`, naming the source advertiser the library recorded so it is\n * scrubbed from anything compiled.\n */\nexport function readAdSpec(raw: unknown): AdSpec {\n if (isAdSpec(raw)) return AdSpecSchema.parse(raw);\n const advertiser = (raw as { reference?: { advertiser?: unknown } } | null)?.reference?.advertiser;\n return adSpecFromBlueprint(raw, { scrub: typeof advertiser === \"string\" ? [advertiser] : [] });\n}\n\n/** Lettering drawn by hand, in words: handwritten, hand-lettered, scrawled, chalked, in marker. */\nexport const HAND_LETTERED =\n /\\b(?:hand[- ]?(?:written|writing|lettered|lettering|drawn)|handwrit\\w*|scrawl\\w*|scribbl\\w*|markers?|felt[- ]?(?:tip|pen)s?|chalked|(?:written|drawn|lettered|painted) by hand)\\b/i;\n\n/**\n * Lettering written by hand, by the way it is drawn or the surface it is on: post-its,\n * whiteboards, chalkboards, notepads, marker, chalk, hand-lettering.\n */\nexport const HANDWRITING = new RegExp(\n `${HAND_LETTERED.source}|\\\\b(?:chalk\\\\w*|whiteboards?|blackboards?|sticky[- ]notes?|post[- ]?its?|notepads?|notebooks?|napkins?)\\\\b`,\n \"i\",\n);\n\n/**\n * The scene's own things a line is lettered on, named where it sits when it names no `on`: a chat\n * bubble, a panel, a card, a screen, a label, packaging, a sign.\n */\nconst SCENE_SURFACE =\n /\\b(?:bubbles?|chats?|messages?|panels?|cards?|screens?|phones?|apps?|ui|interface|windows?|browsers?|tabs?|menus?|notifications?|dashboards?|tables?|charts?|forms?|fields?|rows?|labels?|tags?|tickets?|receipts?|invoices?|packaging|packages?|boxe?s?|bottles?|jars?|cans?|bags?|signs?|signage|posters?|banners?|billboards?|mugs?|shirts?)\\b/i;\n\n/** What an in-scene line is lettered on: its `on`, else the scene's own thing where it sits names. */\nconst letteredOn = (line: AdCopyLine): string | undefined =>\n line.on?.trim() || SCENE_SURFACE.exec(`${line.position ?? \"\"} ${line.look ?? \"\"}`)?.[0];\n\n/**\n * In-scene copy that is set as type instead: written by hand (its surface, its look or where it\n * sits says so), or lettered on nothing in the scene, so not on real packaging, signage or a screen.\n */\nconst handwritten = (line: AdCopyLine): boolean => {\n const surface = letteredOn(line);\n return !surface || HANDWRITING.test(`${surface} ${line.look ?? \"\"} ${line.position ?? \"\"}`);\n};\n\n/**\n * The spec as it is rendered: handwritten copy (post-its, whiteboards, chalkboards,\n * hand-lettering) is set as designed type over the surface it was written on. The user rated\n * in-scene handwriting \"so bad, none of them work\" (E6 gallery, BENCH.md § \"E1 v2\") and again\n * \"very odd\" on post-its and boards (§ \"Fix round\"). A line the spec letters on a named surface of\n * real packaging, signage or a screen stays in the scene, whatever its length: set as type, a product's label\n * came back redrawn (§ \"Final\"). Pure.\n */\nexport function withRenderedLettering(spec: AdSpec): AdSpec {\n const designed = (line: AdCopyLine) => line.lettering === \"in_scene\" && handwritten(line);\n if (!spec.copy.some(designed)) return spec;\n const copy = spec.copy.map((line): AdCopyLine => {\n if (!designed(line)) return line;\n const { on, look: _look, position, ...rest } = line;\n const over = position ?? (on ? `over ${on}` : undefined);\n return { ...rest, lettering: \"designed\", ...(over ? { position: over } : {}) };\n });\n return { ...spec, copy };\n}\n\n/** What kind of picture the concept is, as the model router reads it (`image-model-router.ts`). */\nexport function conceptClassOf(spec: Pick<AdSpec, \"scene\" | \"references\">): ConceptClass {\n if (spec.scene.look === \"photo\") {\n return spec.references.some((r) => r.id.startsWith(\"PERSON_\")) ? \"photo_people\" : \"photo\";\n }\n return spec.scene.look;\n}\n\n// --- Plain text: what survives from a free-text field into a brief. ---\n\n/** Numbers a model cannot obey and a prompt should not pretend it can: percentages, lens and exposure figures. */\nconst PSEUDO_PRECISE =\n /\\d\\s*%|\\b\\d+(?:\\.\\d+)?\\s?mm\\b|\\bf\\/\\s?\\d|\\bISO\\s?\\d|\\b1\\/\\d+\\s?s\\b|\\bfocal length\\b|\\baperture\\b/i;\nconst HEX_TOKEN = /\\s*#[0-9a-fA-F]{6}\\b|\\s*#[0-9a-fA-F]{3}\\b/g;\n\n/**\n * A free-text field as a brief may carry it: hex codes out (a colour reaches the model only\n * tied to an object and from the brand palette), every clause carrying a percentage or a\n * lens/exposure figure dropped (a model has no coordinates and no lens, and a percentage\n * would fight the one safe-area owner), and the named advertisers removed.\n */\nexport function plainText(text: unknown, scrub: readonly string[] = []): string {\n if (typeof text !== \"string\") return \"\";\n let out = text.replace(HEX_TOKEN, \"\");\n for (const name of scrub) {\n const bare = name.replace(/[®™©]/g, \"\").trim();\n if (bare.length < 2) continue;\n out = out.replace(new RegExp(`\\\\b${bare.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b\\\\s*[®™©]?`, \"gi\"), \"\");\n }\n const kept = (text: string) =>\n text\n .split(/(?<=[,;])/)\n .map((c) => c.trim())\n .filter((c) => c && !PSEUDO_PRECISE.test(c));\n // A parenthesis says what came before it more closely: \"seen only from behind (back of the head,\n // face never shown) at a desk\" reads as an aside, never run into the words around it (Red Points, round 6).\n out = out.replace(/\\s*\\(([^()]*)\\)\\s*([.,;:!?]?)/g, (_m, inner: string, mark: string) => {\n const aside = kept(inner)\n .join(\" \")\n .replace(/[,;]\\s*$/, \"\");\n if (!aside) return mark ? `${mark} ` : \" \";\n return `: ${aside}${mark && mark !== \",\" ? mark : \",\"} `;\n });\n const clauses = kept(out.replace(/[()]/g, \" \"));\n return clauses\n .join(\" \")\n .replace(/\\s+([,;.])/g, \"$1\")\n .replace(/[,;]\\s*$/, \"\")\n .replace(/\\s{2,}/g, \" \")\n .trim();\n}\n\n// --- The adapter: an older blueprint read as an ad spec. ---\n\ntype Entry = Record<string, unknown>;\n\nconst str = (v: unknown): string | undefined => (typeof v === \"string\" && v.trim() ? v.trim() : undefined);\nconst entries = (v: unknown): Entry[] =>\n Array.isArray(v) ? v.filter((e): e is Entry => Boolean(e) && typeof e === \"object\") : [];\nconst hexOrUndefined = (v: unknown): string | undefined => {\n const parsed = Hex.safeParse(v);\n return parsed.success ? parsed.data : undefined;\n};\n\n/** What an in-scene line is written on, read off where the blueprint places it: the first named, in this order. */\nconst SURFACES = [\n \"whiteboard\",\n \"sticky note\",\n \"notepad\",\n \"receipt\",\n \"packaging\",\n \"bottle\",\n \"jar\",\n \"sign\",\n \"screenshot\",\n \"phone\",\n \"screen\",\n \"bubble\",\n \"card\",\n \"label\",\n \"ticket\",\n \"notification\",\n \"message\",\n \"panel\",\n] as const;\n\nfunction surfaceOf(placement: string | undefined): string | undefined {\n const lower = placement?.toLowerCase() ?? \"\";\n return SURFACES.find((s) => lower.includes(s));\n}\n\nconst TREATMENT_WORDS: Record<string, string> = {\n underline: \"underlined\",\n arrow: \"followed by an arrow\",\n button: \"as a button\",\n sticker: \"as a sticker\",\n highlight: \"highlighted\",\n};\n\nfunction treatmentOf(entry: Entry): string | undefined {\n const t = str(entry.treatment)?.toLowerCase();\n if (!t || t === \"plain\") return undefined;\n const key = Object.keys(TREATMENT_WORDS).find((k) => t.includes(k));\n return key ? TREATMENT_WORDS[key] : undefined;\n}\n\n/** Keep `value` under `key` only when it is non-empty. */\nconst field = <K extends string>(key: K, value: string | undefined): Partial<Record<K, string>> =>\n (value ? { [key]: value } : {}) as Partial<Record<K, string>>;\n\nfunction copyLineOf(entry: Entry, text: string, scrub: readonly string[]): AdCopyLine {\n const placement = str(entry.placement);\n const common = { text, ...field(\"role\", str(entry.role)), ...field(\"position\", plainText(placement, scrub)) };\n const treatment = treatmentOf(entry);\n if (!isInScene(entry)) return { ...common, lettering: \"designed\", ...field(\"look\", treatment) };\n const lettering = [plainText(entry.font_characteristics, scrub), treatment].filter(Boolean).join(\", \");\n const surface = surfaceOf(placement);\n return {\n ...common,\n lettering: \"in_scene\",\n ...field(\"on\", surface && `the ${surface}`),\n ...field(\"look\", lettering),\n };\n}\n\nfunction copyFromBlueprint(bp: Entry, scrub: readonly string[]): AdCopyLine[] {\n const seen = new Set<string>();\n return entries(bp.text_content).flatMap((entry) => {\n const text = str(entry.text);\n if (!text || str(entry.role)?.toLowerCase() === \"logo\" || seen.has(text)) return [];\n seen.add(text);\n return [copyLineOf(entry, text, scrub)];\n });\n}\n\nconst PRODUCT_CATEGORY = /product|package|packaging|bottle|box|can\\b|jar|tin|pack\\b/i;\nconst LIVING_CATEGORY = /animal|pet|dog|cat|character|mascot|creature/i;\n\n/** A blueprint entry's role, by what the rewritten blueprint says it is (never by the source's label). */\nfunction referenceRoleOf(collection: string, entry: Entry): { role: AdReferenceRole; prefix: string } {\n if (collection === \"people\") return { role: \"identity\", prefix: \"PERSON\" };\n if (collection === \"brands_logos\") return { role: \"prop\", prefix: \"BADGE\" };\n const category = `${str(entry.category) ?? \"\"} ${str(entry.treatment) ?? \"\"}`;\n if (LIVING_CATEGORY.test(category) || str(entry.expression)) return { role: \"identity\", prefix: \"ANIMAL\" };\n if (PRODUCT_CATEGORY.test(str(entry.category) ?? \"\")) return { role: \"product\", prefix: \"PRODUCT\" };\n return { role: \"prop\", prefix: \"PROP\" };\n}\n\n/**\n * The pictures an older blueprint grounds on: every entry the scaffold stamped with a\n * `reference_image` label. Relabelled by role (the stamped label is the source ad's, e.g. a\n * competitor's bag), with the canvas slot its old label names kept for wiring.\n */\nfunction referencesFromBlueprint(bp: Entry, scrub: readonly string[]): AdReference[] {\n const labelled = ([\"people\", \"subjects\", \"brands_logos\"] as const)\n .flatMap((collection) => entries(bp[collection]).map((entry) => ({ collection, entry })))\n .filter(\n ({ collection, entry }) =>\n str(entry.reference_image) &&\n !(collection === \"brands_logos\" && str(entry.function_in_image) === \"advertiser_brand\"),\n );\n const counters = new Map<string, number>();\n const pictured = labelled.map(({ collection, entry }): AdReference => {\n const { role, prefix } = referenceRoleOf(collection, entry);\n const n = (counters.get(prefix) ?? 0) + 1;\n counters.set(prefix, n);\n const described = entry.description ?? entry.apparent_identity_or_role ?? entry.what_it_represents;\n const what = plainText(described, scrub) || `the ${role === \"identity\" ? \"subject\" : role} in this picture`;\n return { id: `${prefix}_${n}`, role, slot: sanitizeId(`el_${str(entry.reference_image)}`, \"el\"), what };\n });\n // A product the blueprint describes with no picture stamped: a reference with no slot, so the\n // brief states it on its own and a trimmed scene cannot lose it (BENCH.md § \"Final\", the serum).\n const described = entries(bp.subjects).flatMap((entry): AdReference[] => {\n const what = plainText(entry.description, scrub);\n if (str(entry.reference_image) || !what || referenceRoleOf(\"subjects\", entry).role !== \"product\") return [];\n const n = (counters.get(\"PRODUCT\") ?? 0) + 1;\n counters.set(\"PRODUCT\", n);\n return [{ id: `PRODUCT_${n}`, role: \"product\", what }];\n });\n return [...pictured, ...described];\n}\n\n/** Where the advertiser's own logo sits in the blueprint, in words (percentages dropped). */\nfunction logoPositionOf(bp: Entry, scrub: readonly string[]): string | undefined {\n const own = entries(bp.brands_logos).find((e) => str(e.function_in_image) === \"advertiser_brand\");\n return plainText(own?.placement, scrub) || undefined;\n}\n\n/** The describe pass's roles for a brand the ad is about rather than one it merely shows (constants.ts `brands_logos`). */\nconst THIRD_PARTY_FUNCTIONS = new Set([\"partner\", \"sponsor\"]);\n\n/**\n * The partner and sponsor brands a blueprint shows, as third-party brands, each with the\n * reference that holds its logo picture when one is stamped. A brand `scrub` names (the source\n * ad's advertiser and, for a new ad, every brand the source showed) is never carried.\n */\nfunction thirdPartyFromBlueprint(bp: Entry, scrub: readonly string[], references: readonly AdReference[]) {\n const scrubbed = new Set(scrub.map((n) => n.trim().toLowerCase()));\n return entries(bp.brands_logos).flatMap((entry) => {\n const name = str(entry.brand_name);\n const role = str(entry.function_in_image)?.toLowerCase();\n if (!name || !role || !THIRD_PARTY_FUNCTIONS.has(role) || scrubbed.has(name.toLowerCase())) return [];\n const label = str(entry.reference_image);\n const slot = label ? sanitizeId(`el_${label}`, \"el\") : undefined;\n const logo = slot ? references.find((r) => r.slot === slot)?.id : undefined;\n return [{ name, ...field(\"what\", plainText(entry.what_it_represents, scrub)), ...(logo ? { logo } : {}) }];\n });\n}\n\nconst sub = (bp: Entry, key: string): Entry => (bp[key] && typeof bp[key] === \"object\" ? (bp[key] as Entry) : {});\n\nfunction lookOf(bp: Entry): AdScene[\"look\"] {\n const medium = str(sub(bp, \"meta\").medium)?.toLowerCase() ?? \"\";\n if (medium.includes(\"photo\")) return \"photo\";\n return /illustration|painting|3d/.test(medium) ? \"illustration\" : \"designed\";\n}\n\nfunction sceneDescriptionOf(bp: Entry, scrub: readonly string[]): string {\n const environment = sub(bp, \"environment\");\n const framing = plainText(sub(bp, \"composition\").framing, scrub);\n const setting = plainText(environment.setting, scrub);\n const things = [\n ...entries(bp.subjects).map((s) => plainText(s.description, scrub)),\n plainText(environment.foreground_elements, scrub),\n ].filter(Boolean);\n const where = [framing, setting].filter(Boolean).join(\", in \");\n const inFrame = things.length > 0 ? `In the frame: ${things.join(\"; \")}` : \"\";\n return [where, inFrame].filter(Boolean).join(\". \") || \"The ad's words on the brand's colours\";\n}\n\n/** How a photo was taken, in words: the camera, its height and angle, the light, the grain. */\nfunction captureOf(bp: Entry, scrub: readonly string[]): string {\n const camera = sub(bp, \"camera\");\n const lighting = sub(bp, \"lighting\");\n const source = entries(lighting.sources)[0];\n const direction = source ? str(source.direction) : undefined;\n const light = source\n ? plainText(\n [str(source.quality), str(source.type), \"light\", direction && `from the ${direction}`]\n .filter(Boolean)\n .join(\" \"),\n scrub,\n )\n : \"\";\n const grain = str(sub(bp, \"post_processing\").grain);\n return [\n plainText(camera.capture, scrub),\n plainText(camera.viewpoint, scrub),\n plainText(sub(bp, \"composition\").camera_height, scrub),\n plainText(camera.perspective ?? camera.perspective_distortion, scrub),\n light,\n plainText(lighting.specular_highlights, scrub),\n grain && grain !== \"none\" ? `${plainText(grain)} grain` : \"\",\n ]\n .filter(Boolean)\n .join(\", \");\n}\n\nfunction sceneFromBlueprint(bp: Entry, scrub: readonly string[]): AdScene {\n const look = lookOf(bp);\n const keywords = sub(bp, \"style\").mood_keywords;\n const mood = Array.isArray(keywords) ? keywords.filter((m): m is string => typeof m === \"string\").join(\", \") : \"\";\n return {\n description: sceneDescriptionOf(bp, scrub),\n look,\n ...field(\"capture\", look === \"photo\" ? captureOf(bp, scrub) : undefined),\n ...field(\"mood\", mood),\n ...field(\"layout\", plainText(sub(bp, \"composition\").visual_flow, scrub)),\n };\n}\n\n/** The colours the describe pass tied to what carries them (`color.palette[].where`); the compiler keeps the brand's only. */\nfunction colorsFromBlueprint(bp: Entry, scrub: readonly string[]): AdColorUse[] {\n const palette = entries((bp.color as Entry | undefined)?.palette);\n return palette.flatMap((c) => {\n const object = plainText(c.where, scrub);\n const name = plainText(c.name, scrub);\n const hex = hexOrUndefined(c.hex);\n return object && name ? [{ object, name, ...(hex ? { hex } : {}) }] : [];\n });\n}\n\n/**\n * The designed type's face in words, from the describe pass's `fonts` (the headline's entry\n * first): what the brief names when no specimen of the brand's face is wired, instead of a\n * generic sans that contradicts a serif or script brand.\n */\nfunction typefaceFromFonts(bp: Entry): string | undefined {\n const fonts = entries(bp.fonts);\n const font = fonts.find((f) => /headline/i.test(str(f.used_for) ?? \"\")) ?? fonts[0];\n const kind = plainText(font?.classification);\n const family = plainText(font?.family_guess);\n if (!kind && !family) return undefined;\n if (!kind) return family;\n return family ? `a ${kind} face like ${family}` : `a ${kind} face`;\n}\n\nfunction brandFromBlueprint(bp: Entry): AdBrand | undefined {\n const b = bp.brand as Entry | undefined;\n const typeface = str(b?.typeface) ?? typefaceFromFonts(bp);\n if (!b || typeof b !== \"object\") return typeface ? { typeface, palette: [] } : undefined;\n const palette = Array.isArray(b.palette) ? b.palette.map(hexOrUndefined).filter((h): h is string => Boolean(h)) : [];\n const roles = Object.fromEntries(\n ([\"ground\", \"ink\", \"accent\", \"cta\"] as const).flatMap((k) => {\n const hex = hexOrUndefined(b[k]);\n return hex ? [[k, hex]] : [];\n }),\n );\n const name = str(b.name);\n return { ...(name ? { name } : {}), ...(typeface ? { typeface } : {}), ...roles, palette };\n}\n\n/**\n * An older blueprint (the describe pass's read of the source ad, rewritten by the agent) as\n * an ad spec. Pure. Keeps what a render acts on and drops what it cannot (the source's\n * provenance, ownership metadata, lens figures, percentages, sampled hexes); `scrub` names\n * advertisers whose names must not survive into any compiled text.\n */\nexport function adSpecFromBlueprint(\n raw: unknown,\n opts: { scrub?: readonly string[]; presence?: \"native\" | \"standard\" } = {},\n): AdSpec {\n const bp = (raw && typeof raw === \"object\" ? raw : {}) as Entry;\n const scrub = opts.scrub ?? [];\n const intent = (bp.ad_intent ?? {}) as Entry;\n const brand = brandFromBlueprint(bp);\n const message = str(intent.viewer_takeaway);\n const viewer = Viewer.safeParse(bp.viewer);\n const references = referencesFromBlueprint(bp, scrub);\n const presence = opts.presence ?? (bp.brand_presence === \"native\" ? \"native\" : \"standard\");\n return {\n schema: AD_SPEC_SCHEMA,\n ...(viewer.success ? { viewer: viewer.data } : {}),\n ...(message ? { message: plainText(message, scrub) } : {}),\n copy: copyFromBlueprint(bp, scrub),\n scene: sceneFromBlueprint(bp, scrub),\n ...(brand ? { brand } : {}),\n colors: colorsFromBlueprint(bp, scrub),\n references,\n logo: bp.logo === false ? false : presence === \"native\" ? conceptHasLogo(bp) : true,\n third_party_brands: thirdPartyFromBlueprint(bp, scrub, references),\n scene_text: [],\n ...field(\"logo_position\", logoPositionOf(bp, scrub)),\n mechanism: winningMechanisms(bp).flatMap((m) => {\n const device = plainText(m.device, scrub);\n const why = m.why_it_works ? plainText(m.why_it_works, scrub) : \"\";\n return device ? [{ device, ...field(\"why_it_works\", why) }] : [];\n }),\n ...(bp.reference !== undefined ? { reference: bp.reference } : {}),\n };\n}\n\n/** The ad spec as JSON Schema, for a writer that needs the exact shape (input form: defaults optional). */\nexport function adSpecJsonSchema(): unknown {\n return z.toJSONSchema(AdSpecSchema, { io: \"input\", unrepresentable: \"any\" });\n}\n","/**\n * A native surface: the ad is a screen people already know (a post on X, a WhatsApp chat, a wall of\n * Trustpilot reviews, a note, a Slack message), drawn exactly, from HTML, rather than painted.\n *\n * Tier 1, Oct 2026: asked to \"replicate a tweet\", \"a WhatsApp chat\", \"a Trustpilot wall\", the image\n * model drew a generic card with our logo on top, an invented handle and a button; the person\n * rating it: \"this doesn't look at all like WhatsApp\", \"we are not replicating any official\n * platform\". A disguise only works when it is the real thing at a glance. So the screen is built\n * here, in the platform's own layout, type sizes and colours, with every word exact; the image\n * model is asked only for the photos the screen holds (the post's picture, a customer's portrait),\n * each a plain photo with no words, which is the one thing it does well. One designer: the HTML\n * lays out the ad, the photos are content, as in a real screenshot.\n *\n * Every size is the same screen fitted inside the area that size blocks on (`nativeLayoutInsets`),\n * so a 9:16 never puts a word where Stories covers it, by construction.\n *\n * Pure: the spec's `native` block, the brand and the pictures in, an HTML page out.\n */\nimport { z } from \"zod\";\nimport { figureForms } from \"./review-platforms.ts\";\n\nexport const NATIVE_SURFACES = [\n \"x_post\",\n \"whatsapp\",\n \"imessage\",\n \"trustpilot\",\n \"google_reviews\",\n \"notes\",\n \"slack\",\n] as const;\nexport type NativeSurfaceKind = (typeof NATIVE_SURFACES)[number];\n\nconst Hex = z\n .string()\n .regex(/^#[0-9a-fA-F]{6}$/, \"a colour is a 6-digit hex like #123551\")\n .transform((h) => h.toLowerCase());\n\n/** A photo the screen holds, by id: PHOTO_1. Rendered by the image model with no words, or ours (`image`). */\nconst PhotoId = z.string().regex(/^PHOTO_\\d+$/, \"a photo id is PHOTO_1, PHOTO_2…\");\n\n/**\n * Who a message, post or review is from, as the screen shows them. `avatar` is the brand's logo\n * (`logo`, the brand speaking), a photo of the screen (`PHOTO_1`), or their initials on a colour,\n * as most review sites and chats show a person without a picture.\n */\nconst Author = z\n .object({\n name: z.string().trim().min(1),\n /** Their handle with the @, as the platform prints it: a real one of ours, never an invented one. */\n handle: z.string().trim().min(2).optional(),\n avatar: z.union([z.literal(\"logo\"), z.literal(\"initials\"), PhotoId]).default(\"initials\"),\n verified: z.boolean().optional(),\n /** A line under the name: a review site's \"3 reviews · ES\", a chat's \"online\". */\n subtitle: z.string().trim().min(1).optional(),\n })\n .strict();\nexport type NativeAuthor = z.infer<typeof Author>;\n\nconst Photo = z\n .object({\n id: PhotoId,\n /** What the photo shows, in plain words: who, doing what, where. */\n what: z.string().trim().min(1),\n /** Its shape on the screen. */\n ratio: z.enum([\"1:1\", \"4:3\", \"3:4\", \"16:9\", \"4:5\"]).default(\"4:3\"),\n look: z.enum([\"photo\", \"illustration\"]).default(\"photo\"),\n /**\n * A picture of ours (a path from the creative's folder, or a URL): used as it is, nothing\n * rendered. There is no `avatar`: nothing grounds a rendered photo on an avatar's sheet, so a\n * photo naming one would still render a made-up face (the strict schema refuses the key).\n */\n image: z.string().trim().min(1).optional(),\n })\n .strict();\nexport type NativePhoto = z.infer<typeof Photo>;\n\nconst XPost = z\n .object({\n author: Author,\n text: z.string().trim().min(1),\n photo: PhotoId.optional(),\n /** The handle this post answers, printed above it as X does (\"Replying to @alexbuilds\"). */\n reply_to: z.string().trim().min(2).optional(),\n /** How long ago, as X prints it: 2h, 14m, Sep 3. */\n time: z.string().trim().min(1).optional(),\n stats: z\n .object({\n replies: z.string().optional(),\n reposts: z.string().optional(),\n likes: z.string().optional(),\n views: z.string().optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nconst ChatCard = z\n .object({\n photo: PhotoId.optional(),\n title: z.string().trim().min(1),\n subtitle: z.string().trim().min(1).optional(),\n /** The card's button, as the chat prints it (\"Pagar $899 MXN\"). */\n button: z.string().trim().min(1).optional(),\n })\n .strict();\n\nconst ChatMessage = z\n .object({\n /** `them` is the other side of the chat (the contact in the header), `me` the phone's owner. */\n from: z.enum([\"them\", \"me\"]),\n text: z.string().trim().min(1).optional(),\n time: z.string().trim().min(1).optional(),\n card: ChatCard.optional(),\n })\n .strict()\n .refine((m) => m.text || m.card, \"a message has text or a card\");\n\nconst Review = z\n .object({\n author: Author,\n stars: z.number().int().min(1).max(5).default(5),\n title: z.string().trim().min(1).optional(),\n text: z.string().trim().min(1),\n date: z.string().trim().min(1).optional(),\n })\n .strict();\n\nconst NotesItem = z.object({ text: z.string().trim().min(1), checked: z.boolean().default(false) }).strict();\n\nconst SlackMessage = z\n .object({\n author: Author,\n text: z.string().trim().min(1),\n time: z.string().trim().min(1).optional(),\n reactions: z\n .array(z.object({ emoji: z.string().trim().min(1), count: z.number().int().min(1) }).strict())\n .default([]),\n /** \"3 replies\" under the message. */\n replies: z.string().trim().min(1).optional(),\n })\n .strict();\n\n/**\n * What sits around the screen: a headline in the brand's face above it, a caption under it, the\n * brand's logo, the colour behind it. A native ad usually has none of them: the platform prints the\n * page's name and button around every ad.\n */\nconst Frame = z\n .object({\n headline: z.string().trim().min(1).optional(),\n caption: z.string().trim().min(1).optional(),\n logo: z.boolean().default(false),\n /** Where the frame's logo goes: under the screen, or over it as a badge (a review wall's anchor). */\n logo_position: z.enum([\"under\", \"over\"]).default(\"under\"),\n background: Hex.optional(),\n })\n .strict()\n .default({ logo: false, logo_position: \"under\" });\n\nconst Base = { photos: z.array(Photo).default([]), frame: Frame };\n\nexport const NativeSurfaceSchema = z.discriminatedUnion(\"surface\", [\n z\n .object({\n surface: z.literal(\"x_post\"),\n theme: z.enum([\"light\", \"dark\"]).default(\"light\"),\n /** One post, or a thread: each after the first a reply under it, its line joining them. */\n posts: z.array(XPost).min(1).max(4),\n ...Base,\n })\n .strict(),\n z\n .object({\n surface: z.enum([\"whatsapp\", \"imessage\"]),\n /** Who the chat is with: the header's name and picture. */\n contact: Author,\n messages: z.array(ChatMessage).min(1).max(8),\n /** The day pill above the messages (\"Hoy\", \"Today\"). */\n day: z.string().trim().min(1).optional(),\n /** Drawn inside a phone; else the screen alone. Default true. */\n device: z.boolean().default(true),\n ...Base,\n })\n .strict(),\n z\n .object({\n surface: z.enum([\"trustpilot\", \"google_reviews\"]),\n /** The rating the platform shows for the company: a real one, in `src/content`. */\n summary: z\n .object({ score: z.string().trim().min(1), count: z.string().trim().min(1), label: z.string().optional() })\n .strict()\n .optional(),\n /**\n * Every real review the wall shows, the strongest first: the first two are read as the ad's\n * copy, whole in the safe area; the rest are the wall they lie on, as large and as sharp, across\n * the whole frame and cut by its edges. A wall wins on how many there are (8 to 16), each one a\n * real review in the company's own words.\n */\n reviews: z.array(Review).min(1).max(16),\n ...Base,\n })\n .strict(),\n z\n .object({\n surface: z.literal(\"notes\"),\n title: z.string().trim().min(1),\n items: z.array(NotesItem).default([]),\n body: z.string().trim().min(1).optional(),\n ...Base,\n })\n .strict(),\n z\n .object({\n surface: z.literal(\"slack\"),\n channel: z.string().trim().min(1),\n messages: z.array(SlackMessage).min(1).max(6),\n ...Base,\n })\n .strict(),\n]);\nexport type NativeSurface = z.infer<typeof NativeSurfaceSchema>;\n\nconst SURFACE_NAMES: Record<NativeSurfaceKind, string> = {\n x_post: \"a post on X\",\n whatsapp: \"a WhatsApp chat\",\n imessage: \"an iMessage chat\",\n trustpilot: \"a wall of Trustpilot reviews\",\n google_reviews: \"a wall of Google reviews\",\n notes: \"a note in the Notes app\",\n slack: \"a Slack message\",\n};\n\n/** The screen as a viewer would name it (\"a post on X\"). */\nexport function nativeSurfaceName(surface: Pick<NativeSurface, \"surface\">): string {\n return SURFACE_NAMES[surface.surface];\n}\n\n// --- What the screen says ------------------------------------------------------------\n\n/** Every word of ours the screen prints, in reading order: what the review reads back as copy. */\nexport function nativeCopy(surface: NativeSurface): string[] {\n const frame = [surface.frame.headline, surface.frame.caption];\n const body = ((): Array<string | undefined> => {\n switch (surface.surface) {\n case \"x_post\":\n return surface.posts.map((p) => p.text);\n case \"whatsapp\":\n case \"imessage\":\n return surface.messages.flatMap((m) => [m.text, m.card?.title, m.card?.subtitle, m.card?.button]);\n case \"trustpilot\":\n case \"google_reviews\":\n return surface.reviews.slice(0, FEATURED_REVIEWS).flatMap((r) => [r.title, shownReview(r.text)]);\n case \"notes\":\n return [surface.title, ...surface.items.map((i) => i.text), surface.body];\n case \"slack\":\n return surface.messages.map((m) => m.text);\n default:\n return [];\n }\n })();\n return [frame[0], ...body, frame[1]].filter((t): t is string => Boolean(t?.trim()));\n}\n\n/**\n * How many reviews of a wall are read as its copy, set whole inside the safe area: the rest are the\n * wall behind them, cut by the frame's edges as the reference walls are. Two, as the walls that win\n * show (Tier 1, Oct 2026: three in a column were small and the blurred pile under them read as a mess).\n */\nexport const FEATURED_REVIEWS = 2;\n\n/** The most of a review's text a card shows: past it, the platform's own lists cut it at a word. */\nconst REVIEW_SHOWN = 160;\n\n/** A review's text as its card shows it: whole, or cut at the last word that fits, with an ellipsis. */\nfunction shownReview(text: string): string {\n if (text.length <= REVIEW_SHOWN) return text;\n const cut = text.slice(0, REVIEW_SHOWN - 1);\n const atWord = cut.slice(0, Math.max(cut.lastIndexOf(\" \"), REVIEW_SHOWN / 2));\n return `${atWord.replace(/[\\s,.;:!?¡¿-]+$/u, \"\")}…`;\n}\n\n/** The authors the screen names. */\nfunction authorsOf(surface: NativeSurface): NativeAuthor[] {\n switch (surface.surface) {\n case \"x_post\":\n return surface.posts.map((p) => p.author);\n case \"whatsapp\":\n case \"imessage\":\n return [surface.contact];\n case \"trustpilot\":\n case \"google_reviews\":\n return surface.reviews.map((r) => r.author);\n case \"slack\":\n return surface.messages.map((m) => m.author);\n default:\n return [];\n }\n}\n\n/**\n * The words the platform itself prints (names, handles, times, counts, its labels), in the\n * viewer's language (`words`, when written for it): never copy, and the review never calls them\n * extra words.\n */\nexport function nativeChrome(surface: NativeSurface, language?: string, words?: InterfaceWords): string[] {\n const t = chromeWords(language, words);\n // A reader splits a handle at its underscores and dots: every part is the platform's too.\n const handleParts = (h?: string) => (h ? [h, h.replace(/^@/, \"\"), ...h.replace(/^@/, \"\").split(/[_.]/)] : []);\n const authors = authorsOf(surface).flatMap((a) => [a.name, ...handleParts(a.handle), a.subtitle, initials(a.name)]);\n const own = ((): Array<string | undefined> => {\n switch (surface.surface) {\n case \"x_post\":\n return surface.posts.flatMap((p) => [\n p.time,\n ...Object.values(p.stats ?? {}),\n ...(p.reply_to ? [t.replying, ...handleParts(p.reply_to)] : []),\n ]);\n case \"whatsapp\":\n case \"imessage\":\n return [surface.day ?? t.today, ...surface.messages.map((m) => m.time), t.online, t.business, t.message];\n case \"trustpilot\":\n case \"google_reviews\":\n return [\n ...surface.reviews.slice(FEATURED_REVIEWS).flatMap((r) => [r.title, shownReview(r.text)]),\n ...surface.reviews.map((r) => r.date),\n surface.summary?.score,\n surface.summary?.count,\n surface.summary?.label ?? t.excellent,\n t.verified,\n surface.surface === \"trustpilot\" ? \"Trustpilot\" : \"Google\",\n t.reviewsWord,\n ];\n case \"notes\":\n return [t.notes];\n case \"slack\":\n return [\n `#${surface.channel.replace(/^#/, \"\")}`,\n ...surface.messages.flatMap((m) => [m.time, m.replies, ...m.reactions.map((r) => String(r.count))]),\n ];\n default:\n return [];\n }\n })();\n // A 9:16 draws the app full screen, with its reply and message prompts.\n const prompts = [t.post, t.replyPrompt, t.messagePrompt];\n return [...new Set([...authors, ...own, ...prompts].filter((w): w is string => Boolean(w?.trim())))];\n}\n\n/** Every photo id the screen names, each once: an avatar, a post's picture, a chat card's. */\nfunction photoIdsNamed(surface: NativeSurface): string[] {\n const avatars = authorsOf(surface).flatMap((a) => (a.avatar.startsWith(\"PHOTO_\") ? [a.avatar] : []));\n const pictures =\n surface.surface === \"x_post\"\n ? surface.posts.map((p) => p.photo)\n : surface.surface === \"whatsapp\" || surface.surface === \"imessage\"\n ? surface.messages.map((m) => m.card?.photo)\n : [];\n return [...new Set([...avatars, ...pictures.filter((id): id is string => Boolean(id))])];\n}\n\n/** The photos the screen shows, each once, in the order they are named. */\nexport function nativePhotosShown(surface: NativeSurface): NativePhoto[] {\n const named = new Set(photoIdsNamed(surface));\n return surface.photos.filter((p) => named.has(p.id));\n}\n\n/** The photos the screen shows as somebody's avatar (a square portrait), not as a picture. */\nexport function avatarPhotoIds(surface: NativeSurface): Set<string> {\n return new Set(authorsOf(surface).flatMap((a) => (a.avatar.startsWith(\"PHOTO_\") ? [a.avatar] : [])));\n}\n\n/** A photo named on the screen that the spec does not describe. */\nexport function nativeProblems(surface: NativeSurface): string[] {\n const described = new Set(surface.photos.map((p) => p.id));\n return photoIdsNamed(surface)\n .filter((id) => !described.has(id))\n .map(\n (id) => `\\`native\\` shows ${id} but \\`native.photos\\` does not say what it is: add {\"id\":\"${id}\",\"what\":\"…\"}.`,\n );\n}\n\n/**\n * What stops a native screen from rendering, in the agent's words: a photo it never describes, a\n * handle of ours the company's records never state (Tier 1, Oct 2026: the brand posted as an\n * invented \"@kampe.pro\"), and a rating the records do not hold. `records` is COMPANY.md and\n * src/content, as the proof check reads them. Pure.\n */\nexport function nativeGateProblems(surface: NativeSurface, records: string, brandName?: string): string[] {\n const problems = nativeProblems(surface);\n const haystack = records.toLowerCase();\n const ours = (a: NativeAuthor) =>\n a.avatar === \"logo\" || (brandName !== undefined && a.name.trim().toLowerCase() === brandName.trim().toLowerCase());\n for (const author of authorsOf(surface)) {\n if (!author.handle || !ours(author)) continue;\n const bare = author.handle.replace(/^@/, \"\").toLowerCase();\n if (!haystack.includes(bare)) {\n problems.push(\n `The screen shows the brand as ${author.handle}, a handle COMPANY.md and src/content never state: use the brand's real handle, or drop \\`handle\\` (never an invented one).`,\n );\n }\n }\n if ((surface.surface === \"trustpilot\" || surface.surface === \"google_reviews\") && surface.summary) {\n if (!figureForms(surface.summary.score.toLowerCase()).some((form) => haystack.includes(form))) {\n problems.push(\n `The screen shows a ${surface.summary.score} rating the company's records (COMPANY.md, src/content) do not hold: add where it comes from, or drop \\`summary\\`.`,\n );\n }\n }\n return problems;\n}\n\n// --- The page ------------------------------------------------------------------------\n\n/** What each of the interface's own words is, for the model that writes them in another language. */\nconst WORD_MEANINGS = {\n today: \"the day label over today's messages in a chat\",\n online: \"the status under a chat contact's name\",\n business: \"the label under a WhatsApp business contact's name\",\n message: \"the placeholder in a chat's message bar\",\n verified: \"the badge on a verified review\",\n excellent: \"the word a review site prints beside a 4.5-5 star score\",\n reviewsWord: \"the plural noun after the review count (1,200 reviews)\",\n notes: \"the title of the phone's notes app\",\n experience: \"the label before the date a reviewer had the experience\",\n replying: \"the words before the handle a post on X replies to\",\n post: \"the title over a thread on X\",\n replyPrompt: \"the placeholder of the reply bar under a thread on X\",\n messagePrompt: \"the placeholder of Slack's message bar, before the channel name\",\n} as const;\n\n/** The words a platform's own interface prints around the ad's copy, in the viewer's language. */\nexport type InterfaceWords = Record<keyof typeof WORD_MEANINGS, string>;\n\nconst InterfaceWordsSchema = z.object(\n Object.fromEntries(Object.keys(WORD_MEANINGS).map((k) => [k, z.string().trim().min(1)])) as Record<\n keyof typeof WORD_MEANINGS,\n z.ZodString\n >,\n);\n\n/**\n * The words as the platforms print them in the languages someone checked against the apps\n * themselves; every other language is written by the text model (`interfaceWordsPrompt`), once per\n * language, and handed in (`words`).\n */\nconst CHECKED: Readonly<Record<string, InterfaceWords>> = {\n es: {\n today: \"Hoy\",\n online: \"en línea\",\n business: \"Cuenta de empresa\",\n message: \"Mensaje\",\n verified: \"Verificada\",\n excellent: \"Excelente\",\n reviewsWord: \"opiniones\",\n notes: \"Notas\",\n experience: \"Fecha de la experiencia\",\n replying: \"En respuesta a\",\n post: \"Post\",\n replyPrompt: \"Postea tu respuesta\",\n messagePrompt: \"Enviar mensaje a\",\n },\n pt: {\n today: \"Hoje\",\n online: \"online\",\n business: \"Conta comercial\",\n message: \"Mensagem\",\n verified: \"Verificada\",\n excellent: \"Excelente\",\n reviewsWord: \"avaliações\",\n notes: \"Notas\",\n experience: \"Data da experiência\",\n replying: \"Em resposta a\",\n post: \"Post\",\n replyPrompt: \"Poste sua resposta\",\n messagePrompt: \"Enviar mensagem para\",\n },\n en: {\n today: \"Today\",\n online: \"online\",\n business: \"Business account\",\n message: \"Message\",\n verified: \"Verified\",\n excellent: \"Excellent\",\n reviewsWord: \"reviews\",\n notes: \"Notes\",\n experience: \"Date of experience\",\n replying: \"Replying to\",\n post: \"Post\",\n replyPrompt: \"Post your reply\",\n messagePrompt: \"Message\",\n },\n};\n\nconst primary = (language?: string): string => (language ?? \"en\").split(/[-_]/)[0]?.toLowerCase() ?? \"en\";\n\n/** Whether the interface's words in `language` have to be written by the model: no checked ones exist. Pure. */\nexport function needsInterfaceWords(language?: string): boolean {\n return language !== undefined && CHECKED[primary(language)] === undefined;\n}\n\n/** Bump when the prompt changes what is asked: words written for the old one are not reused. */\nexport const INTERFACE_WORDS_PROMPT_VERSION = 1;\n\n/** What the text model is asked: the interface's words as the platforms print them in `language`. Pure. */\nexport function interfaceWordsPrompt(language: string): string {\n const english = CHECKED.en as InterfaceWords;\n return [\n `These are the words WhatsApp, iMessage, X, Slack, Trustpilot, Google reviews and the phone's notes app print around what people write, in English. Give each as those apps print it in their interface for people whose language is ${language}: the apps' own wording, short, in that language's script and capitalisation.`,\n \"\",\n ...Object.entries(WORD_MEANINGS).map(\n ([key, meaning]) => `- \"${key}\": ${JSON.stringify(english[key as keyof InterfaceWords])} (${meaning})`,\n ),\n \"\",\n `Reply with only this JSON, every key above with its words: {${Object.keys(WORD_MEANINGS)\n .map((k) => `\"${k}\": \"…\"`)\n .join(\", \")}}`,\n ].join(\"\\n\");\n}\n\n/** The words of a model's answer when it gives every one; null otherwise. Pure. */\nexport function readInterfaceWords(answer: unknown): InterfaceWords | null {\n const parsed = InterfaceWordsSchema.safeParse(answer);\n return parsed.success ? parsed.data : null;\n}\n\n/** The words to print for `language`: the checked ones, else those written for it, else English. */\nfunction chromeWords(language?: string, words?: InterfaceWords): InterfaceWords {\n return CHECKED[primary(language)] ?? words ?? (CHECKED.en as InterfaceWords);\n}\n\n/** The pictures the page is built with, each a URL the page can load (a data URL in practice). */\nexport type NativeAssets = {\n /** The logo that reads on a light card (a review site's summary, an avatar). */\n logo?: string;\n /** The logo that reads on the colour behind the screen, for the frame; else `logo`. */\n frameLogo?: string;\n /** The logo's square mark (an icon or isologo file), for an avatar; else the logo itself, contained. */\n mark?: string;\n photos: Record<string, string>;\n /** The brand's face for the frame's headline (a font URL). */\n font?: string;\n /** The logos above that are light (white) ink: on a light ground they are inked dark, the brand having no dark one. */\n lightLogos?: string[];\n};\n\n/** ` inked` when a light logo sits on a light ground, so it reads; else nothing. */\nfunction inked(assets: NativeAssets, src: string | undefined, groundIsDark: boolean): string {\n return src && !groundIsDark && assets.lightLogos?.includes(src) ? \" inked\" : \"\";\n}\n\nexport type NativeFrameOpts = {\n /** The delivered size in pixels; the page lays out at half (2x device scale). */\n width: number;\n height: number;\n /** The fractions of each edge an interface covers or a feed trims (`staticSafeArea`). */\n safe: { top: number; bottom: number; left: number; right: number };\n brand: { name?: string; ground?: string; ink?: string; accent?: string; cta?: string };\n language?: string;\n /** The interface's words written for `language` when no checked ones exist (`needsInterfaceWords`). */\n words?: InterfaceWords;\n};\n\n/** A time or figure kept on one line: \"11:47 p. m.\", \"4-6 semanas\", \"100 %\". */\nfunction keepTogether(html: string): string {\n return html\n .replace(/\\b([ap])\\. m\\./g, \"$1. m.\")\n .replace(/(\\d) (?=[ap]\\.|%|€|\\$|(?:semanas|weeks|días|days|min)\\b)/g, \"$1 \");\n}\n\nconst esc = (text: string): string =>\n text.replace(/[&<>\"]/g, (ch) => ({ \"&\": \"&\", \"<\": \"<\", \">\": \">\", '\"': \""\" })[ch] as string);\n\n/** A post's text with its hashtags, mentions and links in the platform's link colour. */\nfunction linked(text: string): string {\n return esc(text).replace(/(^|[\\s(])([#@][\\p{L}\\p{N}_]+|https?:\\/\\/\\S+)/gu, '$1<span class=\"link\">$2</span>');\n}\n\n/** One or two letters for an avatar without a picture. */\nexport function initials(name: string): string {\n const words = name\n .replace(/[^\\p{L}\\s]/gu, \" \")\n .split(/\\s+/)\n .filter(Boolean);\n const first = words[0]?.[0] ?? \"\";\n const second = words.length > 1 ? (words[1]?.[0] ?? \"\") : \"\";\n return `${first}${second}`.toUpperCase();\n}\n\n/** The soft colours review sites put behind initials, picked by name so a person keeps theirs. */\nconst INITIALS_TINTS = [\"#f4d7c4\", \"#d6e4f5\", \"#dcecd7\", \"#f2dcef\", \"#f6e7b8\", \"#d9d6f2\"];\nfunction tintOf(name: string): string {\n let sum = 0;\n for (const ch of name) sum += ch.codePointAt(0) ?? 0;\n return INITIALS_TINTS[sum % INITIALS_TINTS.length] as string;\n}\n\nfunction avatarHtml(author: NativeAuthor, assets: NativeAssets, cls: string): string {\n if (author.avatar === \"logo\") {\n const src = assets.mark ?? assets.logo;\n if (src) return `<div class=\"${cls} logo-av\"><img src=\"${src}\" alt=\"\"></div>`;\n } else if (author.avatar !== \"initials\") {\n const src = assets.photos[author.avatar];\n if (src) return `<div class=\"${cls}\"><img src=\"${src}\" alt=\"\"></div>`;\n }\n return `<div class=\"${cls} initials\" style=\"background:${tintOf(author.name)}\">${esc(initials(author.name))}</div>`;\n}\n\nconst ICON = {\n verifiedX:\n '<svg class=\"badge\" viewBox=\"0 0 22 22\"><path fill=\"#1d9bf0\" d=\"M20.4 11c0-1.3-.8-2.4-1.9-2.9.4-1.2.1-2.6-.8-3.5s-2.3-1.2-3.5-.8C13.7 2.6 12.4 1.8 11 1.8s-2.6.8-3.1 2c-1.2-.4-2.6-.1-3.5.8s-1.2 2.3-.8 3.5C2.4 8.6 1.6 9.7 1.6 11s.8 2.4 1.9 2.9c-.4 1.2-.1 2.6.8 3.5s2.3 1.2 3.5.8c.5 1.2 1.8 2 3.2 2s2.6-.8 3.1-2c1.2.4 2.6.1 3.5-.8s1.2-2.3.8-3.5c1.2-.5 2-1.6 2-2.9z\"/><path fill=\"#fff\" d=\"M9.6 14.6 6.4 11.4l1.3-1.3 1.9 1.9 4.6-4.6 1.3 1.3z\"/></svg>',\n verifiedWa:\n '<svg class=\"badge\" viewBox=\"0 0 22 22\"><path fill=\"#25d366\" d=\"M20.4 11c0-1.3-.8-2.4-1.9-2.9.4-1.2.1-2.6-.8-3.5s-2.3-1.2-3.5-.8C13.7 2.6 12.4 1.8 11 1.8s-2.6.8-3.1 2c-1.2-.4-2.6-.1-3.5.8s-1.2 2.3-.8 3.5C2.4 8.6 1.6 9.7 1.6 11s.8 2.4 1.9 2.9c-.4 1.2-.1 2.6.8 3.5s2.3 1.2 3.5.8c.5 1.2 1.8 2 3.2 2s2.6-.8 3.1-2c1.2.4 2.6.1 3.5-.8s1.2-2.3.8-3.5c1.2-.5 2-1.6 2-2.9z\"/><path fill=\"#fff\" d=\"M9.6 14.6 6.4 11.4l1.3-1.3 1.9 1.9 4.6-4.6 1.3 1.3z\"/></svg>',\n reply:\n '<svg viewBox=\"0 0 24 24\"><path d=\"M1.8 10c0-4.4 3.6-8 8-8h4.4c4.5 0 8.1 3.6 8.1 8.1 0 3-1.6 5.6-4.2 7.1L10 21.7v-3.6H9.9C5.4 18.1 1.8 14.5 1.8 10zm8-6c-3.3 0-6 2.7-6 6 0 3.4 2.7 6.1 6.1 6.1H12v2.3l5.1-2.8c1.9-1.1 3.1-3.1 3.1-5.4 0-3.4-2.7-6.1-6.1-6.1H9.8z\"/></svg>',\n repost:\n '<svg viewBox=\"0 0 24 24\"><path d=\"M4.5 3.9 8.9 8l-1.4 1.5-2-1.9V16c0 1.1.9 2 2 2H13v2H7.5c-2.2 0-4-1.8-4-4V7.6l-2 1.9L.1 8l4.4-4.1zM16.5 6H11V4h5.5c2.2 0 4 1.8 4 4v8.4l2-1.9 1.4 1.5-4.4 4.1-4.4-4.1 1.4-1.5 2 1.9V8c0-1.1-.9-2-2-2z\"/></svg>',\n like: '<svg viewBox=\"0 0 24 24\"><path d=\"M16.7 5.5c-1.1-.1-2.6.4-3.9 2.3l-.8 1.2-.8-1.2C9.9 5.9 8.4 5.4 7.3 5.5c-1.2.1-2.2.8-2.8 1.9-1.1 2.2-.6 5.4 3.1 8.9 1.2 1.1 2.7 2.3 4.4 3.5 1.7-1.2 3.2-2.4 4.4-3.5 3.7-3.5 4.2-6.7 3.1-8.9-.6-1.1-1.6-1.8-2.8-1.9zM12 21.4c-1.9-1.3-3.7-2.7-5.1-4-4-3.8-5.1-7.6-3.6-10.8.9-1.8 2.6-2.9 4.5-3.1 1.6-.1 3.1.5 4.2 1.7 1.1-1.2 2.6-1.8 4.2-1.7 1.9.2 3.6 1.3 4.5 3.1 1.5 3.2.4 7-3.6 10.8-1.4 1.3-3.2 2.7-5.1 4z\"/></svg>',\n views:\n '<svg viewBox=\"0 0 24 24\"><path d=\"M8.8 20H6.8V4h2v16zm5-14h-2v14h2V6zm5 4h-2v10h2V10zm-15 4h-2v6h2v-6z\"/></svg>',\n share:\n '<svg viewBox=\"0 0 24 24\"><path d=\"M12 2.6 17.4 8 16 9.4l-3-3V16h-2V6.4l-3 3L6.6 8 12 2.6zM21 15l-.1 3.5c0 1.4-1.1 2.5-2.5 2.5H5.5C4.1 21 3 19.8 3 18.5V15h2v3.5c0 .3.2.5.5.5h12.9c.3 0 .5-.2.5-.5L19 15h2z\"/></svg>',\n ticks:\n '<svg class=\"ticks\" viewBox=\"0 0 18 11\"><path fill=\"#53bdeb\" d=\"M12.1.6 5.3 7.4 2.4 4.5 1.3 5.6l4 4 7.9-7.9zM16.6.6 9.8 7.4l-.9-.9-1.1 1.1 2 2 7.9-7.9z\"/></svg>',\n back: '<svg class=\"back\" viewBox=\"0 0 12 20\"><path d=\"M10 2 2 10l8 8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n video:\n '<svg viewBox=\"0 0 26 18\"><rect x=\"1\" y=\"2\" width=\"16\" height=\"14\" rx=\"3.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"m18 7 6-4v12l-6-4z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/></svg>',\n phone:\n '<svg viewBox=\"0 0 22 22\"><path d=\"M6.6 2.5 8.9 6c.4.6.3 1.3-.2 1.8L7.3 9.1c1.1 2.4 3.1 4.4 5.6 5.6l1.3-1.4c.5-.5 1.2-.6 1.8-.2l3.5 2.3c.6.4.8 1.2.5 1.8-.8 1.7-2.5 2.6-4.3 2.3C9.8 18.6 3.4 12.2 2.5 6.3c-.3-1.8.6-3.5 2.3-4.3.6-.3 1.4-.1 1.8.5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"/></svg>',\n star: '<svg viewBox=\"0 0 24 24\"><path fill=\"#fff\" d=\"m12 3.6 2.5 5.9 6.3.5-4.8 4.1 1.5 6.2L12 17l-5.5 3.3L8 14.1 3.2 10l6.3-.5z\"/></svg>',\n check:\n '<svg viewBox=\"0 0 24 24\"><path d=\"m6 12.5 4 4 8-9\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n\n home: '<svg viewBox=\"0 0 24 24\"><path d=\"M3 10.5 12 3l9 7.5V21h-6v-6H9v6H3z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n search:\n '<svg viewBox=\"0 0 24 24\"><path d=\"M10.5 3a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15zM16 16l5 5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n bell: '<svg viewBox=\"0 0 24 24\"><path d=\"M6 17V11a6 6 0 0 1 12 0v6l1.5 2h-15zM10 21h4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n mail: '<svg viewBox=\"0 0 24 24\"><path d=\"M3 6h18v12H3zM3 6l9 7 9-7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n tick: '<svg viewBox=\"0 0 24 24\"><path d=\"m5 12.5 4.5 4.5L19 7.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n checklist:\n '<svg viewBox=\"0 0 24 24\"><path d=\"M4 6h2M4 12h2M4 18h2M9 6h11M9 12h11M9 18h11\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n camera:\n '<svg viewBox=\"0 0 24 24\"><path d=\"M3 8h4l2-3h6l2 3h4v11H3zM12 10a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n pen: '<svg viewBox=\"0 0 24 24\"><path d=\"M4 20l4-1L19 8l-3-3L5 16zM14 7l3 3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n compose:\n '<svg viewBox=\"0 0 24 24\"><path d=\"M4 4h9M4 4v16h16v-9M20 4l-9 9-2 .5.5-2z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>',\n};\n\n/** A screen in three parts: the app's bars at the top, what it shows, and its bars at the bottom. */\ntype ScreenParts = {\n /** The classes the app's own styles hang on (\"surface x dark\", \"screen whatsapp\"). */\n cls: string;\n top: string;\n body: string;\n bottom: string;\n /** A chat's messages sit on its input bar; a feed, a note, a channel start under the header. */\n align: \"top\" | \"bottom\";\n};\n\nconst STATUS_BAR =\n '<div class=\"status-bar\"><span>9:41</span><span class=\"bars\"><i></i><i></i><i></i><i></i></span></div>';\n\nfunction xPosts(\n surface: Extract<NativeSurface, { surface: \"x_post\" }>,\n assets: NativeAssets,\n t: InterfaceWords,\n): string {\n return surface.posts\n .map((post, i) => {\n const last = i === surface.posts.length - 1;\n const name = `<span class=\"name\">${esc(post.author.name)}</span>${post.author.verified ? ICON.verifiedX : \"\"}`;\n const meta = [post.author.handle, post.time].filter(Boolean).map((s) => esc(s as string));\n const photo = post.photo && assets.photos[post.photo];\n const ratio = surface.photos.find((p) => p.id === post.photo)?.ratio ?? \"4:3\";\n const stats = post.stats ?? {};\n const action = (icon: string, n?: string) => `<span class=\"act\">${icon}<span>${n ? esc(n) : \"\"}</span></span>`;\n return `<article class=\"post${last ? \"\" : \" threaded\"}\">\n <div class=\"rail\">${avatarHtml(post.author, assets, \"av\")}${last ? \"\" : '<div class=\"thread-line\"></div>'}</div>\n <div class=\"body\">\n <div class=\"head\">${name}<span class=\"meta\">${meta.join(\" · \")}</span><span class=\"more\">···</span></div>\n ${post.reply_to ? `<div class=\"replying\">${esc(t.replying)} <span class=\"link\">${esc(post.reply_to)}</span></div>` : \"\"}\n <div class=\"text\">${linked(post.text)}</div>\n ${photo ? `<div class=\"media\" style=\"aspect-ratio:${ratio.replace(\":\", \"/\")}\"><img src=\"${photo}\" alt=\"\"></div>` : \"\"}\n <div class=\"actions\">${action(ICON.reply, stats.replies)}${action(ICON.repost, stats.reposts)}${action(ICON.like, stats.likes)}${action(ICON.views, stats.views)}${action(ICON.share)}</div>\n </div>\n</article>`;\n })\n .join(\"\");\n}\n\nfunction xParts(\n surface: Extract<NativeSurface, { surface: \"x_post\" }>,\n assets: NativeAssets,\n t: InterfaceWords,\n): ScreenParts {\n const tabs = [ICON.home, ICON.search, ICON.bell, ICON.mail].map((icon) => `<span>${icon}</span>`).join(\"\");\n return {\n cls: `surface x ${surface.theme}`,\n top: `${STATUS_BAR}<div class=\"x-head\">${ICON.back}<span>${esc(t.post)}</span></div>`,\n body: xPosts(surface, assets, t),\n bottom: `<div class=\"x-reply\"><span class=\"x-reply-av\"></span><span>${esc(t.replyPrompt)}</span></div><div class=\"tabbar\">${tabs}</div><div class=\"home-bar\"></div>`,\n align: \"top\",\n };\n}\n\ntype ChatMessage = Extract<NativeSurface, { surface: \"whatsapp\" | \"imessage\" }>[\"messages\"][number];\n\n/** One message bubble: a card (its photo, title and price), the text with its time, the card's button. */\nfunction bubbleHtml(m: ChatMessage, assets: NativeAssets, wa: boolean): string {\n const photo = m.card?.photo ? assets.photos[m.card.photo] : undefined;\n const sub = m.card?.subtitle ? `<div class=\"card-sub\">${esc(m.card.subtitle)}</div>` : \"\";\n const card = m.card\n ? `<div class=\"card\">${photo ? `<img src=\"${photo}\" alt=\"\">` : \"\"}<div class=\"card-title\">${esc(m.card.title)}</div>${sub}</div>`\n : \"\";\n const ticks = wa && m.from === \"me\" ? ICON.ticks : \"\";\n const time = m.time ? `<span class=\"time\">${esc(m.time)}${ticks}</span>` : \"\";\n const text = m.text ? `<div class=\"msg-text\">${linked(m.text)}${time}</div>` : time;\n const button = m.card?.button ? `<div class=\"card-button\">${esc(m.card.button)}</div>` : \"\";\n const copy = [m.text, m.card?.title, m.card?.subtitle, m.card?.button].filter((t): t is string => Boolean(t?.trim()));\n return `<div class=\"bubble ${m.from}\" data-copy=\"${esc(JSON.stringify(copy))}\">${card}${text}${button}</div>`;\n}\n\n/** The chat's header: who it is with, as WhatsApp or iMessage shows them. */\nfunction chatHeader(\n contact: NativeAuthor,\n assets: NativeAssets,\n t: InterfaceWords,\n wa: boolean,\n verified: boolean,\n): string {\n if (!wa) {\n return `<div class=\"im-head\">${ICON.back}<div class=\"who\">${avatarHtml(contact, assets, \"av\")}<div class=\"name\">${esc(contact.name)}</div></div></div>`;\n }\n const status = contact.subtitle ?? (verified ? t.business : t.online);\n const badge = verified ? ICON.verifiedWa : \"\";\n return `<div class=\"wa-head\">${ICON.back}${avatarHtml(contact, assets, \"av\")}<div class=\"who\"><div class=\"name\">${esc(contact.name)}${badge}</div><div class=\"status\">${esc(status)}</div></div><div class=\"icons\">${ICON.video}${ICON.phone}</div></div>`;\n}\n\nfunction chatParts(\n surface: Extract<NativeSurface, { surface: \"whatsapp\" | \"imessage\" }>,\n assets: NativeAssets,\n t: InterfaceWords,\n): ScreenParts {\n const wa = surface.surface === \"whatsapp\";\n const bubbles = surface.messages.map((m) => bubbleHtml(m, assets, wa)).join(\"\");\n const input = wa\n ? '<div class=\"wa-input\"><span class=\"plus\">+</span><span class=\"field\"></span><span class=\"mic\"></span></div>'\n : '<div class=\"im-input\"><span class=\"plus\">+</span><span class=\"field\"></span></div>';\n return {\n cls: `screen ${surface.surface}`,\n top: `${STATUS_BAR}${chatHeader(surface.contact, assets, t, wa, surface.contact.verified === true)}`,\n body: `<div class=\"messages\"><div class=\"day\">${esc(surface.day ?? t.today)}</div>${bubbles}</div>`,\n bottom: input,\n align: \"bottom\",\n };\n}\n\nfunction chatHtml(\n surface: Extract<NativeSurface, { surface: \"whatsapp\" | \"imessage\" }>,\n assets: NativeAssets,\n t: InterfaceWords,\n): string {\n const parts = chatParts(surface, assets, t);\n const screen = `<div class=\"${parts.cls}\">${parts.top}${parts.body}${parts.bottom}</div>`;\n return `<div class=\"surface chat${surface.device ? \" device\" : \"\"}\">${screen}</div>`;\n}\n\nfunction starsHtml(kind: \"trustpilot\" | \"google_reviews\", stars: number, size: \"s\" | \"l\" = \"s\"): string {\n if (kind === \"google_reviews\") {\n return `<span class=\"g-stars ${size}\">${\"★\".repeat(stars)}<span class=\"off\">${\"★\".repeat(5 - stars)}</span></span>`;\n }\n const cells = Array.from(\n { length: 5 },\n (_, i) => `<span class=\"tp-star${i < stars ? \"\" : \" off\"}\">${ICON.star}</span>`,\n );\n return `<span class=\"tp-stars ${size}\">${cells.join(\"\")}</span>`;\n}\n\ntype Review = Extract<NativeSurface, { surface: \"trustpilot\" | \"google_reviews\" }>[\"reviews\"][number];\n\nfunction reviewCard(\n r: Review,\n kind: \"trustpilot\" | \"google_reviews\",\n assets: NativeAssets,\n t: InterfaceWords,\n cls: string,\n style: string,\n): string {\n const sub = r.author.subtitle ? `<div class=\"r-sub\">${esc(r.author.subtitle)}</div>` : \"\";\n const verified = kind === \"trustpilot\" ? `<span class=\"r-verified\">${ICON.tick} ${esc(t.verified)}</span>` : \"\";\n return `<div class=\"${cls}\" style=\"${style}\"><div class=\"r-head\">${avatarHtml(r.author, assets, \"av\")}<div><div class=\"r-name\">${esc(r.author.name)}</div>${sub}</div></div><div class=\"r-stars\">${starsHtml(kind, r.stars)}${verified}${r.date ? `<span class=\"r-date\">${esc(r.date)}</span>` : \"\"}</div>${r.title ? `<div class=\"r-title\">${esc(r.title)}</div>` : \"\"}<div class=\"r-text\">${esc(shownReview(r.text))}</div></div>`;\n}\n\nfunction platformMark(kind: \"trustpilot\" | \"google_reviews\"): string {\n return kind === \"trustpilot\"\n ? `<span class=\"tp-mark\"><span class=\"tp-glyph\">${ICON.star}</span>Trustpilot</span>`\n : `<span class=\"g-mark\"><b style=\"color:#4285f4\">G</b><b style=\"color:#ea4335\">o</b><b style=\"color:#fbbc05\">o</b><b style=\"color:#4285f4\">g</b><b style=\"color:#34a853\">l</b><b style=\"color:#ea4335\">e</b></span>`;\n}\n\n/** The three reviews read as copy, the brand's badge between them, the platform under them. */\nfunction reviewsHtml(\n surface: Extract<NativeSurface, { surface: \"trustpilot\" | \"google_reviews\" }>,\n assets: NativeAssets,\n t: InterfaceWords,\n brandName: string | undefined,\n): string {\n const kind = surface.surface;\n const platform = platformMark(kind);\n const summary = surface.summary\n ? `<div class=\"summary\">${assets.logo ? `<img class=\"sum-logo${inked(assets, assets.logo, false)}\" src=\"${assets.logo}\" alt=\"\">` : brandName ? `<div class=\"sum-name\">${esc(brandName)}</div>` : \"\"}<div class=\"sum-row\"><span class=\"sum-label\">${esc(surface.summary.label ?? t.excellent)}</span>${starsHtml(kind, 5, \"l\")}</div><div class=\"sum-count\">${esc(surface.summary.score)} · ${esc(surface.summary.count)} ${esc(t.reviewsWord)} ${platform}</div></div>`\n : \"\";\n // Scattered, as the reference walls are: each card turned and pushed off the column.\n const tilt = [-2.5, 2.2, -1.8, 2.8, -2.4, 1.6];\n const nudge = [-22, 22, -16, 12, -16, 10];\n const cards = surface.reviews\n .slice(0, FEATURED_REVIEWS)\n .map((r, i) =>\n reviewCard(\n r,\n kind,\n assets,\n t,\n \"review\",\n `transform:translateX(${nudge[i % nudge.length]}px) rotate(${tilt[i % tilt.length]}deg)`,\n ),\n );\n const footer = surface.summary ? \"\" : `<div class=\"platform-foot\">${platform}</div>`;\n // The brand's logo as the pile's anchor, in the gap between two cards so it covers no review.\n const anchor =\n surface.frame.logo && surface.frame.logo_position === \"over\" && assets.logo\n ? `<div class=\"wall-badge\"><img class=\"${inked(assets, assets.logo, false).trim()}\" src=\"${assets.logo}\" alt=\"\"></div>`\n : \"\";\n const at = Math.ceil(cards.length / 2);\n const pile = anchor ? [...cards.slice(0, at), anchor, ...cards.slice(at)].join(\"\") : cards.join(\"\");\n return `<div class=\"surface reviews ${kind}\">${summary}<div class=\"wall\">${pile}</div>${footer}</div>`;\n}\n\n/**\n * Every review after the featured ones, as the wall under them: cards as large and as sharp as those,\n * turned every way, across the whole frame and cut by its edges, as the walls that win are. Placed by\n * the page's script.\n */\nfunction reviewPile(\n surface: Extract<NativeSurface, { surface: \"trustpilot\" | \"google_reviews\" }>,\n assets: NativeAssets,\n t: InterfaceWords,\n): string {\n return surface.reviews\n .slice(FEATURED_REVIEWS)\n .map((r) => reviewCard(r, surface.surface, assets, t, \"review back\", \"\"))\n .join(\"\");\n}\n\nfunction notesParts(surface: Extract<NativeSurface, { surface: \"notes\" }>, t: InterfaceWords): ScreenParts {\n const items = surface.items\n .map(\n (i) =>\n `<div class=\"item${i.checked ? \" checked\" : \"\"}\"><span class=\"circle\">${i.checked ? ICON.check : \"\"}</span><span>${esc(i.text)}</span></div>`,\n )\n .join(\"\");\n const tools = [ICON.checklist, ICON.camera, ICON.pen, ICON.compose].map((icon) => `<span>${icon}</span>`).join(\"\");\n return {\n cls: \"surface notes\",\n top: `${STATUS_BAR}<div class=\"n-head\"><span class=\"n-back\">${ICON.back}${esc(t.notes)}</span><span class=\"n-icons\"><i></i><i></i></span></div>`,\n body: `<h1>${esc(surface.title)}</h1>${items}${surface.body ? `<p class=\"n-body\">${esc(surface.body)}</p>` : \"\"}`,\n bottom: `<div class=\"n-tools\">${tools}</div><div class=\"home-bar\"></div>`,\n align: \"top\",\n };\n}\n\nfunction notesHtml(surface: Extract<NativeSurface, { surface: \"notes\" }>, t: InterfaceWords): string {\n const parts = notesParts(surface, t);\n return `<div class=\"${parts.cls}\">${parts.top.replace(STATUS_BAR, \"\")}${parts.body}</div>`;\n}\n\nfunction slackParts(\n surface: Extract<NativeSurface, { surface: \"slack\" }>,\n assets: NativeAssets,\n t: InterfaceWords,\n): ScreenParts {\n const channel = surface.channel.replace(/^#/, \"\");\n const messages = surface.messages\n .map((m) => {\n const reactions = m.reactions.map((r) => `<span class=\"reaction\">${esc(r.emoji)} ${r.count}</span>`).join(\"\");\n return `<div class=\"s-msg\">${avatarHtml(m.author, assets, \"av\")}<div class=\"s-body\"><div class=\"s-head\"><span class=\"name\">${esc(m.author.name)}</span>${m.time ? `<span class=\"s-time\">${esc(m.time)}</span>` : \"\"}</div><div class=\"s-text\">${linked(m.text)}</div>${reactions ? `<div class=\"reactions\">${reactions}</div>` : \"\"}${m.replies ? `<div class=\"s-replies\">${esc(m.replies)}</div>` : \"\"}</div></div>`;\n })\n .join(\"\");\n return {\n cls: \"surface slack\",\n top: `${STATUS_BAR}<div class=\"s-channel\"># ${esc(channel)}</div>`,\n body: messages,\n bottom: `<div class=\"s-compose\"><span>${esc(t.messagePrompt)} #${esc(channel)}</span></div><div class=\"home-bar\"></div>`,\n align: \"top\",\n };\n}\n\nfunction slackHtml(\n surface: Extract<NativeSurface, { surface: \"slack\" }>,\n assets: NativeAssets,\n t: InterfaceWords,\n): string {\n const parts = slackParts(surface, assets, t);\n return `<div class=\"${parts.cls}\">${parts.top.replace(STATUS_BAR, \"\")}${parts.body}</div>`;\n}\n\n/** The colour behind the screen: the platform's own for a screenshot, the brand's ground around a phone or a wall. */\nexport function backdrop(surface: NativeSurface, brand: NativeFrameOpts[\"brand\"]): string {\n if (surface.frame.background) return surface.frame.background;\n switch (surface.surface) {\n case \"x_post\":\n return surface.theme === \"dark\" ? \"#000000\" : \"#ffffff\";\n case \"notes\":\n case \"slack\":\n return \"#ffffff\";\n case \"trustpilot\":\n case \"google_reviews\":\n return brand.ground ?? \"#f4f3ee\";\n default:\n return brand.ground ?? \"#1f2a44\";\n }\n}\n\n/** Whether a colour is dark enough to need light type on it. */\nfunction isDark(hex: string): boolean {\n const n = Number.parseInt(hex.slice(1), 16);\n const [r, g, b] = [(n >> 16) & 255, (n >> 8) & 255, n & 255];\n return 0.2126 * r + 0.7152 * g + 0.0722 * b < 140;\n}\n\nconst STYLE = `\n*{box-sizing:border-box;margin:0;padding:0}\nhtml,body{width:100%;height:100%;overflow:hidden}\nbody{font-family:Inter,\"Noto Sans\",\"Liberation Sans\",Arial,sans-serif,\"Noto Color Emoji\";-webkit-font-smoothing:antialiased}\n#box{position:absolute;display:flex;align-items:center;justify-content:center}\n#stack{display:flex;flex-direction:column;align-items:center;gap:18px;transform-origin:center center;width:390px}\n.headline{font-family:BrandFont,Inter,sans-serif;font-weight:800;font-size:30px;line-height:1.08;letter-spacing:-.02em;text-align:center;width:100%}\n.caption{font-family:Inter,sans-serif;font-weight:600;font-size:17px;line-height:1.3;text-align:center;width:100%}\n.frame-logo{height:30px;max-width:180px;object-fit:contain}\n.inked{filter:brightness(0)}\n.over{position:relative}\n.logo-badge{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) rotate(-4deg);background:#fff;border-radius:18px;padding:16px 26px;box-shadow:0 14px 40px rgba(0,0,0,.35);z-index:5}\n.logo-badge img{height:54px;max-width:240px;object-fit:contain}\nimg{display:block}\n.av{width:40px;height:40px;border-radius:50%;overflow:hidden;flex:none;background:#ddd}\n.av img{width:100%;height:100%;object-fit:cover}\n.av.logo-av{background:#fff;border:1px solid rgba(0,0,0,.08);display:flex;align-items:center;justify-content:center}\n.av.logo-av img{width:78%;height:78%;object-fit:contain}\n.av.initials{display:flex;align-items:center;justify-content:center;font-weight:600;font-size:15px;color:#2b2b2b}\n.badge{width:18px;height:18px;flex:none;margin-left:2px}\n.link{color:#1d9bf0}\n/* X */\n.surface.x{width:390px;background:#fff;color:#0f1419;padding:4px 0}\n.x.dark{background:#000;color:#e7e9ea}\n.post{display:flex;gap:10px;padding:12px 16px 4px}\n.post .rail{display:flex;flex-direction:column;align-items:center}\n.thread-line{width:2px;flex:1;background:#cfd9de;margin-top:4px}\n.x.dark .thread-line{background:#333639}\n.post .body{flex:1;min-width:0}\n.post .head{display:flex;align-items:center;gap:3px;font-size:15px;line-height:20px;white-space:nowrap}\n.post .name{font-weight:700;flex:none}\n.post .meta{color:#536471;margin-left:3px;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1 1 auto}\n.post .replying{color:#536471;font-size:15px;line-height:20px}.x.dark .replying{color:#71767b}\n.x.dark .meta,.x.dark .actions{color:#71767b}\n.post .more{margin-left:auto;color:#536471;letter-spacing:1px}\n.post .text{font-size:15px;line-height:20px;white-space:pre-wrap;overflow-wrap:break-word;margin-top:2px}\n.post .media{margin-top:12px;border-radius:16px;overflow:hidden;border:1px solid #cfd9de}\n.x.dark .media{border-color:#2f3336}\n.post .media img{width:100%;height:100%;object-fit:cover}\n.actions{display:flex;justify-content:space-between;color:#536471;font-size:13px;margin:10px 0 8px;max-width:340px}\n.act{display:flex;align-items:center;gap:4px}\n.act svg{width:18px;height:18px;fill:currentColor}\n/* Chats */\n.surface.chat{width:390px}\n.chat.device{padding:11px;border-radius:52px;background:#111;box-shadow:0 18px 50px rgba(0,0,0,.35)}\n.screen{border-radius:42px;overflow:hidden;display:flex;flex-direction:column;background:#efeae2}\n.chat:not(.device) .screen{border-radius:18px}\n.status-bar{display:flex;justify-content:space-between;align-items:center;padding:12px 28px 6px;font-weight:600;font-size:15px}\n.bars{display:flex;gap:2px;align-items:flex-end}.bars i{display:block;width:3px;background:currentColor;border-radius:1px}\n.bars i:nth-child(1){height:4px}.bars i:nth-child(2){height:6px}.bars i:nth-child(3){height:8px}.bars i:nth-child(4){height:10px}\n.whatsapp .status-bar,.whatsapp .wa-head{background:#f6f5f3;color:#111b21}\n.wa-head{display:flex;align-items:center;gap:8px;padding:6px 12px 10px;border-bottom:1px solid #e0ddd8}\n.wa-head .back{width:11px;height:19px;color:#007aff;margin-right:2px}\n.wa-head .av{width:36px;height:36px}\n.wa-head .who{flex:1;min-width:0}\n.wa-head .name{display:flex;align-items:center;gap:3px;font-weight:600;font-size:16px}\n.wa-head .status{font-size:12.5px;color:#667781}\n.wa-head .icons{display:flex;gap:20px;color:#007aff}.wa-head .icons svg{width:24px;height:20px}\n.whatsapp .messages{background-color:#efeae2;background-image:radial-gradient(rgba(0,0,0,.035) 1.2px,transparent 1.3px),radial-gradient(rgba(0,0,0,.025) 1px,transparent 1.1px);background-size:22px 22px,13px 13px;background-position:0 0,7px 9px}\n.messages{display:flex;flex-direction:column;gap:6px;padding:10px 12px 14px}\n.day{align-self:center;background:#fff;color:#54656f;font-size:12.5px;padding:4px 12px;border-radius:8px;margin:2px 0 6px;box-shadow:0 1px .5px rgba(11,20,26,.13)}\n.bubble{max-width:80%;border-radius:10px;padding:6px 8px 6px 9px;font-size:16px;line-height:21px;color:#111b21;box-shadow:0 1px .5px rgba(11,20,26,.13);overflow:hidden}\n.bubble.them{align-self:flex-start;background:#fff;border-top-left-radius:2px}\n.bubble.me{align-self:flex-end;background:#d9fdd3;border-top-right-radius:2px}\n.msg-text{white-space:pre-wrap;overflow-wrap:break-word}\n.time{float:right;font-size:11.5px;color:#667781;margin:8px 0 -4px 10px;display:inline-flex;align-items:center;gap:3px}\n.ticks{width:17px;height:11px}\n.card{margin:-3px -5px 6px -6px;border-radius:7px;overflow:hidden;background:rgba(0,0,0,.035)}\n.card img{width:100%;aspect-ratio:16/10;object-fit:cover;background:#fff}\n.card-title{font-weight:600;padding:7px 9px 0}\n.card-sub{color:#111b21;font-weight:600;font-size:16px;padding:2px 9px 8px}\n.card-button{margin:6px -8px -6px -9px;border-top:1px solid rgba(0,0,0,.08);text-align:center;color:#027eb5;font-weight:500;padding:10px 0 9px;font-size:15.5px}\n.wa-input{display:flex;align-items:center;gap:10px;background:#f6f5f3;padding:8px 12px 26px;color:#007aff;font-size:28px;font-weight:300}\n.wa-input .field,.im-input .field{flex:1;height:34px;border-radius:17px;background:#fff;border:1px solid #e0ddd8}\n.wa-input .mic{width:16px;height:24px;border:2.5px solid #007aff;border-radius:9px}\n.imessage .screen,.screen.imessage{background:#fff}\n.imessage .status-bar{color:#000}\n.im-head{display:flex;align-items:flex-start;padding:2px 14px 10px;background:#f7f7f7;border-bottom:1px solid #e5e5ea;color:#007aff}\n.im-head .back{width:11px;height:19px;margin-top:14px}\n.im-head .who{flex:1;display:flex;flex-direction:column;align-items:center;gap:3px;margin-right:11px}\n.im-head .av{width:50px;height:50px}\n.im-head .name{color:#000;font-size:12px}\n.screen.imessage .messages{background:#fff}\n.screen.imessage .day{background:none;box-shadow:none;color:#8e8e93;font-size:12px}\n.screen.imessage .bubble{box-shadow:none;border-radius:19px;padding:8px 13px}\n.screen.imessage .bubble.them{background:#e9e9eb;color:#000}\n.screen.imessage .bubble.me{background:#0b84fe;color:#fff}\n.screen.imessage .time{display:none}\n.screen.imessage .card-button{color:inherit}\n.im-input{display:flex;align-items:center;gap:10px;padding:8px 12px 26px;color:#8e8e93;font-size:26px}\n/* Reviews */\n.surface.reviews{width:100%;display:flex;flex-direction:column;gap:14px}\n.summary{background:#fff;border-radius:14px;padding:14px 16px;display:flex;flex-direction:column;align-items:center;gap:6px;box-shadow:0 6px 18px rgba(0,0,0,.12)}\n.sum-logo{height:34px;max-width:200px;object-fit:contain}\n.sum-name{font-weight:800;font-size:22px}\n.sum-row{display:flex;align-items:center;gap:10px}\n.sum-label{font-weight:700;font-size:20px;color:#191919}\n.sum-count{font-size:13px;color:#555;display:flex;align-items:center;gap:6px}\n.wall{display:flex;flex-direction:column;gap:0}.wall .review+.review{margin-top:-4px}\n.wall-badge{align-self:center;position:relative;z-index:5;margin:2px 0;background:#fff;border-radius:22px;padding:16px 30px;box-shadow:0 16px 44px rgba(0,0,0,.38);transform:rotate(-3deg)}\n.wall-badge img{height:64px;max-width:280px;object-fit:contain}\n.wide #stack{width:620px}.wide .surface.reviews{width:620px}.wide .wall{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px;align-items:start}.wide .wall .review+.review{margin-top:0}.wide .wall-badge{grid-column:1/-1;justify-self:center;margin:-22px 0}\n.review{position:relative;background:#fff;border-radius:10px;padding:14px 16px 16px;box-shadow:0 6px 18px rgba(0,0,0,.14);color:#191919}\n.r-head{display:flex;align-items:center;gap:10px;margin-bottom:10px}\n.r-name{font-weight:600;font-size:15px}\n.r-sub{font-size:12.5px;color:#6c6c85}\n.r-stars{display:flex;align-items:center;gap:10px;margin-bottom:8px}\n.r-verified{font-size:12px;color:#6c6c85}\n.r-date{margin-left:auto;font-size:12px;color:#6c6c85}\n.r-title{font-weight:700;font-size:16px;margin-bottom:4px}\n.r-text{font-size:14.5px;line-height:1.42}\n.tp-stars{display:inline-flex;gap:2px}\n.tp-star{width:20px;height:20px;background:#00b67a;display:inline-flex;align-items:center;justify-content:center}\n.tp-stars.l .tp-star{width:28px;height:28px}\n.tp-star svg{width:82%;height:82%}\n.tp-star.off{background:#dcdce6}\n.tp-mark{font-weight:700;color:#191919;display:inline-flex;align-items:center;gap:2px}\n.g-stars{color:#fbbc04;font-size:17px;letter-spacing:1px}.g-stars.l{font-size:26px}.g-stars .off{color:#dadce0}\n.g-mark{font-weight:700;font-size:15px;letter-spacing:-.5px}\n.platform-foot{align-self:center;background:#fff;border-radius:999px;padding:6px 14px;font-size:15px}\n/* Notes */\n.surface.notes{width:390px;background:#fff;color:#000;padding:8px 20px 22px}\n.n-head{display:flex;justify-content:space-between;align-items:center;color:#e0a100;font-size:17px;padding:6px 0 14px}\n.n-back{display:flex;align-items:center;gap:6px}.n-back svg{width:11px;height:19px}\n.n-icons{display:flex;gap:16px}.n-icons i{display:block;width:24px;height:24px;border:2px solid #e0a100;border-radius:50%}\n.notes h1{font-size:28px;line-height:1.15;font-weight:700;margin-bottom:14px}\n.item{display:flex;gap:12px;align-items:flex-start;font-size:17px;line-height:1.35;margin-bottom:12px}\n.circle{width:24px;height:24px;border-radius:50%;border:1.6px solid #c7c7cc;flex:none;display:flex;align-items:center;justify-content:center;margin-top:-1px}\n.item.checked .circle{background:#e0a100;border-color:#e0a100}\n.circle svg{width:16px;height:16px}\n.n-body{font-size:17px;line-height:1.4;margin-top:6px}\n/* Slack */\n.surface.slack{width:390px;background:#fff;color:#1d1c1d;padding-bottom:10px}\n.s-channel{font-weight:800;font-size:17px;padding:12px 16px;border-bottom:1px solid #e8e8e8}\n.s-msg{display:flex;gap:10px;padding:10px 16px 4px}\n.slack .av{border-radius:8px;width:38px;height:38px}\n.s-body{flex:1;min-width:0}\n.s-head{display:flex;align-items:baseline;gap:8px}\n.s-head .name{font-weight:800;font-size:15px}\n.s-time{font-size:12px;color:#616061}\n.s-text{font-size:15px;line-height:1.46;white-space:pre-wrap}\n.slack .link{color:#1264a3;background:rgba(29,155,209,.1);border-radius:3px;padding:0 2px}\n.reactions{display:flex;gap:6px;margin-top:6px}\n.reaction{border:1px solid #1d9bd1;background:#e8f5fa;border-radius:12px;padding:1px 8px;font-size:13px;color:#1264a3}\n.s-replies{color:#1264a3;font-weight:700;font-size:13px;margin-top:6px}\n/* A 9:16: the app full screen */\n.fs-app{position:absolute;inset:0;overflow:hidden}\n.fs-app.surface{width:auto;padding:0}\n.fs-app.screen{border-radius:0;display:block}\n.fs-app.surface.notes,.fs-app.surface.slack{background:#fff}\n#top{position:absolute;left:0;right:0;top:0;z-index:3}\n#bottom{position:absolute;left:0;right:0;bottom:0;z-index:3}\n#top>div,#bottom>div{width:390px}\n#banner{position:absolute;left:0;right:0;z-index:4}\n#banner>div{width:390px}\n.fs-card{margin:0 14px;border-radius:16px;padding:11px 14px;display:flex;flex-direction:column;align-items:center;gap:6px;box-shadow:0 10px 28px rgba(0,0,0,.22)}\n.fs-card .headline{font-size:18px}.fs-card .caption{font-size:11.5px}.fs-card .frame-logo{height:17px}\n.fs #stack{position:absolute;left:0;top:0;transform-origin:top left;display:block;gap:0}\n.fs .surface.notes h1,.fs .item,.fs .n-body{margin-left:20px;margin-right:20px}\n.fs-app.notes #stack{padding-top:6px}\n.fs-app.screen.whatsapp{background-color:#efeae2;background-image:radial-gradient(rgba(0,0,0,.035) 1.2px,transparent 1.3px),radial-gradient(rgba(0,0,0,.025) 1px,transparent 1.1px);background-size:30px 30px,18px 18px;background-position:0 0,9px 12px}\n.fs-app.whatsapp .messages{background:none}\n.fs-app .messages{padding:10px 12px 12px}\n.fs-app .bubble{max-width:min(80%,320px)}.fs-app .bubble:has(.card){max-width:min(66%,240px)}.fs-app .card img{aspect-ratio:3/2}\n.fs .post .media{aspect-ratio:16/9!important}\n.fs .status-bar{padding:14px 30px 8px}\n.x .status-bar{color:inherit}\n.x-head{display:flex;align-items:center;gap:26px;padding:8px 16px 12px;font-weight:700;font-size:19px;border-bottom:1px solid #eff3f4}\n.x.dark .x-head{border-color:#2f3336}\n.x-head .back{width:12px;height:20px}\n.x-reply{display:flex;align-items:center;gap:12px;padding:10px 16px;border-top:1px solid #eff3f4;color:#536471;font-size:16px}\n.x.dark .x-reply{border-color:#2f3336;color:#71767b}\n.x-reply-av{width:30px;height:30px;border-radius:50%;background:#cfd9de}.x.dark .x-reply-av{background:#333639}\n.x.light #top,.x.light #bottom{background:#fff}.x.dark #top,.x.dark #bottom{background:#000}\n.tabbar{display:flex;justify-content:space-around;padding:10px 8px 4px;border-top:1px solid #eff3f4}\n.x.dark .tabbar{border-color:#2f3336}\n.tabbar svg{width:27px;height:27px}\n.home-bar{width:134px;height:5px;border-radius:3px;background:currentColor;opacity:.85;margin:10px auto 8px}\n.screen.whatsapp .wa-input{padding-bottom:8px}\n.screen.imessage .im-input{padding-bottom:8px;background:#fff}\n#bottom .wa-input,#bottom .im-input{border-top:1px solid #e0ddd8}\n.n-tools{display:flex;justify-content:space-between;padding:10px 26px 0;color:#e0a100;background:#fff}.n-tools svg{width:25px;height:25px}\n.fs-app.notes #top,.fs-app.notes #bottom{background:#fff;color:#000}\n.fs-app.notes .n-head{padding:6px 20px 10px}\n.s-compose{margin:8px 12px 0;border:1px solid #c9c9c9;border-radius:10px;padding:12px 14px;color:#868686;font-size:15px;background:#fff}\n.fs-app.slack #top,.fs-app.slack #bottom{background:#fff;color:#1d1c1d}\n/* A wall's pile */\n#backdrop{position:absolute;inset:0;overflow:hidden}\n.review.back{position:absolute;width:390px;box-shadow:0 4px 14px rgba(0,0,0,.12)}\n#backdrop .wash{position:absolute;inset:0;background:var(--ground);opacity:.35}\n.wall-card{width:100%;border-radius:16px;padding:12px 16px;box-shadow:0 12px 32px rgba(0,0,0,.3);position:relative;z-index:6}\n#box{z-index:2}\n.tp-glyph{display:inline-flex;width:18px;height:18px;background:#00b67a;align-items:center;justify-content:center;margin-right:3px}.tp-glyph svg{width:80%;height:80%}\n.r-verified{display:inline-flex;align-items:center;gap:3px}.r-verified svg{width:12px;height:12px}\n`;\n\n/** A CSS length to a tenth of a pixel. */\nconst px = (n: number): number => Math.round(n * 10) / 10;\n\n/** The width a phone lays an app out at, in CSS pixels: a 9:16 draws its bars at the frame's width over it. */\nconst PHONE_WIDTH = 390;\n\n/** How long a page waits for its web fonts before it lays out in the fallback face. */\nconst FONT_WAIT_MS = 10_000;\n\n/** The script that waits for the fonts and pictures, so every page measures what it draws. */\nconst READY = `\n await Promise.all([...document.images].map((i) => (i.complete ? null : i.decode().catch(() => null))));\n // The web fonts are waited on for a while, never for ever: past it the page draws in the fallback face.\n if (document.fonts) await Promise.race([document.fonts.ready, new Promise((r) => setTimeout(r, ${FONT_WAIT_MS}))]);\n // A square mark set where a wordmark goes reads as a speck at a wordmark's height.\n for (const img of document.querySelectorAll(\".frame-logo\")) {\n if (img.naturalWidth > 0 && img.naturalWidth < img.naturalHeight * 1.6) img.style.height = img.offsetHeight * 1.8 + \"px\";\n }\n`;\n\n/** The script that fits the stack in its box once the fonts and pictures are in, then marks the page ready. */\nconst FIT = `\n(async () => {${READY}\n const box = document.getElementById(\"box\");\n const stack = document.getElementById(\"stack\");\n const pile = document.getElementById(\"backdrop\");\n const fit = () => Math.min(box.clientWidth / stack.offsetWidth, box.clientHeight / stack.offsetHeight);\n let scale = fit();\n // A wall in a box squarer than its column is laid out wider, up to a third, so its cards run\n // shorter and read larger.\n if (pile && !document.body.classList.contains(\"wide\")) {\n const base = stack.offsetWidth;\n let best = { width: base, scale };\n for (const grow of [1.1, 1.2, 1.33]) {\n stack.style.width = base * grow + \"px\";\n const s = fit();\n if (s > best.scale) best = { width: base * grow, scale: s };\n }\n stack.style.width = best.width + \"px\";\n scale = fit();\n }\n stack.style.transform = \"scale(\" + scale + \")\";\n if (pile) {\n // The wall under the featured: the other reviews once each, whole and upright, in tidy columns\n // a little smaller than the featured ones, set back under a wash of the ground. Tier 1, Oct\n // 2026: a pile of tilted cards larger than the featured, repeated to fill the frame, read as\n // \"too many testimonials in the background, it doesn't make much sense\".\n const W = innerWidth, H = innerHeight;\n const cards = [...pile.children];\n const cw = Math.min(scale * 0.8, (W * 0.46) / 390);\n const cols = Math.max(2, Math.min(3, Math.round(W / (390 * cw * 1.05))));\n const gap = (W - cols * 390 * cw) / (cols + 1);\n const ys = Array.from({ length: cols }, (_, c) => H * 0.03 - (c % 2) * 60 * cw);\n for (const card of cards) {\n const c = ys.indexOf(Math.min(...ys));\n card.style.zoom = String(cw);\n card.style.left = (gap + c * (390 * cw + gap)) / cw + \"px\";\n card.style.top = ys[c] / cw + \"px\";\n ys[c] += card.offsetHeight * cw + gap * 0.6;\n }\n const wash = document.createElement(\"div\");\n wash.className = \"wash\";\n pile.appendChild(wash);\n }\n document.body.dataset.ready = \"1\";\n})();\n`;\n\n/**\n * The script that lays a 9:16 out as the app full screen: its bars pinned at the phone's scale, the\n * frame's card under the header, and the posts or messages as large as the band between them holds,\n * laid out wider rather than shrunk narrower, so they always run the screen's width.\n */\nconst FIT_FULLSCREEN = `\n(async () => {${READY}\n const cfg = JSON.parse(document.body.dataset.fit);\n const W = innerWidth, H = innerHeight;\n const top = document.getElementById(\"top\"), bottom = document.getElementById(\"bottom\");\n const banner = document.getElementById(\"banner\"), stack = document.getElementById(\"stack\");\n let y0 = Math.max(top.getBoundingClientRect().height, cfg.bandTop);\n const y1 = Math.min(H - bottom.getBoundingClientRect().height, cfg.bandBottom);\n if (banner) {\n banner.style.top = y0 + 8 + \"px\";\n y0 += banner.getBoundingClientRect().height + 16;\n }\n const room = y1 - y0;\n // Laid out wider as it shrinks, so it runs the screen's width, but never past a fifth wider than\n // the phone: a post's photo grows with the width, and the words would only get smaller.\n // A chat runs the screen's whole width at any scale: its bubbles keep to the phone's widths, so\n // a wider column only sets them against the edges, as the app does, never in a narrow strip.\n // Clear of the buttons down the right, where the placement draws them (\\`rail\\`).\n const across = W - cfg.rail;\n const fits = (s) => { stack.style.width = (cfg.scroll ? across / s : Math.min(across / s, cfg.phone * 1.2)) + \"px\"; return stack.offsetHeight * s <= room; };\n // A chat never shrinks past what reads on a phone: its earliest messages scroll up under the\n // header instead, as the app does, and the page says which ones went (the review expects them\n // nowhere on this size).\n const floor = cfg.chrome * (cfg.scroll ? 0.5 : 0.2);\n // A short chat is set a little larger than the phone, so it reads and fills the screen.\n let lo = floor, hi = cfg.chrome * (cfg.scroll ? 1.3 : 1), best = lo;\n if (fits(hi)) best = hi;\n else for (let i = 0; i < 16; i++) { const m = (lo + hi) / 2; if (fits(m)) { best = m; lo = m; } else hi = m; }\n fits(best);\n stack.style.transform = \"scale(\" + best + \")\";\n stack.style.left = (across - stack.offsetWidth * best) / 2 + \"px\";\n const h = stack.offsetHeight * best;\n stack.style.top = (cfg.align === \"bottom\" ? y1 - h : y0) + \"px\";\n const hidden = [];\n if (cfg.scroll && h > room + 1) {\n const veil = document.createElement(\"div\");\n const wall = getComputedStyle(stack.querySelector(\".messages\") ?? stack).backgroundColor;\n veil.style.cssText = \"position:absolute;left:0;right:0;top:0;z-index:2;background:\" + wall + \";height:\" + y0 + \"px\";\n document.body.appendChild(veil);\n for (const bubble of stack.querySelectorAll(\"[data-copy]\")) {\n if (bubble.getBoundingClientRect().top < y0) hidden.push(...JSON.parse(bubble.dataset.copy));\n }\n }\n document.body.dataset.hidden = JSON.stringify(hidden);\n document.body.dataset.ready = \"1\";\n})();\n`;\n\n/** A size tall enough to be a phone's screen (a 9:16): the app is drawn full screen on it. */\nfunction isFullScreen(opts: { width: number; height: number }): boolean {\n return opts.height / opts.width >= 1.7;\n}\n\nconst FULL_SCREEN_APPS: ReadonlySet<NativeSurface[\"surface\"]> = new Set([\n \"x_post\",\n \"whatsapp\",\n \"imessage\",\n \"notes\",\n \"slack\",\n]);\n\n/**\n * The colour the frame's headline and logo sit on at one size: on a 9:16 that shows the app full\n * screen, the card in the frame's or brand's colour; on any other size, the colour behind the screen\n * (`backdrop`). Pure.\n */\nexport function frameGround(\n surface: NativeSurface,\n brand: NativeFrameOpts[\"brand\"],\n size: { width: number; height: number },\n): string {\n if (isFullScreen(size) && FULL_SCREEN_APPS.has(surface.surface)) {\n return surface.frame.background ?? brand.ground ?? \"#ffffff\";\n }\n return backdrop(surface, brand);\n}\n\n/**\n * The page that draws the ad at one size. A feed size: the screen and its frame, scaled as one to the\n * largest that fits the size's safe area, centred in it, on the screen's own colour or the brand's. A\n * 9:16: the app full screen (`FIT_FULLSCREEN`), the way a story shows a phone. A wall of reviews: three\n * in the safe area over every other one piled across the frame. Pure.\n */\nexport function nativeSurfaceHtml(surface: NativeSurface, assets: NativeAssets, opts: NativeFrameOpts): string {\n const w = opts.width / 2;\n const h = opts.height / 2;\n const t = chromeWords(opts.language, opts.words);\n const bg = backdrop(surface, opts.brand);\n const ink = isDark(bg) ? \"#ffffff\" : (opts.brand.ink ?? \"#111111\");\n const font = assets.font ? `@font-face{font-family:BrandFont;src:url(${assets.font});font-display:block}` : \"\";\n const head = `<!doctype html><html><head><meta charset=\"utf-8\">\n<link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Noto+Color+Emoji&display=block\">\n<style>${font}${STYLE}`;\n const parts = isFullScreen(opts) ? appParts(surface, assets, t) : null;\n if (parts) return fullScreenHtml(surface, parts, assets, opts, head);\n const wall = surface.surface === \"trustpilot\" || surface.surface === \"google_reviews\";\n const stack = frameStack(surface, screenHtml(surface, assets, t, opts.brand.name), assets, ink, bg);\n const box = layoutBox(opts.safe, w, h);\n const pile = wall ? `<div id=\"backdrop\" style=\"--ground:${bg}\">${reviewPile(surface, assets, t)}</div>` : \"\";\n // A landscape box holds a wall's featured reviews side by side rather than in a thin strip.\n const wide = wall && Math.min(surface.reviews.length, FEATURED_REVIEWS) >= 2 && box.width / box.height > 1.25;\n return `${head}\nbody{background:${bg};width:${w}px;height:${h}px;position:relative}\n#box{top:${px(box.top)}px;left:${px(box.left)}px;width:${px(box.width)}px;height:${px(box.height)}px}\n</style></head><body${wide ? ' class=\"wide\"' : \"\"}>${pile}<div id=\"box\"><div id=\"stack\">${stack}</div></div><script>${FIT}</script></body></html>`;\n}\n\n/** The app's three parts, for a screen an app draws full screen; null for a wall of reviews, which is no app. */\nfunction appParts(surface: NativeSurface, assets: NativeAssets, t: InterfaceWords): ScreenParts | null {\n switch (surface.surface) {\n case \"x_post\":\n return xParts(surface, assets, t);\n case \"whatsapp\":\n case \"imessage\":\n return chatParts(surface, assets, t);\n case \"notes\":\n return notesParts(surface, t);\n case \"slack\":\n return slackParts(surface, assets, t);\n default:\n return null;\n }\n}\n\n/** A 9:16 as the app full screen, with the frame's headline, caption and logo as a card in the brand's colours. */\nfunction fullScreenHtml(\n surface: NativeSurface,\n parts: ScreenParts,\n assets: NativeAssets,\n opts: NativeFrameOpts,\n head: string,\n): string {\n const w = opts.width / 2;\n const h = opts.height / 2;\n const chrome = Math.round((w / PHONE_WIDTH) * 1000) / 1000;\n const fit = {\n bandTop: px(opts.safe.top * h),\n bandBottom: px((1 - opts.safe.bottom) * h),\n // Buttons down the right (Reels, TikTok, Shorts): an inset wider on the right than the left.\n rail: opts.safe.right > opts.safe.left ? px(opts.safe.right * w) : 0,\n chrome,\n phone: PHONE_WIDTH,\n align: parts.align,\n scroll: surface.surface === \"whatsapp\" || surface.surface === \"imessage\",\n };\n const { frame } = surface;\n const ground = frameGround(surface, opts.brand, opts);\n const ink = isDark(ground) ? \"#ffffff\" : (opts.brand.ink ?? \"#111111\");\n const logo = frame.logo\n ? isDark(ground)\n ? (assets.frameLogo ?? assets.logo)\n : (assets.logo ?? assets.frameLogo)\n : undefined;\n const card = [\n frame.headline ? `<div class=\"headline\" style=\"color:${ink}\">${keepTogether(esc(frame.headline))}</div>` : \"\",\n frame.caption ? `<div class=\"caption\" style=\"color:${ink}\">${keepTogether(esc(frame.caption))}</div>` : \"\",\n logo ? `<img class=\"frame-logo${inked(assets, logo, isDark(ground))}\" src=\"${logo}\" alt=\"\">` : \"\",\n ].join(\"\");\n const banner = card\n ? `<div id=\"banner\"><div style=\"zoom:${chrome}\"><div class=\"fs-card\" style=\"background:${ground}\">${card}</div></div></div>`\n : \"\";\n return `${head}\nbody{width:${w}px;height:${h}px;position:relative}\n</style></head><body class=\"fs\" data-fit='${JSON.stringify(fit)}'><div class=\"fs-app ${parts.cls}\"><div id=\"top\"><div style=\"zoom:${chrome}\">${parts.top}</div></div>${banner}<div id=\"stack\">${parts.body}</div><div id=\"bottom\"><div style=\"zoom:${chrome}\">${parts.bottom}</div></div></div><script>${FIT_FULLSCREEN}</script></body></html>`;\n}\n\n/** The screen itself, in its platform's layout. */\nfunction screenHtml(\n surface: NativeSurface,\n assets: NativeAssets,\n t: InterfaceWords,\n brandName: string | undefined,\n): string {\n switch (surface.surface) {\n case \"x_post\":\n return `<div class=\"surface x ${surface.theme}\">${xPosts(surface, assets, t)}</div>`;\n case \"whatsapp\":\n case \"imessage\":\n return chatHtml(surface, assets, t);\n case \"trustpilot\":\n case \"google_reviews\":\n return reviewsHtml(surface, assets, t, brandName);\n case \"notes\":\n return notesHtml(surface, t);\n case \"slack\":\n return slackHtml(surface, assets, t);\n default:\n return \"\";\n }\n}\n\n/** The screen with what the frame puts around it: the headline above, the caption and the logo under. */\nfunction frameStack(surface: NativeSurface, screen: string, assets: NativeAssets, ink: string, ground: string): string {\n const { frame } = surface;\n const logo = frame.logo ? (assets.frameLogo ?? assets.logo) : undefined;\n // A wall carries its badge in the pile itself (`reviewsHtml`); any other screen under it.\n const wall = surface.surface === \"trustpilot\" || surface.surface === \"google_reviews\";\n const badge =\n logo && frame.logo_position === \"over\" && !wall\n ? `<div class=\"logo-badge\"><img class=\"${inked(assets, assets.logo ?? logo, false).trim()}\" src=\"${assets.logo ?? logo}\" alt=\"\"></div>`\n : \"\";\n const placed = logo && frame.logo_position === \"over\";\n // Over a wall's pile the frame's lines sit on a card of the ground they were set for, or the pile hides them.\n const piled = wall && surface.reviews.length > FEATURED_REVIEWS;\n const line = (cls: string, text: string) => {\n const html = `<div class=\"${cls}\" style=\"color:${ink}\">${keepTogether(esc(text))}</div>`;\n return piled ? `<div class=\"wall-card\" style=\"background:${ground}\">${html}</div>` : html;\n };\n return [\n frame.headline ? line(\"headline\", frame.headline) : \"\",\n badge ? `<div class=\"over\">${screen}${badge}</div>` : screen,\n frame.caption ? line(\"caption\", frame.caption) : \"\",\n logo && !placed ? `<img class=\"frame-logo${inked(assets, logo, isDark(ground))}\" src=\"${logo}\" alt=\"\">` : \"\",\n ].join(\"\");\n}\n\n/** The box the stack is fitted in: the page less the safe area on each side (a margin at least), in CSS pixels. */\nfunction layoutBox(safe: NativeFrameOpts[\"safe\"], w: number, h: number) {\n const margin = 0.035;\n const top = Math.max(safe.top, margin) * h;\n const bottom = Math.max(safe.bottom, margin) * h;\n const left = Math.max(safe.left, margin) * w;\n const right = Math.max(safe.right, margin) * w;\n return { top, left, width: w - left - right, height: h - top - bottom };\n}\n"],"mappings":";;;;;;;;AAOO,IAAM,oBAAoB;AAG1B,SAAS,WAAW,KAAa,UAA0B;AAChE,QAAM,KAAK,IACR,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AACzB,SAAO,SAAS,KAAK,EAAE,IAAI,KAAK,GAAG,QAAQ,IAAI,EAAE,GAAG,QAAQ,QAAQ,EAAE,KAAK;AAC7E;AA8BO,SAAS,oBACd,UACA,QACiC;AACjC,MAAI,WAAW,SAAU,QAAO,oBAAoB,QAAQ;AAC5D,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,SAAS,IAAI,CAAC,OAAO;AAC1B,UAAM,MACJ,WAAW,WAAW,GAAG,MAAM,YAAY,MAAM,SAAS,eAAgB,GAAG,SAAS,GAAG,QAAQ;AACnG,UAAM,OACJ,IACG,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,KAAK;AAChC,QAAI,QAAQ;AACZ,QAAI,IAAI;AACR,WAAO,KAAK,IAAI,KAAK,EAAG,SAAQ,GAAG,IAAI,IAAI,GAAG;AAC9C,SAAK,IAAI,KAAK;AACd,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB,CAAC;AACH;AAEA,IAAM,sBAA8C;AAAA,EAClD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AACT;AAGA,SAAS,oBAA+C,UAAyD;AAC/G,QAAM,SAAS,oBAAI,IAAoB;AACvC,SAAO,SAAS,IAAI,CAAC,OAAO;AAC1B,UAAM,OAAO,GAAG,MAAM,YAAY,KAAK;AACvC,UAAM,SAAS,SAAS,SAAS,SAAU,oBAAoB,IAAI,KAAK;AACxE,UAAM,KAAK,OAAO,IAAI,MAAM,KAAK,KAAK;AACtC,WAAO,IAAI,QAAQ,CAAC;AACpB,UAAM,QAAQ,WAAW,SAAU,MAAM,IAAI,SAAS,QAAQ,CAAC,KAAM,GAAG,MAAM,IAAI,CAAC;AACnF,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB,CAAC;AACH;AAKA,IAAM,kBAAgG;AAAA,EACpG,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SACE;AAAA,MACF,QACE;AAAA,MACF,QACE;AAAA,MACF,UACE;AAAA,IACJ;AAAA,IACA,UACE;AAAA,EACJ;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,SACE;AAAA,MACF,QACE;AAAA,MACF,QACE;AAAA,IACJ;AAAA,IACA,UACE;AAAA,EACJ;AACF;AAGO,SAAS,cAAc,MAAc,QAAgC;AAC1E,QAAM,QAAQ,gBAAgB,MAAM;AACpC,SAAO,MAAM,OAAO,KAAK,YAAY,CAAC,KAAK,MAAM;AACnD;AAYO,SAAS,YAAY,IAAqB,OAAe,QAAgC;AAC9F,QAAM,OAAO,GAAG,cAAc,WAAM,GAAG,WAAW,KAAK;AACvD,QAAM,OAAO,GAAG,aAAa,YAAY,GAAG,UAAU,gBAAgB;AACtE,QAAM,IAAI,GAAG,KAAK,YAAY;AAC9B,SAAO,WAAW,UACd,iBAAiB,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,IAC/C,kBAAkB,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE;AACtD;AAEA,SAAS,iBAAiB,IAAqB,GAAW,OAAe,OAAuB;AAE9F,QAAM,QACJ,MAAM,YAAY,MAAM,aACpB,kGACA;AAGN,QAAM,OAAO,GAAG,UACZ,wBAAwB,GAAG,OAAO,0GAClC;AACJ,MAAI,MAAM,UAAU;AAClB,WAAO,mCAAmC,KAAK,YAAY,KAAK,GAAG,IAAI;AAAA,EACzE;AACA,SAAO,yCAAyC,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,kDAA6C,KAAK,GAAG,IAAI;AACrI;AAEA,SAAS,kBAAkB,IAAqB,GAAW,OAAe,OAAuB;AAM/F,MAAI,MAAM,UAAU;AAClB,WAAO,mCAAmC,KAAK,YAAY,KAAK;AAAA,EAClE;AACA,QAAM,OACJ,MAAM,WACF,uKACA;AACN,SAAO,gCAAgC,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI;AAC1E;;;AC/JO,IAAM,mBAA8C;AAAA,EACzD,EAAE,MAAM,cAAc,QAAQ,kBAAkB,SAAS,qBAAqB,YAAY,KAAK;AAAA,EAC/F,EAAE,MAAM,MAAM,QAAQ,UAAU,SAAS,UAAU,YAAY,KAAK;AAAA,EACpE,EAAE,MAAM,YAAY,QAAQ,gBAAgB,SAAS,iBAAiB,YAAY,KAAK;AAAA,EACvF,EAAE,MAAM,eAAe,QAAQ,mBAAmB,SAAS,sBAAsB,YAAY,KAAK;AAAA,EAClG,EAAE,MAAM,QAAQ,QAAQ,YAAY,SAAS,aAAa,YAAY,KAAK;AAAA,EAC3E,EAAE,MAAM,SAAS,QAAQ,aAAa,SAAS,cAAc,YAAY,KAAK;AAAA;AAAA,EAE9E,EAAE,MAAM,eAAe,QAAQ,mBAAmB,SAAS,oBAAoB,YAAY,MAAM;AAAA,EACjG,EAAE,MAAM,UAAU,QAAQ,cAAc,SAAS,eAAe,YAAY,MAAM;AAAA,EAClF,EAAE,MAAM,iBAAiB,QAAQ,aAAa,SAAS,mBAAmB,YAAY,MAAM;AAC9F;AAOA,IAAM,cAAc;AAGb,SAAS,cAAc,MAAqC;AACjE,SAAO,iBAAiB,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,KAAK;AAC/D;AAOO,SAAS,gBAAgB,MAAqC;AACnE,QAAM,WAAW,cAAc,IAAI;AACnC,SAAO,aAAa,SAAS,cAAc,YAAY,KAAK,IAAI,KAAK,WAAW;AAClF;AAOO,IAAM,iBAAiB;AAE9B,IAAM,oBACJ;AAMK,SAAS,iBAAiB,SAAuD;AACtF,SAAO,CAAC,UACN;AAAA,IACE,MAAM,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,UAAU,EAAE,UAAU,UAAU,kBAAkB,EAAE,EAAE;AAAA,IACxG;AAAA,EACF;AACJ;AAWA,eAAsB,eACpB,OACA,QAAuB,iBAAiB,GACpB;AACpB,QAAM,QAAQ,oBAAI,IAA4B;AAC9C,QAAM,QAA2D,CAAC;AAClE,aAAW,QAAQ,IAAI,IAAI,KAAK,GAAG;AACjC,UAAM,QAAQ,gBAAgB,IAAI;AAClC,UAAM,WAAW,cAAc,IAAI;AACnC,QAAI,MAAO,OAAM,IAAI,MAAM,KAAK;AAAA,aACvB,SAAU,OAAM,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,EAClD;AACA,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,SAAS,MAAM,MAAM,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,EAAE,SAAS,KAAK,EAAE,CAAC,EAAE,MAAM,MAAM,IAAI;AAC5G,QAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,SAAK,SAAS,CAAC,KAAK,MAAM,eAAgB,OAAM,IAAI,EAAE,MAAM,EAAE,QAAQ;AAAA,EACxE,CAAC;AACD,SAAO;AACT;AAGO,SAAS,QAAQ,MAAc,OAA0C;AAC9E,SAAO,QAAS,MAAM,IAAI,IAAI,KAAK,OAAQ,gBAAgB,IAAI;AACjE;AAOO,SAAS,YAAY,QAA0B;AACpD,QAAM,QAAQ,CAAC,QAAQ,OAAO,QAAQ,MAAM,GAAG,GAAG,OAAO,QAAQ,OAAO,GAAG,CAAC;AAC5E,MAAI,0BAA0B,KAAK,MAAM,EAAG,OAAM,KAAK,OAAO,QAAQ,SAAS,EAAE,CAAC;AAClF,MAAI,WAAW,KAAK,MAAM,GAAG;AAC3B,UAAM,UAAU,CAAC,cAAsB,OAAO,QAAQ,oBAAoB,SAAS;AACnF,UAAM,KAAK,QAAQ,GAAG,GAAG,QAAQ,GAAG,GAAG,QAAQ,GAAG,GAAG,QAAQ,MAAG,GAAG,QAAQ,QAAG,CAAC;AAAA,EACjF;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAC3B;;;ACjHA,SAAS,SAAS;AAGX,IAAM,wBAAwB;AAIrC,IAAM,YAAY,CAAC,MAAwB,OAAO,MAAM,WAAW,EAAE,KAAK,EAAE,YAAY,IAAI;AAE5F,SAAS,YAAY,WAAiC;AACpD,QAAMA,WAAW,WAAiD;AAClE,SAAO,MAAM,QAAQA,QAAO,IAAKA,WAA0B,CAAC;AAC9D;AASO,SAAS,YAAY,WAA8B;AACxD,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,YAAY,SAAS,GAAG;AAC1C,QAAI,UAAU,OAAO,IAAI,MAAM,OAAQ;AACvC,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,MAAM,KAAK,KAAK,IAAI;AACnE,QAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAG;AAC7B,SAAK,IAAI,IAAI;AACb,QAAI,KAAK,IAAI;AAAA,EACf;AACA,SAAO;AACT;AAEA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,YAAY,SAAS,MAAM,UAAU,cAAc,aAAa,WAAW,MAAM,CAAC;AAElH,IAAM,qBACJ;AAOK,SAAS,UAAU,OAA2B;AACnD,QAAM,UAAU,UAAU,MAAM,OAAO;AACvC,MAAI,YAAY,WAAY,QAAO;AACnC,MAAI,YAAY,UAAW,QAAO;AAClC,SAAO,eAAe,IAAI,UAAU,MAAM,IAAI,CAAC,KAAK,mBAAmB,KAAK,UAAU,MAAM,SAAS,CAAC;AACxG;AAGO,SAAS,YAAY,WAAgE;AAC1F,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,YAAY,SAAS,EAAE,QAAQ,CAAC,UAAU;AAC/C,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,MAAM,KAAK,KAAK,IAAI;AACnE,QAAI,CAAC,QAAQ,UAAU,MAAM,IAAI,MAAM,UAAU,CAAC,UAAU,KAAK,KAAK,KAAK,IAAI,IAAI,EAAG,QAAO,CAAC;AAC9F,SAAK,IAAI,IAAI;AACb,WAAO,CAAC,EAAE,MAAM,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,UAAU,KAAK,IAAI,GAAG,CAAC;AAAA,EAChG,CAAC;AACH;AAMO,SAAS,eAAe,WAA6B;AAC1D,QAAM,QAAS,WAAiD;AAChE,SACE,MAAM,QAAQ,KAAK,KACnB,MAAM;AAAA,IACJ,CAAC,MAAM,UAAW,GAA8C,iBAAiB,MAAM;AAAA,EACzF;AAEJ;AAGA,IAAM,yBAAyB,EAC5B,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,QAAQ,EAAE,OAAO,GAAG,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACpF,MAAM;AAIF,SAAS,kBAAkB,WAAwC;AACxE,QAAM,MAAO,WAAuD;AACpE,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,SAAO,IAAI,QAAQ,CAAC,UAAU;AAC5B,UAAM,SAAS,uBAAuB,UAAU,KAAK;AACrD,WAAO,OAAO,UAAU,CAAC,OAAO,IAAI,IAAI,CAAC;AAAA,EAC3C,CAAC;AACH;AAGO,SAAS,aAAa,SAA2B;AACtD,SAAO,QAAQ,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI;AACnD;AAOO,SAAS,sBAAsB,SAAmB,SAA0B;AACjF,QAAM,WAAW,UAAU,iCAAiC;AAC5D,QAAM,QACJ,QAAQ,SAAS,IACb,6BAA6B,QAAQ,wEAAwE,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,MACrJ;AACN,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAOO,SAAS,qBAAqB,QAAgB,WAA2B;AAC9E,QAAM,QAAQ,OAAO,QAAQ,qBAAqB;AAClD,MAAI,UAAU,GAAI,QAAO;AACzB,QAAM,YAAY,QAAQ,sBAAsB;AAChD,QAAM,MAAM,OAAO,QAAQ,QAAQ,SAAS;AAC5C,QAAM,OAAO,QAAQ,KAAK,KAAK,OAAO,MAAM,GAAG;AAC/C,SAAO,GAAG,OAAO,MAAM,GAAG,SAAS,CAAC;AAAA,EAAK,SAAS,GAAG,IAAI;AAC3D;;;AC9HA,SAAS,KAAAC,UAAS;;;ACGlB,SAAS,KAAAC,UAAS;AAclB,IAAM,MAAMC,GACT,OAAO,EACP,MAAM,qBAAqB,wCAAwC,EACnE,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;AAGnC,IAAM,UAAUA,GAAE,OAAO,EAAE,MAAM,eAAe,sCAAiC;AAOjF,IAAM,SAASA,GACZ,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA;AAAA,EAE7B,QAAQA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC1C,QAAQA,GAAE,MAAM,CAACA,GAAE,QAAQ,MAAM,GAAGA,GAAE,QAAQ,UAAU,GAAG,OAAO,CAAC,EAAE,QAAQ,UAAU;AAAA,EACvF,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA;AAAA,EAE/B,UAAUA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC9C,CAAC,EACA,OAAO;AAGV,IAAM,QAAQA,GACX,OAAO;AAAA,EACN,IAAI;AAAA;AAAA,EAEJ,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA;AAAA,EAE7B,OAAOA,GAAE,KAAK,CAAC,OAAO,OAAO,OAAO,QAAQ,KAAK,CAAC,EAAE,QAAQ,KAAK;AAAA,EACjE,MAAMA,GAAE,KAAK,CAAC,SAAS,cAAc,CAAC,EAAE,QAAQ,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvD,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC3C,CAAC,EACA,OAAO;AAGV,IAAM,QAAQA,GACX,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAC7B,OAAO,QAAQ,SAAS;AAAA;AAAA,EAExB,UAAUA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAE5C,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,OAAOA,GACJ,OAAO;AAAA,IACN,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,CAAC,EACA,OAAO,EACP,SAAS;AACd,CAAC,EACA,OAAO;AAEV,IAAM,WAAWA,GACd,OAAO;AAAA,EACN,OAAO,QAAQ,SAAS;AAAA,EACxB,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAC9B,UAAUA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAE5C,QAAQA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC5C,CAAC,EACA,OAAO;AAEV,IAAM,cAAcA,GACjB,OAAO;AAAA;AAAA,EAEN,MAAMA,GAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,EAC3B,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,MAAM,SAAS,SAAS;AAC1B,CAAC,EACA,OAAO,EACP,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,8BAA8B;AAEjE,IAAM,SAASA,GACZ,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC/C,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAC7B,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC1C,CAAC,EACA,OAAO;AAEV,IAAM,YAAYA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK,EAAE,CAAC,EAAE,OAAO;AAE3G,IAAM,eAAeA,GAClB,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAC7B,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,WAAWA,GACR,MAAMA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAC5F,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEb,SAASA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC7C,CAAC,EACA,OAAO;AAOV,IAAM,QAAQA,GACX,OAAO;AAAA,EACN,UAAUA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC5C,SAASA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC3C,MAAMA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA;AAAA,EAE/B,eAAeA,GAAE,KAAK,CAAC,SAAS,MAAM,CAAC,EAAE,QAAQ,OAAO;AAAA,EACxD,YAAY,IAAI,SAAS;AAC3B,CAAC,EACA,OAAO,EACP,QAAQ,EAAE,MAAM,OAAO,eAAe,QAAQ,CAAC;AAElD,IAAM,OAAO,EAAE,QAAQA,GAAE,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC,GAAG,OAAO,MAAM;AAEzD,IAAM,sBAAsBA,GAAE,mBAAmB,WAAW;AAAA,EACjEA,GACG,OAAO;AAAA,IACN,SAASA,GAAE,QAAQ,QAAQ;AAAA,IAC3B,OAAOA,GAAE,KAAK,CAAC,SAAS,MAAM,CAAC,EAAE,QAAQ,OAAO;AAAA;AAAA,IAEhD,OAAOA,GAAE,MAAM,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAClC,GAAG;AAAA,EACL,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,SAASA,GAAE,KAAK,CAAC,YAAY,UAAU,CAAC;AAAA;AAAA,IAExC,SAAS;AAAA,IACT,UAAUA,GAAE,MAAM,WAAW,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA;AAAA,IAE3C,KAAKA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,IAEvC,QAAQA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAChC,GAAG;AAAA,EACL,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,SAASA,GAAE,KAAK,CAAC,cAAc,gBAAgB,CAAC;AAAA;AAAA,IAEhD,SAASA,GACN,OAAO,EAAE,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EACzG,OAAO,EACP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOZ,SAASA,GAAE,MAAM,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,IACtC,GAAG;AAAA,EACL,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,SAASA,GAAE,QAAQ,OAAO;AAAA,IAC1B,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,IAC9B,OAAOA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,IACpC,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACxC,GAAG;AAAA,EACL,CAAC,EACA,OAAO;AAAA,EACVA,GACG,OAAO;AAAA,IACN,SAASA,GAAE,QAAQ,OAAO;AAAA,IAC1B,SAASA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,IAChC,UAAUA,GAAE,MAAM,YAAY,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,IAC5C,GAAG;AAAA,EACL,CAAC,EACA,OAAO;AACZ,CAAC;AAGD,IAAM,gBAAmD;AAAA,EACvD,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,OAAO;AACT;AAGO,SAAS,kBAAkB,SAAiD;AACjF,SAAO,cAAc,QAAQ,OAAO;AACtC;AAKO,SAAS,WAAW,SAAkC;AAC3D,QAAM,QAAQ,CAAC,QAAQ,MAAM,UAAU,QAAQ,MAAM,OAAO;AAC5D,QAAM,QAAQ,MAAiC;AAC7C,YAAQ,QAAQ,SAAS;AAAA,MACvB,KAAK;AACH,eAAO,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACxC,KAAK;AAAA,MACL,KAAK;AACH,eAAO,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,UAAU,EAAE,MAAM,MAAM,CAAC;AAAA,MAClG,KAAK;AAAA,MACL,KAAK;AACH,eAAO,QAAQ,QAAQ,MAAM,GAAG,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,YAAY,EAAE,IAAI,CAAC,CAAC;AAAA,MACjG,KAAK;AACH,eAAO,CAAC,QAAQ,OAAO,GAAG,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,QAAQ,IAAI;AAAA,MAC1E,KAAK;AACH,eAAO,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MAC3C;AACE,eAAO,CAAC;AAAA,IACZ;AAAA,EACF,GAAG;AACH,SAAO,CAAC,MAAM,CAAC,GAAG,GAAG,MAAM,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAmB,QAAQ,GAAG,KAAK,CAAC,CAAC;AACpF;AAOO,IAAM,mBAAmB;AAGhC,IAAM,eAAe;AAGrB,SAAS,YAAY,MAAsB;AACzC,MAAI,KAAK,UAAU,aAAc,QAAO;AACxC,QAAM,MAAM,KAAK,MAAM,GAAG,eAAe,CAAC;AAC1C,QAAM,SAAS,IAAI,MAAM,GAAG,KAAK,IAAI,IAAI,YAAY,GAAG,GAAG,eAAe,CAAC,CAAC;AAC5E,SAAO,GAAG,OAAO,QAAQ,oBAAoB,EAAE,CAAC;AAClD;AAGA,SAAS,UAAU,SAAwC;AACzD,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK;AACH,aAAO,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IAC1C,KAAK;AAAA,IACL,KAAK;AACH,aAAO,CAAC,QAAQ,OAAO;AAAA,IACzB,KAAK;AAAA,IACL,KAAK;AACH,aAAO,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IAC5C,KAAK;AACH,aAAO,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,IAC7C;AACE,aAAO,CAAC;AAAA,EACZ;AACF;AAOO,SAAS,aAAa,SAAwB,UAAmB,OAAkC;AACxG,QAAM,IAAI,YAAY,UAAU,KAAK;AAErC,QAAM,cAAc,CAAC,MAAgB,IAAI,CAAC,GAAG,EAAE,QAAQ,MAAM,EAAE,GAAG,GAAG,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,MAAM,CAAC,IAAI,CAAC;AAC3G,QAAM,UAAU,UAAU,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,MAAM,GAAG,EAAE,UAAU,SAAS,EAAE,IAAI,CAAC,CAAC;AAClH,QAAM,OAAO,MAAiC;AAC5C,YAAQ,QAAQ,SAAS;AAAA,MACvB,KAAK;AACH,eAAO,QAAQ,MAAM,QAAQ,CAAC,MAAM;AAAA,UAClC,EAAE;AAAA,UACF,GAAG,OAAO,OAAO,EAAE,SAAS,CAAC,CAAC;AAAA,UAC9B,GAAI,EAAE,WAAW,CAAC,EAAE,UAAU,GAAG,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC;AAAA,QAC/D,CAAC;AAAA,MACH,KAAK;AAAA,MACL,KAAK;AACH,eAAO,CAAC,QAAQ,OAAO,EAAE,OAAO,GAAG,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO;AAAA,MACzG,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AAAA,UACL,GAAG,QAAQ,QAAQ,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,YAAY,EAAE,IAAI,CAAC,CAAC;AAAA,UACxF,GAAG,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,UACpC,QAAQ,SAAS;AAAA,UACjB,QAAQ,SAAS;AAAA,UACjB,QAAQ,SAAS,SAAS,EAAE;AAAA,UAC5B,EAAE;AAAA,UACF,QAAQ,YAAY,eAAe,eAAe;AAAA,UAClD,EAAE;AAAA,QACJ;AAAA,MACF,KAAK;AACH,eAAO,CAAC,EAAE,KAAK;AAAA,MACjB,KAAK;AACH,eAAO;AAAA,UACL,IAAI,QAAQ,QAAQ,QAAQ,MAAM,EAAE,CAAC;AAAA,UACrC,GAAG,QAAQ,SAAS,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE,UAAU,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,QACpG;AAAA,MACF;AACE,eAAO,CAAC;AAAA,IACZ;AAAA,EACF,GAAG;AAEH,QAAM,UAAU,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa;AACvD,SAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,SAAS,GAAG,KAAK,GAAG,OAAO,EAAE,OAAO,CAAC,MAAmB,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACrG;AAGA,SAAS,cAAc,SAAkC;AACvD,QAAM,UAAU,UAAU,OAAO,EAAE,QAAQ,CAAC,MAAO,EAAE,OAAO,WAAW,QAAQ,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAE;AACnG,QAAM,WACJ,QAAQ,YAAY,WAChB,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,IAChC,QAAQ,YAAY,cAAc,QAAQ,YAAY,aACpD,QAAQ,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,IACzC,CAAC;AACT,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,SAAS,GAAG,SAAS,OAAO,CAAC,OAAqB,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACzF;AAGO,SAAS,kBAAkB,SAAuC;AACvE,QAAM,QAAQ,IAAI,IAAI,cAAc,OAAO,CAAC;AAC5C,SAAO,QAAQ,OAAO,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,EAAE,CAAC;AACrD;AAGO,SAAS,eAAe,SAAqC;AAClE,SAAO,IAAI,IAAI,UAAU,OAAO,EAAE,QAAQ,CAAC,MAAO,EAAE,OAAO,WAAW,QAAQ,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAE,CAAC;AACrG;AAGO,SAAS,eAAe,SAAkC;AAC/D,QAAM,YAAY,IAAI,IAAI,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACzD,SAAO,cAAc,OAAO,EACzB,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EACjC;AAAA,IACC,CAAC,OAAO,oBAAoB,EAAE,8DAA8D,EAAE;AAAA,EAChG;AACJ;AAQO,SAAS,mBAAmB,SAAwB,SAAiB,WAA8B;AACxG,QAAM,WAAW,eAAe,OAAO;AACvC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,OAAO,CAAC,MACZ,EAAE,WAAW,UAAW,cAAc,UAAa,EAAE,KAAK,KAAK,EAAE,YAAY,MAAM,UAAU,KAAK,EAAE,YAAY;AAClH,aAAW,UAAU,UAAU,OAAO,GAAG;AACvC,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,MAAM,EAAG;AACrC,UAAM,OAAO,OAAO,OAAO,QAAQ,MAAM,EAAE,EAAE,YAAY;AACzD,QAAI,CAAC,SAAS,SAAS,IAAI,GAAG;AAC5B,eAAS;AAAA,QACP,iCAAiC,OAAO,MAAM;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AACA,OAAK,QAAQ,YAAY,gBAAgB,QAAQ,YAAY,qBAAqB,QAAQ,SAAS;AACjG,QAAI,CAAC,YAAY,QAAQ,QAAQ,MAAM,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,SAAS,SAAS,IAAI,CAAC,GAAG;AAC7F,eAAS;AAAA,QACP,sBAAsB,QAAQ,QAAQ,KAAK;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,IAAM,gBAAgB;AAAA,EACpB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,eAAe;AACjB;AAKA,IAAM,uBAAuBA,GAAE;AAAA,EAC7B,OAAO,YAAY,OAAO,KAAK,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,GAAGA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAIzF;AAOA,IAAM,UAAoD;AAAA,EACxD,IAAI;AAAA,IACF,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,WAAW;AAAA,IACX,aAAa;AAAA,IACb,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACF;AAEA,IAAM,UAAU,CAAC,cAA+B,YAAY,MAAM,MAAM,MAAM,EAAE,CAAC,GAAG,YAAY,KAAK;AAG9F,SAAS,oBAAoB,UAA4B;AAC9D,SAAO,aAAa,UAAa,QAAQ,QAAQ,QAAQ,CAAC,MAAM;AAClE;AAGO,IAAM,iCAAiC;AAGvC,SAAS,qBAAqB,UAA0B;AAC7D,QAAM,UAAU,QAAQ;AACxB,SAAO;AAAA,IACL,uOAAuO,QAAQ;AAAA,IAC/O;AAAA,IACA,GAAG,OAAO,QAAQ,aAAa,EAAE;AAAA,MAC/B,CAAC,CAAC,KAAK,OAAO,MAAM,MAAM,GAAG,MAAM,KAAK,UAAU,QAAQ,GAA2B,CAAC,CAAC,KAAK,OAAO;AAAA,IACrG;AAAA,IACA;AAAA,IACA,+DAA+D,OAAO,KAAK,aAAa,EACrF,IAAI,CAAC,MAAM,IAAI,CAAC,aAAQ,EACxB,KAAK,IAAI,CAAC;AAAA,EACf,EAAE,KAAK,IAAI;AACb;AAGO,SAAS,mBAAmB,QAAwC;AACzE,QAAM,SAAS,qBAAqB,UAAU,MAAM;AACpD,SAAO,OAAO,UAAU,OAAO,OAAO;AACxC;AAGA,SAAS,YAAY,UAAmB,OAAwC;AAC9E,SAAO,QAAQ,QAAQ,QAAQ,CAAC,KAAK,SAAU,QAAQ;AACzD;AAkBA,SAAS,MAAM,QAAsB,KAAyB,cAA+B;AAC3F,SAAO,OAAO,CAAC,gBAAgB,OAAO,YAAY,SAAS,GAAG,IAAI,WAAW;AAC/E;AAeA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KACJ,QAAQ,mBAAmB,aAAa,EACxC,QAAQ,6DAA6D,UAAU;AACpF;AAEA,IAAM,MAAM,CAAC,SACX,KAAK,QAAQ,WAAW,CAAC,QAAQ,EAAE,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,SAAS,GAAG,EAAE,CAAW;AAG3G,SAAS,OAAO,MAAsB;AACpC,SAAO,IAAI,IAAI,EAAE,QAAQ,kDAAkD,gCAAgC;AAC7G;AAGO,SAAS,SAAS,MAAsB;AAC7C,QAAM,QAAQ,KACX,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,OAAO,OAAO;AACjB,QAAM,QAAQ,MAAM,CAAC,IAAI,CAAC,KAAK;AAC/B,QAAM,SAAS,MAAM,SAAS,IAAK,MAAM,CAAC,IAAI,CAAC,KAAK,KAAM;AAC1D,SAAO,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY;AACzC;AAGA,IAAM,iBAAiB,CAAC,WAAW,WAAW,WAAW,WAAW,WAAW,SAAS;AACxF,SAAS,OAAO,MAAsB;AACpC,MAAI,MAAM;AACV,aAAW,MAAM,KAAM,QAAO,GAAG,YAAY,CAAC,KAAK;AACnD,SAAO,eAAe,MAAM,eAAe,MAAM;AACnD;AAEA,SAAS,WAAW,QAAsB,QAAsB,KAAqB;AACnF,MAAI,OAAO,WAAW,QAAQ;AAC5B,UAAM,MAAM,OAAO,QAAQ,OAAO;AAClC,QAAI,IAAK,QAAO,eAAe,GAAG,uBAAuB,GAAG;AAAA,EAC9D,WAAW,OAAO,WAAW,YAAY;AACvC,UAAM,MAAM,OAAO,OAAO,OAAO,MAAM;AACvC,QAAI,IAAK,QAAO,eAAe,GAAG,eAAe,GAAG;AAAA,EACtD;AACA,SAAO,eAAe,GAAG,gCAAgC,OAAO,OAAO,IAAI,CAAC,KAAK,IAAI,SAAS,OAAO,IAAI,CAAC,CAAC;AAC7G;AAEA,IAAM,OAAO;AAAA,EACX,WACE;AAAA,EACF,YACE;AAAA,EACF,OACE;AAAA,EACF,QACE;AAAA,EACF,MAAM;AAAA,EACN,OACE;AAAA,EACF,OACE;AAAA,EACF,OACE;AAAA,EACF,MAAM;AAAA,EACN,OACE;AAAA,EACF,OACE;AAAA,EACF,MAAM;AAAA,EACN,OACE;AAAA,EAEF,MAAM;AAAA,EACN,QACE;AAAA,EACF,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WACE;AAAA,EACF,QACE;AAAA,EACF,KAAK;AAAA,EACL,SACE;AACJ;AAaA,IAAM,aACJ;AAEF,SAAS,OACP,SACA,QACA,GACQ;AACR,SAAO,QAAQ,MACZ,IAAI,CAAC,MAAM,MAAM;AAChB,UAAM,OAAO,MAAM,QAAQ,MAAM,SAAS;AAC1C,UAAM,OAAO,sBAAsB,IAAI,KAAK,OAAO,IAAI,CAAC,UAAU,KAAK,OAAO,WAAW,KAAK,YAAY,EAAE;AAC5G,UAAM,OAAO,CAAC,KAAK,OAAO,QAAQ,KAAK,IAAI,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,CAAW,CAAC;AACxF,UAAM,QAAQ,KAAK,SAAS,OAAO,OAAO,KAAK,KAAK;AACpD,UAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,GAAG,SAAS;AACxE,UAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,UAAM,SAAS,CAAC,MAAc,MAAe,qBAAqB,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE;AAC9F,WAAO,uBAAuB,OAAO,KAAK,WAAW;AAAA,sBACrC,WAAW,KAAK,QAAQ,QAAQ,IAAI,CAAC,GAAG,OAAO,KAAK,iCAAiC;AAAA;AAAA,wBAEnF,IAAI,sBAAsB,KAAK,KAAK,QAAK,CAAC;AAAA,MAC5D,KAAK,WAAW,yBAAyB,IAAI,EAAE,QAAQ,CAAC,uBAAuB,IAAI,KAAK,QAAQ,CAAC,kBAAkB,EAAE;AAAA,wBACnG,OAAO,KAAK,IAAI,CAAC;AAAA,MACnC,QAAQ,0CAA0C,MAAM,QAAQ,KAAK,GAAG,CAAC,eAAe,KAAK,oBAAoB,EAAE;AAAA,2BAC9F,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC,GAAG,OAAO,KAAK,QAAQ,MAAM,OAAO,CAAC,GAAG,OAAO,KAAK,MAAM,MAAM,KAAK,CAAC,GAAG,OAAO,KAAK,OAAO,MAAM,KAAK,CAAC,GAAG,OAAO,KAAK,KAAK,CAAC;AAAA;AAAA;AAAA,EAGrL,CAAC,EACA,KAAK,EAAE;AACZ;AAEA,SAAS,OACP,SACA,QACA,GACa;AACb,QAAM,OAAO,CAAC,KAAK,MAAM,KAAK,QAAQ,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,SAAS,SAAS,IAAI,SAAS,EAAE,KAAK,EAAE;AACzG,SAAO;AAAA,IACL,KAAK,aAAa,QAAQ,KAAK;AAAA,IAC/B,KAAK,GAAG,UAAU,uBAAuB,KAAK,IAAI,SAAS,IAAI,EAAE,IAAI,CAAC;AAAA,IACtE,MAAM,OAAO,SAAS,QAAQ,CAAC;AAAA,IAC/B,QAAQ,8DAA8D,IAAI,EAAE,WAAW,CAAC,oCAAoC,IAAI;AAAA,IAChI,OAAO;AAAA,EACT;AACF;AAKA,SAAS,WAAW,GAAgB,QAAsB,IAAqB;AAC7E,QAAM,QAAQ,EAAE,MAAM,QAAQ,OAAO,OAAO,EAAE,KAAK,KAAK,IAAI;AAC5D,QAAMC,OAAM,EAAE,MAAM,WAAW,yBAAyB,IAAI,EAAE,KAAK,QAAQ,CAAC,WAAW;AACvF,QAAM,OAAO,EAAE,OACX,qBAAqB,QAAQ,aAAa,KAAK,cAAc,EAAE,2BAA2B,IAAI,EAAE,KAAK,KAAK,CAAC,SAASA,IAAG,WACvH;AACJ,QAAM,QAAQ,MAAM,EAAE,SAAS,OAAO,KAAK,QAAQ;AACnD,QAAM,OAAO,EAAE,OAAO,sBAAsB,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,YAAY;AAC3E,QAAM,OAAO,EAAE,OAAO,yBAAyB,OAAO,EAAE,IAAI,CAAC,GAAG,IAAI,WAAW;AAC/E,QAAM,SAAS,EAAE,MAAM,SAAS,4BAA4B,IAAI,EAAE,KAAK,MAAM,CAAC,WAAW;AACzF,QAAM,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,UAAU,EAAE,MAAM,MAAM,EAAE,OAAO,CAAC,MAAmB,QAAQ,GAAG,KAAK,CAAC,CAAC;AACpH,SAAO,sBAAsB,EAAE,IAAI,gBAAgB,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM;AACvG;AAGA,SAAS,WACP,SACA,QACA,GACA,IACA,UACQ;AACR,MAAI,CAAC,IAAI;AACP,WAAO,wBAAwB,KAAK,IAAI,oBAAoB,WAAW,SAAS,QAAQ,IAAI,CAAC,qBAAqB,IAAI,QAAQ,IAAI,CAAC;AAAA,EACrI;AACA,QAAM,SAAS,QAAQ,aAAa,WAAW,EAAE,WAAW,EAAE;AAC9D,QAAM,QAAQ,WAAW,KAAK,aAAa;AAC3C,SAAO,wBAAwB,KAAK,IAAI,GAAG,WAAW,SAAS,QAAQ,IAAI,CAAC,sCAAsC,IAAI,QAAQ,IAAI,CAAC,GAAG,KAAK,6BAA6B,IAAI,MAAM,CAAC,kCAAkC,KAAK,KAAK,GAAG,KAAK,KAAK;AAC9O;AAEA,SAAS,UACP,SACA,QACA,GACa;AACb,QAAM,KAAK,QAAQ,YAAY;AAC/B,QAAM,UAAU,QAAQ,SAAS,IAAI,CAAC,MAAM,WAAW,GAAG,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE;AAC9E,QAAM,QAAQ,KACV,gHACA;AACJ,SAAO;AAAA,IACL,KAAK,UAAU,QAAQ,OAAO;AAAA,IAC9B,KAAK,GAAG,UAAU,GAAG,WAAW,QAAQ,SAAS,QAAQ,GAAG,IAAI,QAAQ,QAAQ,aAAa,IAAI,CAAC;AAAA,IAClG,MAAM,0CAA0C,IAAI,QAAQ,OAAO,EAAE,KAAK,CAAC,SAAS,OAAO;AAAA,IAC3F,QAAQ;AAAA,IACR,OAAO;AAAA,EACT;AACF;AAEA,SAAS,SACP,SACA,QACA,GACQ;AACR,QAAM,QAAQ,UAAU,SAAS,QAAQ,CAAC;AAC1C,QAAM,SAAS,eAAe,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG,MAAM,MAAM;AACjF,SAAO,2BAA2B,QAAQ,SAAS,YAAY,EAAE,KAAK,MAAM;AAC9E;AAEA,SAAS,UAAU,MAAuC,OAAe,OAAkB,KAAa;AACtG,MAAI,SAAS,kBAAkB;AAC7B,WAAO,wBAAwB,IAAI,KAAK,SAAI,OAAO,KAAK,CAAC,qBAAqB,SAAI,OAAO,IAAI,KAAK,CAAC;AAAA,EACrG;AACA,QAAM,QAAQ,MAAM;AAAA,IAClB,EAAE,QAAQ,EAAE;AAAA,IACZ,CAAC,GAAG,MAAM,uBAAuB,IAAI,QAAQ,KAAK,MAAM,KAAK,KAAK,IAAI;AAAA,EACxE;AACA,SAAO,yBAAyB,IAAI,KAAK,MAAM,KAAK,EAAE,CAAC;AACzD;AAIA,SAAS,WACP,GACA,MACA,QACA,GACA,KACA,OACQ;AACR,QAAMA,OAAM,EAAE,OAAO,WAAW,sBAAsB,IAAI,EAAE,OAAO,QAAQ,CAAC,WAAW;AACvF,QAAM,WAAW,SAAS,eAAe,4BAA4B,KAAK,IAAI,IAAI,IAAI,EAAE,QAAQ,CAAC,YAAY;AAC7G,SAAO,eAAe,GAAG,YAAY,KAAK,yBAAyB,WAAW,EAAE,QAAQ,QAAQ,IAAI,CAAC,4BAA4B,IAAI,EAAE,OAAO,IAAI,CAAC,SAASA,IAAG,oCAAoC,UAAU,MAAM,EAAE,KAAK,CAAC,GAAG,QAAQ,GAAG,EAAE,OAAO,wBAAwB,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,wBAAwB,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,uBAAuB,IAAI,YAAY,EAAE,IAAI,CAAC,CAAC;AACxZ;AAEA,SAAS,aAAa,MAA+C;AACnE,SAAO,SAAS,eACZ,gDAAgD,KAAK,IAAI,6BACzD;AACN;AAGA,SAAS,YACP,SACA,QACA,GACA,WACQ;AACR,QAAM,OAAO,QAAQ;AACrB,QAAM,WAAW,aAAa,IAAI;AAClC,QAAM,UAAU,QAAQ,UACpB,wBAAwB,OAAO,OAAO,uBAAuB,MAAM,QAAQ,OAAO,MAAM,KAAK,CAAC,UAAU,OAAO,IAAI,cAAc,YAAY,yBAAyB,IAAI,SAAS,CAAC,WAAW,EAAE,gDAAgD,IAAI,QAAQ,QAAQ,SAAS,EAAE,SAAS,CAAC,UAAU,UAAU,MAAM,GAAG,GAAG,CAAC,gCAAgC,IAAI,QAAQ,QAAQ,KAAK,CAAC,SAAM,IAAI,QAAQ,QAAQ,KAAK,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,IAAI,QAAQ,iBACvb;AAEJ,QAAM,OAAO,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;AAC7C,QAAM,QAAQ,CAAC,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;AACxC,QAAM,QAAQ,QAAQ,QACnB,MAAM,GAAG,gBAAgB,EACzB;AAAA,IAAI,CAAC,GAAG,MACP;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,wBAAwB,MAAM,IAAI,MAAM,MAAM,CAAC,cAAc,KAAK,IAAI,KAAK,MAAM,CAAC;AAAA,IACpF;AAAA,EACF;AACF,QAAM,SAAS,QAAQ,UAAU,KAAK,8BAA8B,QAAQ;AAE5E,QAAM,SACJ,QAAQ,MAAM,QAAQ,QAAQ,MAAM,kBAAkB,UAAU,OAAO,OACnE,uCAAuC,MAAM,QAAQ,OAAO,MAAM,KAAK,EAAE,KAAK,CAAC,UAAU,OAAO,IAAI,oBACpG;AACN,QAAM,KAAK,KAAK,KAAK,MAAM,SAAS,CAAC;AACrC,QAAM,OAAO,SAAS,CAAC,GAAG,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,GAAG,MAAM,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE;AAClG,SAAO,+BAA+B,IAAI,KAAK,OAAO,qBAAqB,IAAI,SAAS,MAAM;AAChG;AAOA,SAAS,WACP,SACA,QACA,GACQ;AACR,SAAO,QAAQ,QACZ,MAAM,gBAAgB,EACtB,IAAI,CAAC,MAAM,WAAW,GAAG,QAAQ,SAAS,QAAQ,GAAG,eAAe,EAAE,CAAC,EACvE,KAAK,EAAE;AACZ;AAEA,SAAS,WAAW,SAAuD,GAAgC;AACzG,QAAM,QAAQ,QAAQ,MACnB;AAAA,IACC,CAAC,MACC,mBAAmB,EAAE,UAAU,aAAa,EAAE,0BAA0B,EAAE,UAAU,KAAK,QAAQ,EAAE,gBAAgB,IAAI,EAAE,IAAI,CAAC;AAAA,EAClI,EACC,KAAK,EAAE;AACV,QAAM,QAAQ,CAAC,KAAK,WAAW,KAAK,QAAQ,KAAK,KAAK,KAAK,OAAO,EAAE,IAAI,CAAC,SAAS,SAAS,IAAI,SAAS,EAAE,KAAK,EAAE;AACjH,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK,GAAG,UAAU,4CAA4C,KAAK,IAAI,GAAG,IAAI,EAAE,KAAK,CAAC;AAAA,IACtF,MAAM,OAAO,IAAI,QAAQ,KAAK,CAAC,QAAQ,KAAK,GAAG,QAAQ,OAAO,qBAAqB,IAAI,QAAQ,IAAI,CAAC,SAAS,EAAE;AAAA,IAC/G,QAAQ,wBAAwB,KAAK;AAAA,IACrC,OAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,SAAuD,GAA2B;AACnG,QAAM,QAAQ,WAAW,SAAS,CAAC;AACnC,SAAO,eAAe,MAAM,GAAG,KAAK,MAAM,IAAI,QAAQ,YAAY,EAAE,CAAC,GAAG,MAAM,IAAI;AACpF;AAEA,SAAS,WACP,SACA,QACA,GACa;AACb,QAAM,UAAU,QAAQ,QAAQ,QAAQ,MAAM,EAAE;AAChD,QAAM,WAAW,QAAQ,SACtB,IAAI,CAAC,MAAM;AACV,UAAM,YAAY,EAAE,UAAU,IAAI,CAAC,MAAM,0BAA0B,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,EAAE;AAC5G,WAAO,sBAAsB,WAAW,EAAE,QAAQ,QAAQ,IAAI,CAAC,8DAA8D,IAAI,EAAE,OAAO,IAAI,CAAC,UAAU,EAAE,OAAO,wBAAwB,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,6BAA6B,OAAO,EAAE,IAAI,CAAC,SAAS,YAAY,0BAA0B,SAAS,WAAW,EAAE,GAAG,EAAE,UAAU,0BAA0B,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE;AAAA,EACzY,CAAC,EACA,KAAK,EAAE;AACV,SAAO;AAAA,IACL,KAAK;AAAA,IACL,KAAK,GAAG,UAAU,4BAA4B,IAAI,OAAO,CAAC;AAAA,IAC1D,MAAM;AAAA,IACN,QAAQ,gCAAgC,IAAI,EAAE,aAAa,CAAC,KAAK,IAAI,OAAO,CAAC;AAAA,IAC7E,OAAO;AAAA,EACT;AACF;AAEA,SAAS,UACP,SACA,QACA,GACQ;AACR,QAAM,QAAQ,WAAW,SAAS,QAAQ,CAAC;AAC3C,SAAO,eAAe,MAAM,GAAG,KAAK,MAAM,IAAI,QAAQ,YAAY,EAAE,CAAC,GAAG,MAAM,IAAI;AACpF;AAGO,SAAS,SAAS,SAAwB,OAAyC;AACxF,MAAI,QAAQ,MAAM,WAAY,QAAO,QAAQ,MAAM;AACnD,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK;AACH,aAAO,QAAQ,UAAU,SAAS,YAAY;AAAA,IAChD,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO,MAAM,UAAU;AAAA,IACzB;AACE,aAAO,MAAM,UAAU;AAAA,EAC3B;AACF;AAGA,SAAS,OAAO,KAAsB;AACpC,QAAM,IAAI,OAAO,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE;AAC1C,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAE,KAAK,KAAM,KAAM,KAAK,IAAK,KAAK,IAAI,GAAG;AAC3D,SAAO,SAAS,IAAI,SAAS,IAAI,SAAS,IAAI;AAChD;AAEA,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqMd,IAAM,KAAK,CAAC,MAAsB,KAAK,MAAM,IAAI,EAAE,IAAI;AAGvD,IAAM,cAAc;AAGpB,IAAM,eAAe;AAGrB,IAAM,QAAQ;AAAA;AAAA;AAAA,mGAGqF,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAQ/G,IAAM,MAAM;AAAA,gBACI,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmDrB,IAAM,iBAAiB;AAAA,gBACP,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDrB,SAAS,aAAa,MAAkD;AACtE,SAAO,KAAK,SAAS,KAAK,SAAS;AACrC;AAEA,IAAM,mBAA0D,oBAAI,IAAI;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,SAAS,YACd,SACA,OACA,MACQ;AACR,MAAI,aAAa,IAAI,KAAK,iBAAiB,IAAI,QAAQ,OAAO,GAAG;AAC/D,WAAO,QAAQ,MAAM,cAAc,MAAM,UAAU;AAAA,EACrD;AACA,SAAO,SAAS,SAAS,KAAK;AAChC;AAQO,SAAS,kBAAkB,SAAwB,QAAsB,MAA+B;AAC7G,QAAM,IAAI,KAAK,QAAQ;AACvB,QAAM,IAAI,KAAK,SAAS;AACxB,QAAM,IAAI,YAAY,KAAK,UAAU,KAAK,KAAK;AAC/C,QAAM,KAAK,SAAS,SAAS,KAAK,KAAK;AACvC,QAAM,MAAM,OAAO,EAAE,IAAI,YAAa,KAAK,MAAM,OAAO;AACxD,QAAM,OAAO,OAAO,OAAO,4CAA4C,OAAO,IAAI,0BAA0B;AAC5G,QAAM,OAAO;AAAA;AAAA,SAEN,IAAI,GAAG,KAAK;AACnB,QAAM,QAAQ,aAAa,IAAI,IAAI,SAAS,SAAS,QAAQ,CAAC,IAAI;AAClE,MAAI,MAAO,QAAO,eAAe,SAAS,OAAO,QAAQ,MAAM,IAAI;AACnE,QAAM,OAAO,QAAQ,YAAY,gBAAgB,QAAQ,YAAY;AACrE,QAAM,QAAQ,WAAW,SAAS,WAAW,SAAS,QAAQ,GAAG,KAAK,MAAM,IAAI,GAAG,QAAQ,KAAK,EAAE;AAClG,QAAM,MAAM,UAAU,KAAK,MAAM,GAAG,CAAC;AACrC,QAAM,OAAO,OAAO,sCAAsC,EAAE,KAAK,WAAW,SAAS,QAAQ,CAAC,CAAC,WAAW;AAE1G,QAAM,OAAO,QAAQ,KAAK,IAAI,QAAQ,QAAQ,QAAQ,gBAAgB,KAAK,KAAK,IAAI,QAAQ,IAAI,SAAS;AACzG,SAAO,GAAG,IAAI;AAAA,kBACE,EAAE,UAAU,CAAC,aAAa,CAAC;AAAA,WAClC,GAAG,IAAI,GAAG,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,CAAC,aAAa,GAAG,IAAI,MAAM,CAAC;AAAA,sBAC3E,OAAO,kBAAkB,EAAE,IAAI,IAAI,iCAAiC,KAAK,uBAAuB,GAAG;AACzH;AAGA,SAAS,SAAS,SAAwB,QAAsB,GAAuC;AACrG,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK;AACH,aAAO,OAAO,SAAS,QAAQ,CAAC;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AACH,aAAO,UAAU,SAAS,QAAQ,CAAC;AAAA,IACrC,KAAK;AACH,aAAO,WAAW,SAAS,CAAC;AAAA,IAC9B,KAAK;AACH,aAAO,WAAW,SAAS,QAAQ,CAAC;AAAA,IACtC;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,eACP,SACA,OACA,QACA,MACA,MACQ;AACR,QAAM,IAAI,KAAK,QAAQ;AACvB,QAAM,IAAI,KAAK,SAAS;AACxB,QAAM,SAAS,KAAK,MAAO,IAAI,cAAe,GAAI,IAAI;AACtD,QAAM,MAAM;AAAA,IACV,SAAS,GAAG,KAAK,KAAK,MAAM,CAAC;AAAA,IAC7B,YAAY,IAAI,IAAI,KAAK,KAAK,UAAU,CAAC;AAAA;AAAA,IAEzC,MAAM,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,GAAG,KAAK,KAAK,QAAQ,CAAC,IAAI;AAAA,IACnE;AAAA,IACA,OAAO;AAAA,IACP,OAAO,MAAM;AAAA,IACb,QAAQ,QAAQ,YAAY,cAAc,QAAQ,YAAY;AAAA,EAChE;AACA,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,SAAS,YAAY,SAAS,KAAK,OAAO,IAAI;AACpD,QAAM,MAAM,OAAO,MAAM,IAAI,YAAa,KAAK,MAAM,OAAO;AAC5D,QAAM,OAAO,MAAM,OACf,OAAO,MAAM,IACV,OAAO,aAAa,OAAO,OAC3B,OAAO,QAAQ,OAAO,YACzB;AACJ,QAAM,OAAO;AAAA,IACX,MAAM,WAAW,sCAAsC,GAAG,KAAK,aAAa,IAAI,MAAM,QAAQ,CAAC,CAAC,WAAW;AAAA,IAC3G,MAAM,UAAU,qCAAqC,GAAG,KAAK,aAAa,IAAI,MAAM,OAAO,CAAC,CAAC,WAAW;AAAA,IACxG,OAAO,yBAAyB,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC,CAAC,UAAU,IAAI,cAAc;AAAA,EACjG,EAAE,KAAK,EAAE;AACT,QAAM,SAAS,OACX,qCAAqC,MAAM,4CAA4C,MAAM,KAAK,IAAI,uBACtG;AACJ,SAAO,GAAG,IAAI;AAAA,aACH,CAAC,aAAa,CAAC;AAAA,4CACgB,KAAK,UAAU,GAAG,CAAC,wBAAwB,MAAM,GAAG,oCAAoC,MAAM,KAAK,MAAM,GAAG,eAAe,MAAM,mBAAmB,MAAM,IAAI,2CAA2C,MAAM,KAAK,MAAM,MAAM,6BAA6B,cAAc;AACvT;AAGA,SAAS,WACP,SACA,QACA,GACA,WACQ;AACR,UAAQ,QAAQ,SAAS;AAAA,IACvB,KAAK;AACH,aAAO,yBAAyB,QAAQ,KAAK,KAAK,OAAO,SAAS,QAAQ,CAAC,CAAC;AAAA,IAC9E,KAAK;AAAA,IACL,KAAK;AACH,aAAO,SAAS,SAAS,QAAQ,CAAC;AAAA,IACpC,KAAK;AAAA,IACL,KAAK;AACH,aAAO,YAAY,SAAS,QAAQ,GAAG,SAAS;AAAA,IAClD,KAAK;AACH,aAAO,UAAU,SAAS,CAAC;AAAA,IAC7B,KAAK;AACH,aAAO,UAAU,SAAS,QAAQ,CAAC;AAAA,IACrC;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,WAAW,SAAwB,QAAgB,QAAsB,KAAa,QAAwB;AACrH,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,OAAO,MAAM,OAAQ,OAAO,aAAa,OAAO,OAAQ;AAE9D,QAAM,OAAO,QAAQ,YAAY,gBAAgB,QAAQ,YAAY;AACrE,QAAM,QACJ,QAAQ,MAAM,kBAAkB,UAAU,CAAC,OACvC,uCAAuC,MAAM,QAAQ,OAAO,QAAQ,MAAM,KAAK,EAAE,KAAK,CAAC,UAAU,OAAO,QAAQ,IAAI,oBACpH;AACN,QAAM,SAAS,QAAQ,MAAM,kBAAkB;AAE/C,QAAM,QAAQ,QAAQ,QAAQ,QAAQ,SAAS;AAC/C,QAAM,OAAO,CAAC,KAAa,SAAiB;AAC1C,UAAM,OAAO,eAAe,GAAG,kBAAkB,GAAG,KAAK,aAAa,IAAI,IAAI,CAAC,CAAC;AAChF,WAAO,QAAQ,4CAA4C,MAAM,KAAK,IAAI,WAAW;AAAA,EACvF;AACA,SAAO;AAAA,IACL,MAAM,WAAW,KAAK,YAAY,MAAM,QAAQ,IAAI;AAAA,IACpD,QAAQ,qBAAqB,MAAM,GAAG,KAAK,WAAW;AAAA,IACtD,MAAM,UAAU,KAAK,WAAW,MAAM,OAAO,IAAI;AAAA,IACjD,QAAQ,CAAC,SAAS,yBAAyB,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC,CAAC,UAAU,IAAI,cAAc;AAAA,EAC5G,EAAE,KAAK,EAAE;AACX;AAGA,SAAS,UAAU,MAA+B,GAAW,GAAW;AACtE,QAAM,SAAS;AACf,QAAM,MAAM,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI;AACzC,QAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,MAAM,IAAI;AAC/C,QAAM,OAAO,KAAK,IAAI,KAAK,MAAM,MAAM,IAAI;AAC3C,QAAM,QAAQ,KAAK,IAAI,KAAK,OAAO,MAAM,IAAI;AAC7C,SAAO,EAAE,KAAK,MAAM,OAAO,IAAI,OAAO,OAAO,QAAQ,IAAI,MAAM,OAAO;AACxE;;;ADp3CO,IAAM,iBAAiB;AACvB,IAAM,kBAAkB,CAAC,qBAAqB,cAAc;AAEnE,IAAMC,OAAMC,GACT,OAAO,EACP,MAAM,qBAAqB,wCAAwC,EACnE,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;AAGnC,IAAM,aAAaA,GAChB,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAC7B,WAAWA,GAAE,KAAK,CAAC,YAAY,UAAU,CAAC;AAAA;AAAA,EAE1C,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,IAAIA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAExB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAChC,CAAC,EACA,OAAO;AAIH,IAAM,qBAAqB,CAAC,YAAY,WAAW,MAAM;AAGhE,IAAM,cAAcA,GACjB,OAAO;AAAA;AAAA,EAEN,IAAIA,GACD,OAAO,EACP;AAAA,IACC;AAAA,IACA;AAAA,EACF;AAAA,EACF,MAAMA,GAAE,KAAK,kBAAkB;AAAA;AAAA,EAE/B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA;AAAA,EAE7B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC3C,CAAC,EACA,OAAO;AAIH,SAAS,eAAe,WAAyD;AACtF,SAAO,6BAA6B,KAAK,UAAU,SAAS,EAAE,KAAK,cAAc,KAAK,UAAU,IAAI;AACtG;AAQA,IAAM,SAASA,GACZ,OAAO;AAAA;AAAA,EAEN,SAASA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAChC,UAAUA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC5C,UAAUA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA,EAE5C,SAASA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC7C,CAAC,EACA,OAAO;AAGV,IAAM,SAASA,GACZ,OAAO;AAAA;AAAA,EAEN,KAAKA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAC5B,QAAQ,OAAO,SAAS;AAAA;AAAA,EAExB,OAAOA,GAAE,WAAW,CAAC,MAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,IAAI,KAAK,SAAY,GAAIA,GAAE,OAAO,EAAE,SAAS,CAAC;AAAA,EAChH,aAAaA,GAAE,KAAK,CAAC,QAAQ,QAAQ,KAAK,CAAC,EAAE,SAAS;AAAA;AAAA,EAEtD,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC,EACA,OAAO;AAIV,IAAM,oBAAoB,CAAC,MAAwB;AACjD,MAAI,CAAC,KAAK,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,KAAK,OAAQ,EAA4B,YAAY;AACrG,WAAO;AACT,QAAM,EAAE,SAAS,SAAS,GAAG,MAAM,IAAI;AACvC,SAAO;AACT;AAEA,IAAM,cAAcA,GACjB,OAAO;AAAA,EACN,aAAaA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA;AAAA,EAEpC,MAAMA,GAAE;AAAA,IACN,CAAC,MACC,OAAO,MAAM,WACT,IACA,UAAU,KAAK,EAAE,KAAK,CAAC,IACrB,UACA,cAAc,KAAK,EAAE,KAAK,CAAC,IACzB,iBACA,qBAAqB,KAAK,EAAE,KAAK,CAAC,IAChC,aACA;AAAA,IACZA,GAAE,KAAK,CAAC,SAAS,YAAY,cAAc,CAAC;AAAA,EAC9C;AAAA;AAAA,EAEA,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAC9B,CAAC,EACA,OAAO;AACV,IAAM,QAAQA,GAAE,WAAW,mBAAmB,WAAW;AAGzD,IAAM,QAAQA,GACX,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,QAAQA,GAAE,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA;AAAA,EAEnD,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,QAAQD,KAAI,SAAS;AAAA,EACrB,KAAKA,KAAI,SAAS;AAAA,EAClB,QAAQA,KAAI,SAAS;AAAA,EACrB,KAAKA,KAAI,SAAS;AAAA,EAClB,SAASC,GAAE,MAAMD,IAAG,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC,EACA,OAAO;AAIV,IAAM,WAAWC,GACd,OAAO,EAAE,QAAQA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAKD,KAAI,SAAS,EAAE,CAAC,EAChG,OAAO;AAGV,IAAM,YAAYC,GAAE,OAAO,EAAE,QAAQA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO;AAQ7G,IAAM,kBAAkBA,GACrB,OAAO;AAAA,EACN,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA;AAAA,EAE7B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,MAAMA,GACH,OAAO,EACP,MAAM,4CAA4C,uCAAuC,EACzF,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMZ,MAAMA,GAAE,KAAK,CAAC,WAAW,SAAS,iBAAiB,CAAC,EAAE,SAAS;AACjE,CAAC,EACA,OAAO;AASH,IAAM,uBAAuB,CAAC,YAAY,UAAU,QAAQ,OAAO;AAU1E,IAAM,oBAAoB,CAAC,QAAQ,SAAS,OAAO;AAQnD,IAAM,iBAAiB,CAAC,QAAQ,WAAW,YAAY;AAGvD,IAAM,WAA+D;AAAA,EACnE,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AACd;AAGA,IAAM,OAAO,CAAC,MAAyB,OAAO,MAAM,WAAW,EAAE,KAAK,EAAE,YAAY,IAAI;AAGjF,IAAM,kBAAkB,CAAC,MAAwB;AACtD,MAAI,CAAC,KAAK,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,KAAK,UAAU,EAAG,QAAO;AAC3E,QAAM,WAAW,KAAM,EAA6B,QAAQ;AAC5D,QAAM,OAAO,eAAe,KAAK,CAAC,MAAM,MAAM,QAAQ;AACtD,SAAO,OAAO,EAAE,GAAG,GAAG,MAAM,SAAS,IAAI,EAAE,IAAI;AACjD;AAGO,IAAM,sBAAsB;AAAA;AAAA,EAEjC,SAASA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA;AAAA,EAEhC,KAAKA,GAAE,WAAW,MAAMA,GAAE,KAAK,iBAAiB,EAAE,SAAS,CAAC;AAAA;AAAA,EAE5D,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE3B,MAAMA,GAAE,KAAK,CAAC,QAAQ,SAAS,SAAS,CAAC;AAAA;AAAA,EAEzC,UAAUA,GAAE,WAAW,MAAMA,GAAE,KAAK,cAAc,EAAE,SAAS,CAAC;AAAA;AAAA,EAE9D,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE1B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAC5B;AAGA,IAAM,cAAcA,GAAE,WAAW,iBAAiBA,GAAE,OAAO,mBAAmB,EAAE,OAAO,CAAC;AAIjF,SAAS,WAAW,GAAoE;AAC7F,MAAI,EAAE,SAAU,QAAO,EAAE;AACzB,MAAI,EAAE,SAAS,OAAQ,QAAO;AAC9B,SAAO,EAAE,SAAS,WAAW,EAAE,MAAM,KAAK,IAAI,YAAY;AAC5D;AAEA,IAAM,aAAkE;AAAA,EACtE,MAAM,CAAC,YAAY,iCAAiC,OAAO;AAAA,EAC3D,OAAO,CAAC,YAAY,eAAe,OAAO;AAAA,EAC1C,OAAO,CAAC,YAAY,eAAe,OAAO;AAC5C;AAEA,IAAM,YAA4C,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE;AAMhF,IAAM,eAAe;AAGrB,IAAM,gBAAgB,CAAC,YAA6B,aAAa,KAAK,OAAO;AAG7E,SAAS,YAAY,SAAqD,UAAmC;AAC3G,MAAI,UAAU,UAAU,YAAa,QAAO,CAAC;AAC7C,SAAO,QAAQ,aACZ,OAAO,CAAC,MAAM,EAAE,QAAQ,UAAU,WAAW,CAAC,MAAM,gBAAgB,cAAc,EAAE,OAAO,CAAC,EAC5F;AAAA,IACC,CAAC,MACC,iCAAiC,EAAE,OAAO,yDAAyD,SAAS,MAAM,KAAK,SAAS,GAAG,MAAM,EAAE;AAAA,EAC/I;AACJ;AAQO,SAAS,aAAa,SAAqD,UAAmC;AACnH,SAAO,CAAC,GAAG,kBAAkB,OAAO,GAAG,GAAG,YAAY,SAAS,QAAQ,CAAC;AAC1E;AAEA,SAAS,kBAAkB,SAA+D;AACxF,SAAO,QAAQ,aACZ,OAAO,CAAC,MAAM,WAAW,CAAC,MAAM,gBAAiB,EAAE,SAAS,aAAa,CAAC,EAAE,MAAM,KAAK,CAAE,EACzF,KAAK,CAAC,GAAG,MAAM,UAAU,EAAE,OAAO,OAAO,IAAI,UAAU,EAAE,OAAO,OAAO,CAAC,EACxE;AAAA,IACC,CAAC,MACC,GAAG,WAAW,EAAE,OAAO,OAAO,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,sBAAsB,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE;AAAA,EAC9G;AACJ;AAMO,IAAM,UAAU,CAAC,MACtB,EAAE,QAAQ,UAAU,EAAE,QAAQ;AAQhC,IAAM,UAAUA,GACb,OAAO;AAAA,EACN,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACrC,aAAaA,GACV,OAAO;AAAA,IACN,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC/B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,CAAC,EACA,OAAO,EACP,QAAQ,CAAC,CAAC;AAAA,EACb,cAAcA,GAAE,MAAM,WAAW,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC7C,SAASA,GAAE,KAAK,CAAC,OAAO,SAAS,QAAQ,CAAC;AAAA;AAAA,EAE1C,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMnC,OAAOA,GAAE,KAAK,oBAAoB,EAAE,SAAS;AAAA;AAAA,EAE7C,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC,EACA,OAAO;AAGH,IAAM,eAAeA,GACzB,OAAO;AAAA,EACN,QAAQA,GAAE,KAAK,eAAe;AAAA,EAC9B,QAAQ,OAAO,SAAS;AAAA;AAAA,EAExB,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAMA,GAAE,MAAM,UAAU,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,OAAO;AAAA,EACP,OAAO,MAAM,SAAS;AAAA,EACtB,QAAQA,GAAE,MAAM,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,YAAYA,GAAE,MAAM,WAAW,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAE3C,MAAMA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC/B,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAEnC,oBAAoBA,GAAE,MAAM,eAAe,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvD,YAAYA,GAAE;AAAA,IACZ,CAAC,MAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,MAAO,KAAK,OAAO,MAAM,YAAY,UAAU,IAAI,EAAE,OAAO,CAAE,IAAI;AAAA,IACpGA,GAAE,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC9C;AAAA;AAAA,EAEA,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAEtC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAE/B,WAAWA,GAAE,WAAW,CAAC,MAAM;AAC7B,UAAM,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI;AACrE,WAAO,MAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAE,IAAI;AAAA,EAC9F,GAAGA,GAAE,MAAM,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;AAAA;AAAA,EAEjC,SAAS,QAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,gBAAgBA,GAAE,KAAK,CAAC,UAAU,UAAU,CAAC,EAAE,SAAS;AAAA;AAAA,EAExD,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjC,QAAQ,oBAAoB,SAAS;AAAA;AAAA,EAErC,SAASA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3C,OAAOA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAKA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,EAE9G,QAAQA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,WAAWA,GAAE,QAAQ,EAAE,SAAS;AAAA,EAChC,OAAOA,GAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC,EACA,OAAO;AAIH,SAAS,gBAAgB,WAA4C;AAC1E,SAAO,OAAO,UAAU,GAAG,YAAY,CAAC;AAC1C;AAGO,SAAS,SAAS,KAAuB;AAC9C,QAAM,SAAS,OAAO,OAAO,QAAQ,WAAY,IAA6B,SAAS;AACvF,SAAQ,gBAAuC,SAAS,MAAM;AAChE;AAOO,SAAS,uBAAuB,MAAwC;AAC7E,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC,WAAW,QAAQ,YAAY,SAAU,QAAO;AACrD,SAAO,QAAQ,UAAU,UAAa,QAAQ,UAAU,cAAc,QAAQ,UAAU;AAC1F;AAOO,SAAS,eACd,MAC8F;AAC9F,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC,WAAW,QAAQ,YAAY,SAAU,QAAO;AAGrD,QAAM,QAAQ,QAAQ,SAAS;AAC/B,MAAI,UAAU,QAAS,QAAO;AAC9B,QAAM,UAAU,UAAU,SAAS,QAAQ,aAAa,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,IAAI,QAAQ;AAElG,QAAM,SAAS,CAAC,MAAsB,EAAE,MAAM,KAAK,IAAI,GAAG,EAAE,KAAK,KAAK,CAAC,cAAc,EAAE,OAAO,YAAY,EAAE;AAC5G,QAAM,WAAW,QAAQ,IAAI,MAAM;AAEnC,QAAM,QAAQ,UAAU,WAAW,CAAC,IAAI,QAAQ,QAAQ,CAAC,MAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAE;AACpH,QAAM,EAAE,UAAU,MAAM,IAAI,QAAQ;AACpC,QAAM,OACJ,UAAU,aACN,CAAC,UAAU,KAAK,GAAG,OAAO,KAAK,IAAI,mBAAmB,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,IACpG;AACN,SAAO,EAAE,UAAU,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,GAAI,GAAI,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC,EAAG;AACvF;AAOO,SAAS,gBAAgB,MAAyC;AACvE,QAAM,UAAU,KAAK;AACrB,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,QAAM,WAAqB,CAAC;AAC5B,MAAI,QAAQ,YAAY,UAAU;AAChC,aAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,aAAW,WAAW,QAAQ,cAAc;AAC1C,QAAI,QAAQ,OAAO,KAAK,QAAQ,SAAS,aAAa,QAAQ,MAAM,KAAK,EAAG;AAC5E,aAAS;AAAA,MACP,IAAI,QAAQ,OAAO;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,cAAc;AAMb,SAAS,kBAAkB,MAAgD;AAChF,QAAM,WAAqB,CAAC;AAC5B,MAAI,KAAK,MAAM,YAAY,SAAS,WAAW,GAAG;AAChD,aAAS,KAAK,sFAAsF;AAAA,EACtG;AACA,QAAM,QAAQ,KAAK,KAAK,OAAO,CAAC,SAAS,KAAK,KAAK,SAAS,WAAW,CAAC;AACxE,MAAI,MAAM,SAAS,GAAG;AACpB,aAAS,KAAK,GAAG,MAAM,MAAM,+EAA+E;AAAA,EAC9G;AACA,SAAO;AACT;AAGA,IAAM,SAAS;AAEf,IAAM,SAAS;AAEf,IAAM,aAAa,CAAC,SAClB,KACG,UAAU,KAAK,EACf,QAAQ,WAAC,UAAM,IAAE,GAAE,EAAE,EACrB,YAAY,EACZ,QAAQ,wBAAwB,GAAG,EACnC,KAAK;AAQH,SAAS,kBAAkB,MAA+D;AAC/F,QAAM,OAAO,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,KAAK,UAAU,EAAE,IAAI,UAAU;AACjF,QAAM,QAAQ,CAAC,SAAiB;AAC9B,UAAM,OAAO,WAAW,IAAI;AAC5B,WAAO,KAAK,WAAW,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC;AAAA,EAC/D;AACA,QAAM,QAAQ,CAAC,KAAK,MAAM,aAAa,KAAK,MAAM,UAAU,EAAE,EAAE,KAAK,GAAG;AACxE,QAAM,SAAS,CAAC,GAAG,MAAM,SAAS,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAClH,QAAM,WAAW,MAAM,MAAM,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACxF,QAAM,SAAS,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;AACnD,MAAI,OAAO,WAAW,EAAG,QAAO,CAAC;AACjC,SAAO;AAAA,IACL,sCAAsC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,EAC9E;AACF;AAGA,IAAM,eAAiD;AAAA,EACrD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,QAAQ;AACV;AAGO,IAAM,mBAAmB,uBAAuB,CAAC,QAAQ,UAAU,QAAQ,EAAE,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAMnH,SAAS,gBAAgB,GAAoB;AAClD,MAAI,EAAE,aAAaA,GAAE,UAAW,QAAO,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAChF,QAAM,QAAQ,oBAAI,IAAsB;AACxC,aAAW,SAAS,EAAE,QAAQ;AAC5B,UAAM,CAACC,QAAO,OAAO,GAAG,IAAI,MAAM;AAClC,UAAM,KACJ,OAAO,UAAU,WAAW,GAAG,OAAOA,MAAK,CAAC,IAAI,KAAK,MAAM,MAAM,KAAK,IAAI,MAAM,EAAE,KAAK,GAAG,KAAK;AACjG,UAAM,OACJ,MAAM,SAAS,sBACX,YAAY,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,KACtD,QAAQ,UAAa,OAAO,UAAU,WACpC,IAAI,OAAO,GAAG,CAAC,KAAK,MAAM,QAAQ,QAAQ,oBAAoB,EAAE,CAAC,KACjE,MAAM,QAAQ,QAAQ,oBAAoB,EAAE;AACpD,UAAM,IAAI,IAAI,CAAC,GAAI,MAAM,IAAI,EAAE,KAAK,CAAC,GAAI,IAAI,CAAC;AAAA,EAChD;AACA,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI,CAAC,MAAM,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,aAAa,CAAC,CAAC;AACvG,SAAO;AAAA,IACL,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7E,GAAG,OAAO,IAAI,CAAC,MAAM,UAAU,aAAa,CAAC,CAAC,EAAE;AAAA,EAClD,EAAE,KAAK,IAAI;AACb;AAQO,SAAS,WAAW,KAAsB;AAC/C,MAAI,SAAS,GAAG,EAAG,QAAO,aAAa,MAAM,GAAG;AAChD,QAAM,aAAc,KAAyD,WAAW;AACxF,SAAO,oBAAoB,KAAK,EAAE,OAAO,OAAO,eAAe,WAAW,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC;AAC/F;AAGO,IAAM,gBACX;AAMK,IAAM,cAAc,IAAI;AAAA,EAC7B,GAAG,cAAc,MAAM;AAAA,EACvB;AACF;AAMA,IAAM,gBACJ;AAGF,IAAM,aAAa,CAAC,SAClB,KAAK,IAAI,KAAK,KAAK,cAAc,KAAK,GAAG,KAAK,YAAY,EAAE,IAAI,KAAK,QAAQ,EAAE,EAAE,IAAI,CAAC;AAMxF,IAAM,cAAc,CAAC,SAA8B;AACjD,QAAM,UAAU,WAAW,IAAI;AAC/B,SAAO,CAAC,WAAW,YAAY,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,EAAE,IAAI,KAAK,YAAY,EAAE,EAAE;AAC5F;AAUO,SAAS,sBAAsB,MAAsB;AAC1D,QAAM,WAAW,CAAC,SAAqB,KAAK,cAAc,cAAc,YAAY,IAAI;AACxF,MAAI,CAAC,KAAK,KAAK,KAAK,QAAQ,EAAG,QAAO;AACtC,QAAM,OAAO,KAAK,KAAK,IAAI,CAAC,SAAqB;AAC/C,QAAI,CAAC,SAAS,IAAI,EAAG,QAAO;AAC5B,UAAM,EAAE,IAAI,MAAM,OAAO,UAAU,GAAG,KAAK,IAAI;AAC/C,UAAM,OAAO,aAAa,KAAK,QAAQ,EAAE,KAAK;AAC9C,WAAO,EAAE,GAAG,MAAM,WAAW,YAAY,GAAI,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC,EAAG;AAAA,EAC/E,CAAC;AACD,SAAO,EAAE,GAAG,MAAM,KAAK;AACzB;AAGO,SAAS,eAAe,MAA0D;AACvF,MAAI,KAAK,MAAM,SAAS,SAAS;AAC/B,WAAO,KAAK,WAAW,KAAK,CAAC,MAAM,EAAE,GAAG,WAAW,SAAS,CAAC,IAAI,iBAAiB;AAAA,EACpF;AACA,SAAO,KAAK,MAAM;AACpB;AAKA,IAAM,iBACJ;AACF,IAAM,YAAY;AAQX,SAAS,UAAU,MAAe,QAA2B,CAAC,GAAW;AAC9E,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,MAAI,MAAM,KAAK,QAAQ,WAAW,EAAE;AACpC,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,KAAK,QAAQ,UAAU,EAAE,EAAE,KAAK;AAC7C,QAAI,KAAK,SAAS,EAAG;AACrB,UAAM,IAAI,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,uBAAuB,MAAM,CAAC,4BAAiB,IAAI,GAAG,EAAE;AAAA,EAC1G;AACA,QAAM,OAAO,CAACC,UACZA,MACG,MAAM,WAAW,EACjB,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,KAAK,CAAC,eAAe,KAAK,CAAC,CAAC;AAG/C,QAAM,IAAI,QAAQ,kCAAkC,CAAC,IAAI,OAAe,SAAiB;AACvF,UAAM,QAAQ,KAAK,KAAK,EACrB,KAAK,GAAG,EACR,QAAQ,YAAY,EAAE;AACzB,QAAI,CAAC,MAAO,QAAO,OAAO,GAAG,IAAI,MAAM;AACvC,WAAO,KAAK,KAAK,GAAG,QAAQ,SAAS,MAAM,OAAO,GAAG;AAAA,EACvD,CAAC;AACD,QAAM,UAAU,KAAK,IAAI,QAAQ,SAAS,GAAG,CAAC;AAC9C,SAAO,QACJ,KAAK,GAAG,EACR,QAAQ,eAAe,IAAI,EAC3B,QAAQ,YAAY,EAAE,EACtB,QAAQ,WAAW,GAAG,EACtB,KAAK;AACV;AAMA,IAAM,MAAM,CAAC,MAAoC,OAAO,MAAM,YAAY,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI;AAChG,IAAM,UAAU,CAAC,MACf,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAkB,QAAQ,CAAC,KAAK,OAAO,MAAM,QAAQ,IAAI,CAAC;AACzF,IAAM,iBAAiB,CAAC,MAAmC;AACzD,QAAM,SAASH,KAAI,UAAU,CAAC;AAC9B,SAAO,OAAO,UAAU,OAAO,OAAO;AACxC;AAGA,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,UAAU,WAAmD;AACpE,QAAM,QAAQ,WAAW,YAAY,KAAK;AAC1C,SAAO,SAAS,KAAK,CAAC,MAAM,MAAM,SAAS,CAAC,CAAC;AAC/C;AAEA,IAAM,kBAA0C;AAAA,EAC9C,WAAW;AAAA,EACX,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,WAAW;AACb;AAEA,SAAS,YAAY,OAAkC;AACrD,QAAM,IAAI,IAAI,MAAM,SAAS,GAAG,YAAY;AAC5C,MAAI,CAAC,KAAK,MAAM,QAAS,QAAO;AAChC,QAAM,MAAM,OAAO,KAAK,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAClE,SAAO,MAAM,gBAAgB,GAAG,IAAI;AACtC;AAGA,IAAM,QAAQ,CAAmB,KAAQ,UACtC,QAAQ,EAAE,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC;AAE/B,SAAS,WAAW,OAAc,MAAc,OAAsC;AACpF,QAAM,YAAY,IAAI,MAAM,SAAS;AACrC,QAAM,SAAS,EAAE,MAAM,GAAG,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,GAAG,GAAG,MAAM,YAAY,UAAU,WAAW,KAAK,CAAC,EAAE;AAC5G,QAAM,YAAY,YAAY,KAAK;AACnC,MAAI,CAAC,UAAU,KAAK,EAAG,QAAO,EAAE,GAAG,QAAQ,WAAW,YAAY,GAAG,MAAM,QAAQ,SAAS,EAAE;AAC9F,QAAM,YAAY,CAAC,UAAU,MAAM,sBAAsB,KAAK,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AACrG,QAAM,UAAU,UAAU,SAAS;AACnC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,IACX,GAAG,MAAM,MAAM,WAAW,OAAO,OAAO,EAAE;AAAA,IAC1C,GAAG,MAAM,QAAQ,SAAS;AAAA,EAC5B;AACF;AAEA,SAAS,kBAAkB,IAAW,OAAwC;AAC5E,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,QAAQ,GAAG,YAAY,EAAE,QAAQ,CAAC,UAAU;AACjD,UAAM,OAAO,IAAI,MAAM,IAAI;AAC3B,QAAI,CAAC,QAAQ,IAAI,MAAM,IAAI,GAAG,YAAY,MAAM,UAAU,KAAK,IAAI,IAAI,EAAG,QAAO,CAAC;AAClF,SAAK,IAAI,IAAI;AACb,WAAO,CAAC,WAAW,OAAO,MAAM,KAAK,CAAC;AAAA,EACxC,CAAC;AACH;AAEA,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAGxB,SAAS,gBAAgB,YAAoB,OAAyD;AACpG,MAAI,eAAe,SAAU,QAAO,EAAE,MAAM,YAAY,QAAQ,SAAS;AACzE,MAAI,eAAe,eAAgB,QAAO,EAAE,MAAM,QAAQ,QAAQ,QAAQ;AAC1E,QAAM,WAAW,GAAG,IAAI,MAAM,QAAQ,KAAK,EAAE,IAAI,IAAI,MAAM,SAAS,KAAK,EAAE;AAC3E,MAAI,gBAAgB,KAAK,QAAQ,KAAK,IAAI,MAAM,UAAU,EAAG,QAAO,EAAE,MAAM,YAAY,QAAQ,SAAS;AACzG,MAAI,iBAAiB,KAAK,IAAI,MAAM,QAAQ,KAAK,EAAE,EAAG,QAAO,EAAE,MAAM,WAAW,QAAQ,UAAU;AAClG,SAAO,EAAE,MAAM,QAAQ,QAAQ,OAAO;AACxC;AAOA,SAAS,wBAAwB,IAAW,OAAyC;AACnF,QAAM,WAAY,CAAC,UAAU,YAAY,cAAc,EACpD,QAAQ,CAAC,eAAe,QAAQ,GAAG,UAAU,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,MAAM,EAAE,CAAC,EACvF;AAAA,IACC,CAAC,EAAE,YAAY,MAAM,MACnB,IAAI,MAAM,eAAe,KACzB,EAAE,eAAe,kBAAkB,IAAI,MAAM,iBAAiB,MAAM;AAAA,EACxE;AACF,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,WAAW,SAAS,IAAI,CAAC,EAAE,YAAY,MAAM,MAAmB;AACpE,UAAM,EAAE,MAAM,OAAO,IAAI,gBAAgB,YAAY,KAAK;AAC1D,UAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK;AACxC,aAAS,IAAI,QAAQ,CAAC;AACtB,UAAMI,aAAY,MAAM,eAAe,MAAM,6BAA6B,MAAM;AAChF,UAAM,OAAO,UAAUA,YAAW,KAAK,KAAK,OAAO,SAAS,aAAa,YAAY,IAAI;AACzF,WAAO,EAAE,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,MAAM,MAAM,WAAW,MAAM,IAAI,MAAM,eAAe,CAAC,IAAI,IAAI,GAAG,KAAK;AAAA,EACxG,CAAC;AAGD,QAAM,YAAY,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC,UAAyB;AACvE,UAAM,OAAO,UAAU,MAAM,aAAa,KAAK;AAC/C,QAAI,IAAI,MAAM,eAAe,KAAK,CAAC,QAAQ,gBAAgB,YAAY,KAAK,EAAE,SAAS,UAAW,QAAO,CAAC;AAC1G,UAAM,KAAK,SAAS,IAAI,SAAS,KAAK,KAAK;AAC3C,aAAS,IAAI,WAAW,CAAC;AACzB,WAAO,CAAC,EAAE,IAAI,WAAW,CAAC,IAAI,MAAM,WAAW,KAAK,CAAC;AAAA,EACvD,CAAC;AACD,SAAO,CAAC,GAAG,UAAU,GAAG,SAAS;AACnC;AAGA,SAAS,eAAe,IAAW,OAA8C;AAC/E,QAAM,MAAM,QAAQ,GAAG,YAAY,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,iBAAiB,MAAM,kBAAkB;AAChG,SAAO,UAAU,KAAK,WAAW,KAAK,KAAK;AAC7C;AAGA,IAAM,wBAAwB,oBAAI,IAAI,CAAC,WAAW,SAAS,CAAC;AAO5D,SAAS,wBAAwB,IAAW,OAA0B,YAAoC;AACxG,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AACjE,SAAO,QAAQ,GAAG,YAAY,EAAE,QAAQ,CAAC,UAAU;AACjD,UAAM,OAAO,IAAI,MAAM,UAAU;AACjC,UAAM,OAAO,IAAI,MAAM,iBAAiB,GAAG,YAAY;AACvD,QAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,YAAY,CAAC,EAAG,QAAO,CAAC;AACpG,UAAM,QAAQ,IAAI,MAAM,eAAe;AACvC,UAAM,OAAO,QAAQ,WAAW,MAAM,KAAK,IAAI,IAAI,IAAI;AACvD,UAAM,OAAO,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,GAAG,KAAK;AAClE,WAAO,CAAC,EAAE,MAAM,GAAG,MAAM,QAAQ,UAAU,MAAM,oBAAoB,KAAK,CAAC,GAAG,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG,CAAC;AAAA,EAC3G,CAAC;AACH;AAEA,IAAM,MAAM,CAAC,IAAW,QAAwB,GAAG,GAAG,KAAK,OAAO,GAAG,GAAG,MAAM,WAAY,GAAG,GAAG,IAAc,CAAC;AAE/G,SAAS,OAAO,IAA4B;AAC1C,QAAM,SAAS,IAAI,IAAI,IAAI,MAAM,EAAE,MAAM,GAAG,YAAY,KAAK;AAC7D,MAAI,OAAO,SAAS,OAAO,EAAG,QAAO;AACrC,SAAO,2BAA2B,KAAK,MAAM,IAAI,iBAAiB;AACpE;AAEA,SAAS,mBAAmB,IAAW,OAAkC;AACvE,QAAM,cAAc,IAAI,IAAI,aAAa;AACzC,QAAM,UAAU,UAAU,IAAI,IAAI,aAAa,EAAE,SAAS,KAAK;AAC/D,QAAM,UAAU,UAAU,YAAY,SAAS,KAAK;AACpD,QAAM,SAAS;AAAA,IACb,GAAG,QAAQ,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,UAAU,EAAE,aAAa,KAAK,CAAC;AAAA,IAClE,UAAU,YAAY,qBAAqB,KAAK;AAAA,EAClD,EAAE,OAAO,OAAO;AAChB,QAAM,QAAQ,CAAC,SAAS,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,OAAO;AAC7D,QAAM,UAAU,OAAO,SAAS,IAAI,iBAAiB,OAAO,KAAK,IAAI,CAAC,KAAK;AAC3E,SAAO,CAAC,OAAO,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,KAAK;AACxD;AAGA,SAAS,UAAU,IAAW,OAAkC;AAC9D,QAAM,SAAS,IAAI,IAAI,QAAQ;AAC/B,QAAM,WAAW,IAAI,IAAI,UAAU;AACnC,QAAM,SAAS,QAAQ,SAAS,OAAO,EAAE,CAAC;AAC1C,QAAM,YAAY,SAAS,IAAI,OAAO,SAAS,IAAI;AACnD,QAAM,QAAQ,SACV;AAAA,IACE,CAAC,IAAI,OAAO,OAAO,GAAG,IAAI,OAAO,IAAI,GAAG,SAAS,aAAa,YAAY,SAAS,EAAE,EAClF,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACX;AAAA,EACF,IACA;AACJ,QAAM,QAAQ,IAAI,IAAI,IAAI,iBAAiB,EAAE,KAAK;AAClD,SAAO;AAAA,IACL,UAAU,OAAO,SAAS,KAAK;AAAA,IAC/B,UAAU,OAAO,WAAW,KAAK;AAAA,IACjC,UAAU,IAAI,IAAI,aAAa,EAAE,eAAe,KAAK;AAAA,IACrD,UAAU,OAAO,eAAe,OAAO,wBAAwB,KAAK;AAAA,IACpE;AAAA,IACA,UAAU,SAAS,qBAAqB,KAAK;AAAA,IAC7C,SAAS,UAAU,SAAS,GAAG,UAAU,KAAK,CAAC,WAAW;AAAA,EAC5D,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AACd;AAEA,SAAS,mBAAmB,IAAW,OAAmC;AACxE,QAAM,OAAO,OAAO,EAAE;AACtB,QAAM,WAAW,IAAI,IAAI,OAAO,EAAE;AAClC,QAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI,SAAS,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,EAAE,KAAK,IAAI,IAAI;AAC/G,SAAO;AAAA,IACL,aAAa,mBAAmB,IAAI,KAAK;AAAA,IACzC;AAAA,IACA,GAAG,MAAM,WAAW,SAAS,UAAU,UAAU,IAAI,KAAK,IAAI,MAAS;AAAA,IACvE,GAAG,MAAM,QAAQ,IAAI;AAAA,IACrB,GAAG,MAAM,UAAU,UAAU,IAAI,IAAI,aAAa,EAAE,aAAa,KAAK,CAAC;AAAA,EACzE;AACF;AAGA,SAAS,oBAAoB,IAAW,OAAwC;AAC9E,QAAM,UAAU,QAAS,GAAG,OAA6B,OAAO;AAChE,SAAO,QAAQ,QAAQ,CAAC,MAAM;AAC5B,UAAM,SAAS,UAAU,EAAE,OAAO,KAAK;AACvC,UAAM,OAAO,UAAU,EAAE,MAAM,KAAK;AACpC,UAAM,MAAM,eAAe,EAAE,GAAG;AAChC,WAAO,UAAU,OAAO,CAAC,EAAE,QAAQ,MAAM,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC,EAAG,CAAC,IAAI,CAAC;AAAA,EACzE,CAAC;AACH;AAOA,SAAS,kBAAkB,IAA+B;AACxD,QAAM,QAAQ,QAAQ,GAAG,KAAK;AAC9B,QAAM,OAAO,MAAM,KAAK,CAAC,MAAM,YAAY,KAAK,IAAI,EAAE,QAAQ,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;AAClF,QAAM,OAAO,UAAU,MAAM,cAAc;AAC3C,QAAM,SAAS,UAAU,MAAM,YAAY;AAC3C,MAAI,CAAC,QAAQ,CAAC,OAAQ,QAAO;AAC7B,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,KAAK,IAAI,cAAc,MAAM,KAAK,KAAK,IAAI;AAC7D;AAEA,SAAS,mBAAmB,IAAgC;AAC1D,QAAM,IAAI,GAAG;AACb,QAAM,WAAW,IAAI,GAAG,QAAQ,KAAK,kBAAkB,EAAE;AACzD,MAAI,CAAC,KAAK,OAAO,MAAM,SAAU,QAAO,WAAW,EAAE,UAAU,SAAS,CAAC,EAAE,IAAI;AAC/E,QAAM,UAAU,MAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,QAAQ,IAAI,cAAc,EAAE,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC,IAAI,CAAC;AACnH,QAAM,QAAQ,OAAO;AAAA,IAClB,CAAC,UAAU,OAAO,UAAU,KAAK,EAAY,QAAQ,CAAC,MAAM;AAC3D,YAAM,MAAM,eAAe,EAAE,CAAC,CAAC;AAC/B,aAAO,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;AAAA,IAC7B,CAAC;AAAA,EACH;AACA,QAAM,OAAO,IAAI,EAAE,IAAI;AACvB,SAAO,EAAE,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,GAAI,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC,GAAI,GAAG,OAAO,QAAQ;AAC3F;AAQO,SAAS,oBACd,KACA,OAAwE,CAAC,GACjE;AACR,QAAM,KAAM,OAAO,OAAO,QAAQ,WAAW,MAAM,CAAC;AACpD,QAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAM,SAAU,GAAG,aAAa,CAAC;AACjC,QAAM,QAAQ,mBAAmB,EAAE;AACnC,QAAM,UAAU,IAAI,OAAO,eAAe;AAC1C,QAAM,SAAS,OAAO,UAAU,GAAG,MAAM;AACzC,QAAM,aAAa,wBAAwB,IAAI,KAAK;AACpD,QAAM,WAAW,KAAK,aAAa,GAAG,mBAAmB,WAAW,WAAW;AAC/E,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,GAAI,OAAO,UAAU,EAAE,QAAQ,OAAO,KAAK,IAAI,CAAC;AAAA,IAChD,GAAI,UAAU,EAAE,SAAS,UAAU,SAAS,KAAK,EAAE,IAAI,CAAC;AAAA,IACxD,MAAM,kBAAkB,IAAI,KAAK;AAAA,IACjC,OAAO,mBAAmB,IAAI,KAAK;AAAA,IACnC,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,QAAQ,oBAAoB,IAAI,KAAK;AAAA,IACrC;AAAA,IACA,MAAM,GAAG,SAAS,QAAQ,QAAQ,aAAa,WAAW,eAAe,EAAE,IAAI;AAAA,IAC/E,oBAAoB,wBAAwB,IAAI,OAAO,UAAU;AAAA,IACjE,YAAY,CAAC;AAAA,IACb,GAAG,MAAM,iBAAiB,eAAe,IAAI,KAAK,CAAC;AAAA,IACnD,WAAW,kBAAkB,EAAE,EAAE,QAAQ,CAAC,MAAM;AAC9C,YAAM,SAAS,UAAU,EAAE,QAAQ,KAAK;AACxC,YAAM,MAAM,EAAE,eAAe,UAAU,EAAE,cAAc,KAAK,IAAI;AAChE,aAAO,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,gBAAgB,GAAG,EAAE,CAAC,IAAI,CAAC;AAAA,IACjE,CAAC;AAAA,IACD,GAAI,GAAG,cAAc,SAAY,EAAE,WAAW,GAAG,UAAU,IAAI,CAAC;AAAA,EAClE;AACF;AAGO,SAAS,mBAA4B;AAC1C,SAAOH,GAAE,aAAa,cAAc,EAAE,IAAI,SAAS,iBAAiB,MAAM,CAAC;AAC7E;","names":["entries","z","z","z","sub","Hex","z","field","text","described"]}
|