[{"data":1,"prerenderedAt":9020},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fauth-h3client":64,"navigation":217,"navLinks_footer":829,"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware_page":842,"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware_surround":5315,"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware":5318},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":20,"path":22,"stem":70,"children":71},"docs\u002Fauth-h3client\u002Findex",[72,73,82,119,145,167,170,191,195],{"title":20,"path":22,"stem":70},{"title":14,"path":74,"stem":75,"children":76},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[77,78],{"title":14,"path":74,"stem":75},{"title":79,"path":80,"stem":81},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":83,"path":84,"stem":85,"children":86},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[87,88,92,96,100,104,108,111,115],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":93,"path":94,"stem":95},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":97,"path":98,"stem":99},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":101,"path":102,"stem":103},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":105,"path":106,"stem":107},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":109,"stem":110},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":112,"path":113,"stem":114},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":116,"path":117,"stem":118},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":120,"path":121,"stem":122,"children":123},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[124,125,129,133,137,141],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":130,"path":131,"stem":132},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":134,"path":135,"stem":136},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":138,"path":139,"stem":140},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":142,"path":143,"stem":144},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":146,"path":147,"stem":148,"children":149},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[150,151,155,159,163],{"title":146,"path":147,"stem":148},{"title":152,"path":153,"stem":154},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":156,"path":157,"stem":158},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":160,"path":161,"stem":162},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":164,"path":165,"stem":166},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":168,"stem":169},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":171,"path":172,"stem":173,"children":174,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[175,179,183,187],{"title":176,"path":177,"stem":178},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":180,"path":181,"stem":182},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":184,"path":185,"stem":186},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":188,"path":189,"stem":190},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":192,"path":193,"stem":194},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":196,"path":197,"stem":198,"children":199},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[200,201,205,209,213],{"title":196,"path":197,"stem":198},{"title":202,"path":203,"stem":204},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":206,"path":207,"stem":208},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":210,"path":211,"stem":212},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":214,"path":215,"stem":216},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",[218],{"title":9,"path":66,"stem":67,"children":219,"page":53},[220,268,386,391,569,636],{"title":20,"path":22,"stem":70,"children":221},[222,223,227,238,246,253,254,260,261],{"title":20,"path":22,"stem":70},{"title":14,"path":74,"stem":75,"children":224},[225,226],{"title":14,"path":74,"stem":75},{"title":79,"path":80,"stem":81},{"title":83,"path":84,"stem":85,"children":228},[229,230,231,232,233,234,235,236,237],{"title":83,"path":84,"stem":85},{"title":89,"path":90,"stem":91},{"title":93,"path":94,"stem":95},{"title":97,"path":98,"stem":99},{"title":101,"path":102,"stem":103},{"title":105,"path":106,"stem":107},{"title":33,"path":109,"stem":110},{"title":112,"path":113,"stem":114},{"title":116,"path":117,"stem":118},{"title":120,"path":121,"stem":122,"children":239},[240,241,242,243,244,245],{"title":120,"path":121,"stem":122},{"title":126,"path":127,"stem":128},{"title":130,"path":131,"stem":132},{"title":134,"path":135,"stem":136},{"title":138,"path":139,"stem":140},{"title":142,"path":143,"stem":144},{"title":146,"path":147,"stem":148,"children":247},[248,249,250,251,252],{"title":146,"path":147,"stem":148},{"title":152,"path":153,"stem":154},{"title":156,"path":157,"stem":158},{"title":160,"path":161,"stem":162},{"title":164,"path":165,"stem":166},{"title":38,"path":168,"stem":169},{"title":171,"path":172,"stem":173,"children":255,"page":53},[256,257,258,259],{"title":176,"path":177,"stem":178},{"title":180,"path":181,"stem":182},{"title":184,"path":185,"stem":186},{"title":188,"path":189,"stem":190},{"title":192,"path":193,"stem":194},{"title":196,"path":197,"stem":198,"children":262},[263,264,265,266,267],{"title":196,"path":197,"stem":198},{"title":202,"path":203,"stem":204},{"title":206,"path":207,"stem":208},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":269,"path":35,"stem":270,"children":271},"Bot Detector","docs\u002Fbot-detection\u002Findex",[272,273,276,280,284,303,377,380,383],{"title":269,"path":35,"stem":270},{"title":14,"path":274,"stem":275},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":277,"path":278,"stem":279},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":281,"path":282,"stem":283},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":171,"path":285,"stem":286,"children":287,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[288,292,296,299],{"title":289,"path":290,"stem":291},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":293,"path":294,"stem":295},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":116,"path":297,"stem":298},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":300,"path":301,"stem":302},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":304,"path":305,"stem":306,"children":307},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[308,309,313,317,321,325,329,333,337,341,345,349,353,357,361,365,369,373],{"title":304,"path":305,"stem":306},{"title":310,"path":311,"stem":312},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":314,"path":315,"stem":316},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":318,"path":319,"stem":320},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":322,"path":323,"stem":324},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":326,"path":327,"stem":328},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":330,"path":331,"stem":332},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":334,"path":335,"stem":336},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":338,"path":339,"stem":340},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":342,"path":343,"stem":344},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":346,"path":347,"stem":348},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":350,"path":351,"stem":352},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":354,"path":355,"stem":356},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":358,"path":359,"stem":360},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":362,"path":363,"stem":364},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":366,"path":367,"stem":368},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":370,"path":371,"stem":372},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":374,"path":375,"stem":376},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":378,"stem":379},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":196,"path":381,"stem":382},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":192,"path":384,"stem":385},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":387,"path":11,"stem":388,"children":389},"Introduction","docs\u002Fgetting-started\u002Findex",[390],{"title":387,"path":11,"stem":388},{"title":27,"path":29,"stem":392,"children":393},"docs\u002Fiam\u002Findex",[394,395,398,533,536,552,555],{"title":27,"path":29,"stem":392},{"title":14,"path":396,"stem":397},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":83,"path":399,"stem":400,"children":401},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[402,403,407,411,415,419,423,427,431,435,439,443,446,450,454,458,462,465,469,473,476,480,483],{"title":83,"path":399,"stem":400},{"title":404,"path":405,"stem":406},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":408,"path":409,"stem":410},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":412,"path":413,"stem":414},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":416,"path":417,"stem":418},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":420,"path":421,"stem":422},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":424,"path":425,"stem":426},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":428,"path":429,"stem":430},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":432,"path":433,"stem":434},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":436,"path":437,"stem":438},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":440,"path":441,"stem":442},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":120,"path":444,"stem":445},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":447,"path":448,"stem":449},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":451,"path":452,"stem":453},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":455,"path":456,"stem":457},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":459,"path":460,"stem":461},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":116,"path":463,"stem":464},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":466,"path":467,"stem":468},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":470,"path":471,"stem":472},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":112,"path":474,"stem":475},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":477,"path":478,"stem":479},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":130,"path":481,"stem":482},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":484,"path":485,"stem":486,"children":487},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[488,489,493,497,527,530],{"title":484,"path":485,"stem":486},{"title":490,"path":491,"stem":492},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":494,"path":495,"stem":496},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":498,"path":499,"stem":500,"children":501},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[502,503,507,511,515,519,523],{"title":498,"path":499,"stem":500},{"title":504,"path":505,"stem":506},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":508,"path":509,"stem":510},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":512,"path":513,"stem":514},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":516,"path":517,"stem":518},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":520,"path":521,"stem":522},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":524,"path":525,"stem":526},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":466,"path":528,"stem":529},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":531,"stem":532},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":534,"stem":535},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":171,"path":537,"stem":538,"children":539,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[540,544,548],{"title":541,"path":542,"stem":543},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":545,"path":546,"stem":547},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":549,"path":550,"stem":551},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":192,"path":553,"stem":554},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":556,"path":557,"stem":558,"children":559,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[560,563,566],{"title":196,"path":561,"stem":562},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":206,"path":564,"stem":565},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":202,"path":567,"stem":568},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":570,"children":571},"docs\u002Fshield-base\u002Findex",[572,573,576,580,621,625,629,633],{"title":40,"path":42,"stem":570},{"title":14,"path":574,"stem":575},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":577,"path":578,"stem":579},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":281,"path":581,"stem":582,"children":583},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[584,585,589,593,597,601,605,609,613,617],{"title":281,"path":581,"stem":582},{"title":586,"path":587,"stem":588},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":590,"path":591,"stem":592},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":594,"path":595,"stem":596},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":598,"path":599,"stem":600},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":602,"path":603,"stem":604},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":606,"path":607,"stem":608},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":610,"path":611,"stem":612},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":614,"path":615,"stem":616},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":618,"path":619,"stem":620},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":622,"path":623,"stem":624},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":626,"path":627,"stem":628},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":630,"path":631,"stem":632},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":196,"path":634,"stem":635},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":214,"path":48,"stem":637,"children":638},"docs\u002Futils\u002Findex",[639,640,657,690,787],{"title":214,"path":48,"stem":637},{"title":641,"path":642,"stem":643,"children":644,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[645,649,653],{"title":646,"path":647,"stem":648},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":650,"path":651,"stem":652},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":654,"path":655,"stem":656},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":658,"path":659,"stem":660,"children":661,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[662,666,670,674,678,682,686],{"title":663,"path":664,"stem":665},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":667,"path":668,"stem":669},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":671,"path":672,"stem":673},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":675,"path":676,"stem":677},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":679,"path":680,"stem":681},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":683,"path":684,"stem":685},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":687,"path":688,"stem":689},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":691,"path":692,"stem":693,"children":694,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[695,699,703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783],{"title":696,"path":697,"stem":698},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":700,"path":701,"stem":702},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":704,"path":705,"stem":706},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":708,"path":709,"stem":710},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":712,"path":713,"stem":714},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":716,"path":717,"stem":718},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":720,"path":721,"stem":722},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":724,"path":725,"stem":726},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":728,"path":729,"stem":730},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":732,"path":733,"stem":734},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":736,"path":737,"stem":738},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":740,"path":741,"stem":742},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":744,"path":745,"stem":746},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":748,"path":749,"stem":750},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":752,"path":753,"stem":754},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":756,"path":757,"stem":758},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":760,"path":761,"stem":762},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":764,"path":765,"stem":766},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":768,"path":769,"stem":770},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":772,"path":773,"stem":774},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":776,"path":777,"stem":778},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":780,"path":781,"stem":782},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":784,"path":785,"stem":786},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":788,"path":789,"stem":790,"children":791},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[792,793,797,801,805,809,813,817,821,825],{"title":788,"path":789,"stem":790},{"title":794,"path":795,"stem":796},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":798,"path":799,"stem":800},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":802,"path":803,"stem":804},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":806,"path":807,"stem":808},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":810,"path":811,"stem":812},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":814,"path":815,"stem":816},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":818,"path":819,"stem":820},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":822,"path":823,"stem":824},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":826,"path":827,"stem":828},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":830,"meta":841,"stem":62,"__hash__":63},[831,839,840],{"nested":8,"label":9,"icon":10,"to":11,"children":832},[833,834,835,836,837,838],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":843,"title":206,"body":844,"description":5307,"extension":5308,"icon":5309,"meta":5310,"module":5311,"navigation":8,"path":207,"rawbody":5312,"seo":5313,"stem":208,"__hash__":5314},"docs\u002Fdocs\u002Fauth-h3client\u002F07.api\u002F01.middleware.md",{"type":845,"value":846,"toc":5262},"minimark",[847,873,883,893,896,901,904,911,918,929,935,986,991,1022,1027,1071,1084,1086,1092,1107,1111,1139,1143,1166,1184,1186,1190,1196,1206,1211,1283,1290,1292,1298,1318,1322,1353,1357,1418,1428,1430,1434,1440,1447,1451,1471,1475,1496,1498,1504,1519,1540,1551,1555,1587,1591,1634,1638,1699,1708,1710,1714,1720,1746,1757,1761,1825,1829,1868,1872,1917,1922,1924,1928,1934,1949,1954,1996,2001,2037,2042,2094,2098,2124,2126,2132,2139,2143,2167,2171,2199,2203,2231,2235,2262,2264,2270,2281,2291,2296,2357,2361,2386,2390,2431,2538,2540,2544,2555,2561,2582,2586,2609,2613,2660,2738,2740,2746,2761,2765,2789,2793,2814,2924,2926,2932,2938,2942,2963,3030,3032,3038,3050,3054,3101,3195,3197,3203,3218,3238,3245,3249,3280,3284,3307,3311,3358,3459,3461,3467,3485,3507,3519,3543,3556,3561,3714,3744,3760,3764,3879,3883,3966,4188,4190,4196,4229,4233,4266,4270,4309,4379,4387,4389,4395,4409,4413,4449,4453,4474,4478,4528,4580,4582,4588,4595,4598,4658,4660,4664,4675,4702,4802,4806,4852,4864,4866,4870,4876,4879,4883,4907,4911,4955,5005,5007,5013,5016,5018,5022,5028,5034,5039,5067,5072,5074,5078,5258],[848,849,850,851,855,856,859,860,863,864,867,868,872],"p",{},"Every middleware exported by ",[852,853,854],"code",{},"auth-h3client"," is documented here. Import them from ",[852,857,858],{},"auth-h3client\u002Fv1"," or ",[852,861,862],{},"auth-h3client\u002Fv2",". When using the Nuxt module, all middleware is auto-imported inside the ",[852,865,866],{},"server\u002F"," directory and the global chain is wired automatically. For other setups, register the global middlewares and route-level wrappers explicitly as shown in the ",[869,870,871],"a",{"href":177},"H3 or Nitro setup",".",[874,875,876],"warning",{},[848,877,878,879,882],{},"All middleware depends on a resolved configuration. Call ",[852,880,881],{},"configuration(...)"," exactly once at startup before any middleware runs.",[848,884,885,886,890,891,872],{},"For the global middleware stack order applied automatically, see ",[869,887,889],{"href":888},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity#request-lifecycle","Security: Request Lifecycle",". For route-level middleware chains per registered endpoint, see the ",[869,892,202],{"href":203},[894,895],"hr",{},[897,898,900],"h2",{"id":899},"authentication-guards","Authentication guards",[848,902,903],{},"These middleware and wrappers enforce token presence, session validity, and HMAC signature verification before your handler runs.",[905,906,908],"h3",{"id":907},"ensurevalidcredentials",[852,909,910],{},"ensureValidCredentials",[848,912,913,914,917],{},"The core token rotation middleware. Checks the access token expiry state and rotates both the access and refresh tokens when needed by calling the IAM ",[852,915,916],{},"\u002Fauth\u002Fuser\u002Frefresh-session"," endpoint. Deduplicates concurrent rotation attempts on the same session so that only one rotation call is sent to the IAM service even if multiple requests arrive simultaneously.",[848,919,920,921,924,925,928],{},"On success, sets ",[852,922,923],{},"event.context.accessToken"," and ",[852,926,927],{},"event.context.session",". Returns a 202 MFA response rather than throwing when the session requires step-up verification.",[848,930,931],{},[932,933,934],"strong",{},"Reads",[936,937,938,951],"table",{},[939,940,941],"thead",{},[942,943,944,948],"tr",{},[945,946,947],"th",{},"Source",[945,949,950],{},"Value",[952,953,954,966,976],"tbody",{},[942,955,956,963],{},[957,958,959,962],"td",{},[852,960,961],{},"__Secure-a"," cookie",[957,964,965],{},"The current access token",[942,967,968,973],{},[957,969,970,962],{},[852,971,972],{},"session",[957,974,975],{},"The current refresh token",[942,977,978,983],{},[957,979,980,962],{},[852,981,982],{},"canary_id",[957,984,985],{},"The visitor fingerprint for anomaly binding",[848,987,988],{},[932,989,990],{},"Sets",[936,992,993,1002],{},[939,994,995],{},[942,996,997,1000],{},[945,998,999],{},"Target",[945,1001,950],{},[952,1003,1004,1013],{},[942,1005,1006,1010],{},[957,1007,1008],{},[852,1009,923],{},[957,1011,1012],{},"The current (or newly rotated) access token string",[942,1014,1015,1019],{},[957,1016,1017],{},[852,1018,927],{},[957,1020,1021],{},"The current session cookie value",[848,1023,1024],{},[932,1025,1026],{},"Responses on failure",[936,1028,1029,1039],{},[939,1030,1031],{},[942,1032,1033,1036],{},[945,1034,1035],{},"Status",[945,1037,1038],{},"Meaning",[952,1040,1041,1051,1061],{},[942,1042,1043,1048],{},[957,1044,1045],{},[852,1046,1047],{},"202",[957,1049,1050],{},"MFA challenge, step-up verification required",[942,1052,1053,1058],{},[957,1054,1055],{},[852,1056,1057],{},"401",[957,1059,1060],{},"No valid session found",[942,1062,1063,1068],{},[957,1064,1065],{},[852,1066,1067],{},"429",[957,1069,1070],{},"IAM service rate limit exceeded",[1072,1073,1074],"tip",{},[848,1075,1076,1077,859,1080,1083],{},"Do not call this middleware manually inside routes that already use ",[852,1078,1079],{},"defineAuthenticatedEventHandler",[852,1081,1082],{},"defineOptionalAuthenticationEvent",". Both wrappers call it internally.",[894,1085],{},[905,1087,1089],{"id":1088},"hmacsignaturemiddleware",[852,1090,1091],{},"hmacSignatureMiddleware",[848,1093,1094,1095,1098,1099,1102,1103,1106],{},"Generates HMAC-SHA256 signature headers for every outbound request the module sends to the IAM service. Reads the current request method and URL path, computes the signature using the ",[852,1096,1097],{},"sharedSecret"," from the configuration, and stores the resulting headers on ",[852,1100,1101],{},"event.context.authHeaders",". ",[852,1104,1105],{},"serviceToService"," reads those headers when forwarding requests to the IAM service.",[848,1108,1109],{},[932,1110,934],{},[936,1112,1113,1121],{},[939,1114,1115],{},[942,1116,1117,1119],{},[945,1118,947],{},[945,1120,950],{},[952,1122,1123,1131],{},[942,1124,1125,1128],{},[957,1126,1127],{},"Request method",[957,1129,1130],{},"HTTP verb of the current inbound request",[942,1132,1133,1136],{},[957,1134,1135],{},"Request URL path",[957,1137,1138],{},"Path and query string of the current inbound request",[848,1140,1141],{},[932,1142,990],{},[936,1144,1145,1153],{},[939,1146,1147],{},[942,1148,1149,1151],{},[945,1150,999],{},[945,1152,950],{},[952,1154,1155],{},[942,1156,1157,1161],{},[957,1158,1159],{},[852,1160,1101],{},[957,1162,1163],{},[852,1164,1165],{},"{ 'X-Client-Id', 'X-Timestamp', 'X-Request-Id', 'X-Signature' }",[1167,1168,1169],"note",{},[848,1170,1171,1172,1175,1176,1179,1180,1183],{},"This middleware only applies when ",[852,1173,1174],{},"enableHmac: true"," in the configuration. When disabled, no headers are added. See the ",[869,1177,1178],{"href":181},"HMAC guide"," for setup and the ",[869,1181,1182],{"href":456},"IAM HMAC documentation"," for the server-side signature verification.",[894,1185],{},[897,1187,1189],{"id":1188},"csrf-middleware","CSRF middleware",[905,1191,1193],{"id":1192},"generatecsrfcookie",[852,1194,1195],{},"generateCsrfCookie",[848,1197,1198,1199,1202,1203,872],{},"Mints a signed ",[852,1200,1201],{},"__Host-csrf"," cookie when one is not already present on the request. The token is a 32-byte random hex string, signed with an expiring HMAC payload using ",[852,1204,1205],{},"cryptoCookiesSecret",[848,1207,1208],{},[932,1209,1210],{},"Cookie attributes",[936,1212,1213,1222],{},[939,1214,1215],{},[942,1216,1217,1220],{},[945,1218,1219],{},"Attribute",[945,1221,950],{},[952,1223,1224,1233,1246,1258,1270],{},[942,1225,1226,1229],{},[957,1227,1228],{},"Name",[957,1230,1231],{},[852,1232,1201],{},[942,1234,1235,1240],{},[957,1236,1237],{},[852,1238,1239],{},"HttpOnly",[957,1241,1242,1245],{},[852,1243,1244],{},"false"," (the client must read it to inject it as a header)",[942,1247,1248,1253],{},[957,1249,1250],{},[852,1251,1252],{},"SameSite",[957,1254,1255],{},[852,1256,1257],{},"Strict",[942,1259,1260,1265],{},[957,1261,1262],{},[852,1263,1264],{},"Secure",[957,1266,1267],{},[852,1268,1269],{},"true",[942,1271,1272,1277],{},[957,1273,1274],{},[852,1275,1276],{},"MaxAge",[957,1278,1279,1282],{},[852,1280,1281],{},"1800"," seconds",[848,1284,1285,1286,1289],{},"Runs automatically in global middleware. Also runs on all ",[852,1287,1288],{},"GET"," magic link routes to prepare a fresh cookie for the page that will be rendered.",[894,1291],{},[905,1293,1295],{"id":1294},"verifycsrfcookie",[852,1296,1297],{},"verifyCsrfCookie",[848,1299,1300,1301,1303,1304,1307,1308,1311,1312,872],{},"Validates the ",[852,1302,1201],{}," cookie signature and expiry, then checks that the ",[852,1305,1306],{},"X-CSRF-Token"," request header contains a value that matches the token stored inside the cookie payload. The comparison uses ",[852,1309,1310],{},"isSameBuffer"," for timing-safe equality to prevent ",[869,1313,1317],{"href":1314,"rel":1315},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTiming_attack",[1316],"nofollow","timing side-channel attacks",[848,1319,1320],{},[932,1321,934],{},[936,1323,1324,1332],{},[939,1325,1326],{},[942,1327,1328,1330],{},[945,1329,947],{},[945,1331,950],{},[952,1333,1334,1343],{},[942,1335,1336,1340],{},[957,1337,1338,962],{},[852,1339,1201],{},[957,1341,1342],{},"The signed CSRF token",[942,1344,1345,1350],{},[957,1346,1347,1349],{},[852,1348,1306],{}," header",[957,1351,1352],{},"The raw token submitted by the client",[848,1354,1355],{},[932,1356,1026],{},[936,1358,1359,1370],{},[939,1360,1361],{},[942,1362,1363,1365,1368],{},[945,1364,1035],{},[945,1366,1367],{},"Code",[945,1369,1038],{},[952,1371,1372,1390,1404],{},[942,1373,1374,1379,1384],{},[957,1375,1376],{},[852,1377,1378],{},"403",[957,1380,1381],{},[852,1382,1383],{},"CSRF_MISSING",[957,1385,1386,1387,1389],{},"The ",[852,1388,1201],{}," cookie is absent",[942,1391,1392,1396,1401],{},[957,1393,1394],{},[852,1395,1378],{},[957,1397,1398],{},[852,1399,1400],{},"CSRF_INVALID",[957,1402,1403],{},"Cookie signature or expiry check failed",[942,1405,1406,1410,1415],{},[957,1407,1408],{},[852,1409,1378],{},[957,1411,1412],{},[852,1413,1414],{},"TOKEN_INVALID",[957,1416,1417],{},"Header value does not match the cookie payload",[848,1419,1420,1421,1424,1425,1427],{},"See ",[869,1422,1423],{"href":98},"CSRF"," for the double-submit pattern and ",[852,1426,160],{}," integration.",[894,1429],{},[897,1431,1433],{"id":1432},"bot-detection-middleware","Bot detection middleware",[905,1435,1437],{"id":1436},"isipvalid",[852,1438,1439],{},"isIPValid",[848,1441,1442,1443,1446],{},"Extracts and validates the client IP address from the request headers using ",[852,1444,1445],{},"net.isIP()",". Does not make any network call. Runs as the first step in the global middleware chain.",[848,1448,1449],{},[932,1450,934],{},[936,1452,1453,1461],{},[939,1454,1455],{},[942,1456,1457,1459],{},[945,1458,947],{},[945,1460,950],{},[952,1462,1463],{},[942,1464,1465,1468],{},[957,1466,1467],{},"Request headers",[957,1469,1470],{},"Client IP address",[848,1472,1473],{},[932,1474,1026],{},[936,1476,1477,1485],{},[939,1478,1479],{},[942,1480,1481,1483],{},[945,1482,1035],{},[945,1484,1038],{},[952,1486,1487],{},[942,1488,1489,1493],{},[957,1490,1491],{},[852,1492,1378],{},[957,1494,1495],{},"Invalid or missing IP address",[894,1497],{},[905,1499,1501],{"id":1500},"botdetectormiddleware",[852,1502,1503],{},"botDetectorMiddleware",[848,1505,1506,1507,1510,1511,1514,1515,1518],{},"Forwards the visitor fingerprint to the IAM service ",[852,1508,1509],{},"\u002Fcheck"," endpoint. Returns HTTP 403 when the visitor's bot score exceeds the configured ban threshold. When ",[852,1512,1513],{},"enableFireWallBans: true",", calls ",[852,1516,1517],{},"banIp"," to block the IP at the operating system firewall level.",[848,1520,1521,1522,1524,1525,1528,1529,924,1531,1533,1534,1536,1537,872],{},"On the first request from a visitor, the middleware calls ",[852,1523,1509],{}," and sets ",[852,1526,1527],{},"__Host-dr_i_n",", a signed host-only cookie. On every subsequent request where both ",[852,1530,1527],{},[852,1532,982],{}," are present and the ",[852,1535,1527],{}," signature is valid, the middleware skips calling the IAM service entirely. If the signature verification fails, the request is rejected with 403 and code ",[852,1538,1539],{},"CANARY_TEMPERING",[874,1541,1542],{},[848,1543,1544,1545,1547,1548,1550],{},"This middleware must remain enabled whenever the IAM service is in use. The ",[852,1546,982],{}," cookie issued by the IAM service and the ",[852,1549,1527],{}," cookie set by this middleware are required for session operations including token rotation. Disabling bot detection means these cookies are never set and subsequent IAM calls will fail.",[848,1552,1553],{},[932,1554,934],{},[936,1556,1557,1565],{},[939,1558,1559],{},[942,1560,1561,1563],{},[945,1562,947],{},[945,1564,950],{},[952,1566,1567,1578],{},[942,1568,1569,1573],{},[957,1570,1571,962],{},[852,1572,982],{},[957,1574,1575,1576],{},"Visitor fingerprint forwarded to IAM ",[852,1577,1509],{},[942,1579,1580,1584],{},[957,1581,1582,962],{},[852,1583,1527],{},[957,1585,1586],{},"Signed tracking cookie: if present and valid, skips IAM call",[848,1588,1589],{},[932,1590,990],{},[936,1592,1593,1601],{},[939,1594,1595],{},[942,1596,1597,1599],{},[945,1598,999],{},[945,1600,950],{},[952,1602,1603,1621],{},[942,1604,1605,1609],{},[957,1606,1607,962],{},[852,1608,1527],{},[957,1610,1611,1612,1614,1615,1614,1618,1620],{},"HMAC-signed tracking cookie (",[852,1613,1239],{},", ",[852,1616,1617],{},"SameSite: Strict",[852,1619,1264],{},", 2-hour TTL)",[942,1622,1623,1628],{},[957,1624,1625],{},[852,1626,1627],{},"event.context.trackingResult",[957,1629,1630,1631,1633],{},"Parsed JSON response from the IAM ",[852,1632,1509],{}," endpoint",[848,1635,1636],{},[932,1637,1026],{},[936,1639,1640,1650],{},[939,1641,1642],{},[942,1643,1644,1646,1648],{},[945,1645,1035],{},[945,1647,1367],{},[945,1649,1038],{},[952,1651,1652,1666,1681],{},[942,1653,1654,1658,1663],{},[957,1655,1656],{},[852,1657,1378],{},[957,1659,1660],{},[852,1661,1662],{},"NOT_ALLOWED",[957,1664,1665],{},"Visitor bot score exceeds ban threshold",[942,1667,1668,1672,1676],{},[957,1669,1670],{},[852,1671,1378],{},[957,1673,1674],{},[852,1675,1539],{},[957,1677,1678,1680],{},[852,1679,1527],{}," cookie signature verification failed",[942,1682,1683,1688,1693],{},[957,1684,1685],{},[852,1686,1687],{},"502",[957,1689,1690],{},[852,1691,1692],{},"AUTH_SERVER_ERROR",[957,1694,1695,1696,1698],{},"IAM ",[852,1697,1509],{}," endpoint unreachable",[848,1700,1420,1701,1703,1704,1707],{},[869,1702,33],{"href":109}," for the full flow and the ",[852,1705,1706],{},"enableFireWallBans"," configuration.",[894,1709],{},[897,1711,1713],{"id":1712},"oauth-middleware","OAuth middleware",[905,1715,1717],{"id":1716},"oauthtokensvalidations",[852,1718,1719],{},"OAuthTokensValidations",[848,1721,1722,1723,1614,1726,1729,1730,1733,1734,1737,1738,1614,1741,1729,1744,872],{},"Validates the OAuth provider callback before the success handler runs. Reads the authorization code and state from the request (query string for GET, form body for POST), verifies the signed state cookie, and for OIDC providers verifies the ID token signature against the provider's JWKS endpoint, the ",[852,1724,1725],{},"nonce",[852,1727,1728],{},"azp",", and ",[852,1731,1732],{},"at_hash"," claims, and that ",[852,1735,1736],{},"userinfo.sub"," matches the ID token subject. On success, sets ",[852,1739,1740],{},"event.context.provider",[852,1742,1743],{},"event.context.userData",[852,1745,923],{},[848,1747,1748,1749,1752,1753,1756],{},"Called automatically by ",[852,1750,1751],{},"useOAuthRoutes"," as the first middleware in the ",[852,1754,1755],{},"\u002Foauth\u002Fcallback\u002F:provider"," chain. Export it directly when building a custom OAuth callback route.",[848,1758,1759],{},[932,1760,934],{},[936,1762,1763,1771],{},[939,1764,1765],{},[942,1766,1767,1769],{},[945,1768,947],{},[945,1770,950],{},[952,1772,1773,1783,1797,1807],{},[942,1774,1775,1780],{},[957,1776,1777,962],{},[852,1778,1779],{},"state{provider}",[957,1781,1782],{},"Signed state token for CSRF protection during the OAuth flow",[942,1784,1785,1790],{},[957,1786,1787,962],{},[852,1788,1789],{},"pkce_v{provider}",[957,1791,1792,1793,1796],{},"PKCE code verifier (when ",[852,1794,1795],{},"supportPKCE: true",")",[942,1798,1799,1804],{},[957,1800,1801,962],{},[852,1802,1803],{},"nonce{provider}",[957,1805,1806],{},"Nonce for OIDC ID token verification",[942,1808,1809,1812],{},[957,1810,1811],{},"Query \u002F form body",[957,1813,1814,1614,1816,1614,1819,1614,1822],{},[852,1815,852],{},[852,1817,1818],{},"state",[852,1820,1821],{},"error",[852,1823,1824],{},"iss",[848,1826,1827],{},[932,1828,990],{},[936,1830,1831,1839],{},[939,1832,1833],{},[942,1834,1835,1837],{},[945,1836,999],{},[945,1838,950],{},[952,1840,1841,1850,1859],{},[942,1842,1843,1847],{},[957,1844,1845],{},[852,1846,1740],{},[957,1848,1849],{},"The matched provider name from configuration",[942,1851,1852,1856],{},[957,1853,1854],{},[852,1855,1743],{},[957,1857,1858],{},"User info object from the OAuth provider",[942,1860,1861,1865],{},[957,1862,1863],{},[852,1864,923],{},[957,1866,1867],{},"OAuth access token from the provider",[848,1869,1870],{},[932,1871,1026],{},[936,1873,1874,1882],{},[939,1875,1876],{},[942,1877,1878,1880],{},[945,1879,1035],{},[945,1881,1038],{},[952,1883,1884,1897,1907],{},[942,1885,1886,1891],{},[957,1887,1888],{},[852,1889,1890],{},"302",[957,1892,1893,1894],{},"OAuth error from provider, redirects to ",[852,1895,1896],{},"redirectUrlOnError",[942,1898,1899,1904],{},[957,1900,1901],{},[852,1902,1903],{},"400",[957,1905,1906],{},"State mismatch, missing code, or token validation failure",[942,1908,1909,1914],{},[957,1910,1911],{},[852,1912,1913],{},"500",[957,1915,1916],{},"Token exchange or JWKS verification error",[848,1918,1420,1919,1921],{},[869,1920,105],{"href":106}," for provider configuration and the full OIDC verification sequence.",[894,1923],{},[897,1925,1927],{"id":1926},"request-validation-middleware","Request validation middleware",[905,1929,1931],{"id":1930},"limitbytesmaxbytes",[852,1932,1933],{},"limitBytes(maxBytes)",[848,1935,1936,1937,1940,1941,1944,1945,1948],{},"Factory function. Returns a middleware that reads the raw request body and throws HTTP 403 with code ",[852,1938,1939],{},"INVALID_CONTENT_TYPE"," if the byte length exceeds ",[852,1942,1943],{},"maxBytes",". Pass ",[852,1946,1947],{},"0"," to reject any body entirely. Applied before JSON parsing, so oversized payloads cannot consume memory during deserialization.",[848,1950,1951],{},[932,1952,1953],{},"Import",[1955,1956,1961],"pre",{"className":1957,"code":1958,"language":1959,"meta":1960,"style":1960},"language-ts shiki shiki-themes light-plus light-plus dracula","import { limitBytes } from 'auth-h3client'\n","ts","",[852,1962,1963],{"__ignoreMap":1960},[1964,1965,1968,1972,1976,1980,1983,1986,1990,1993],"span",{"class":1966,"line":1967},"line",1,[1964,1969,1971],{"class":1970},"sZ328","import",[1964,1973,1975],{"class":1974},"sDd4n"," { ",[1964,1977,1979],{"class":1978},"sjsA6","limitBytes",[1964,1981,1982],{"class":1974}," } ",[1964,1984,1985],{"class":1970},"from",[1964,1987,1989],{"class":1988},"sFkSl"," '",[1964,1991,854],{"class":1992},"sFB1V",[1964,1994,1995],{"class":1988},"'\n",[848,1997,1998],{},[932,1999,2000],{},"Signature",[1955,2002,2004],{"className":1957,"code":2003,"language":1959,"meta":1960,"style":1960},"function limitBytes(maxBytes: number): EventHandler\n",[852,2005,2006],{"__ignoreMap":1960},[1964,2007,2008,2012,2016,2019,2022,2026,2030,2032,2034],{"class":1966,"line":1967},[1964,2009,2011],{"class":2010},"sl46w","function",[1964,2013,2015],{"class":2014},"sHOzp"," limitBytes",[1964,2017,2018],{"class":1974},"(",[1964,2020,1943],{"class":2021},"sygFZ",[1964,2023,2025],{"class":2024},"saOXh",":",[1964,2027,2029],{"class":2028},"sFs1U"," number",[1964,2031,1796],{"class":1974},[1964,2033,2025],{"class":2024},[1964,2035,2036],{"class":2028}," EventHandler\n",[848,2038,2039],{},[932,2040,2041],{},"Usage",[1955,2043,2045],{"className":1957,"code":2044,"language":1959,"meta":1960,"style":1960},"await limitBytes(1024)(event)  \u002F\u002F Reject bodies over 1 KB\nawait limitBytes(0)(event)     \u002F\u002F Reject any body\n",[852,2046,2047,2073],{"__ignoreMap":1960},[1964,2048,2049,2052,2054,2056,2060,2063,2066,2069],{"class":1966,"line":1967},[1964,2050,2051],{"class":1970},"await",[1964,2053,2015],{"class":2014},[1964,2055,2018],{"class":1974},[1964,2057,2059],{"class":2058},"spgvN","1024",[1964,2061,2062],{"class":1974},")(",[1964,2064,2065],{"class":1978},"event",[1964,2067,2068],{"class":1974},")  ",[1964,2070,2072],{"class":2071},"sghk6","\u002F\u002F Reject bodies over 1 KB\n",[1964,2074,2076,2078,2080,2082,2084,2086,2088,2091],{"class":1966,"line":2075},2,[1964,2077,2051],{"class":1970},[1964,2079,2015],{"class":2014},[1964,2081,2018],{"class":1974},[1964,2083,1947],{"class":2058},[1964,2085,2062],{"class":1974},[1964,2087,2065],{"class":1978},[1964,2089,2090],{"class":1974},")     ",[1964,2092,2093],{"class":2071},"\u002F\u002F Reject any body\n",[848,2095,2096],{},[932,2097,1026],{},[936,2099,2100,2108],{},[939,2101,2102],{},[942,2103,2104,2106],{},[945,2105,1035],{},[945,2107,1038],{},[952,2109,2110],{},[942,2111,2112,2116],{},[957,2113,2114],{},[852,2115,1378],{},[957,2117,2118,2119,2121,2122,1796],{},"Body exceeds ",[852,2120,1943],{}," (error code: ",[852,2123,1939],{},[894,2125],{},[905,2127,2129],{"id":2128},"contenttypeexpected",[852,2130,2131],{},"contentType(expected)",[848,2133,2134,2135,2138],{},"Factory function. Returns a middleware that validates the ",[852,2136,2137],{},"Content-Type"," request header against the expected value. Throws HTTP 403 if the header is missing or does not match.",[848,2140,2141],{},[932,2142,1953],{},[1955,2144,2146],{"className":1957,"code":2145,"language":1959,"meta":1960,"style":1960},"import { contentType } from 'auth-h3client'\n",[852,2147,2148],{"__ignoreMap":1960},[1964,2149,2150,2152,2154,2157,2159,2161,2163,2165],{"class":1966,"line":1967},[1964,2151,1971],{"class":1970},[1964,2153,1975],{"class":1974},[1964,2155,2156],{"class":1978},"contentType",[1964,2158,1982],{"class":1974},[1964,2160,1985],{"class":1970},[1964,2162,1989],{"class":1988},[1964,2164,854],{"class":1992},[1964,2166,1995],{"class":1988},[848,2168,2169],{},[932,2170,2000],{},[1955,2172,2174],{"className":1957,"code":2173,"language":1959,"meta":1960,"style":1960},"function contentType(expected: string): EventHandler\n",[852,2175,2176],{"__ignoreMap":1960},[1964,2177,2178,2180,2183,2185,2188,2190,2193,2195,2197],{"class":1966,"line":1967},[1964,2179,2011],{"class":2010},[1964,2181,2182],{"class":2014}," contentType",[1964,2184,2018],{"class":1974},[1964,2186,2187],{"class":2021},"expected",[1964,2189,2025],{"class":2024},[1964,2191,2192],{"class":2028}," string",[1964,2194,1796],{"class":1974},[1964,2196,2025],{"class":2024},[1964,2198,2036],{"class":2028},[848,2200,2201],{},[932,2202,2041],{},[1955,2204,2206],{"className":1957,"code":2205,"language":1959,"meta":1960,"style":1960},"await contentType('application\u002Fjson')(event)\n",[852,2207,2208],{"__ignoreMap":1960},[1964,2209,2210,2212,2214,2216,2219,2222,2224,2226,2228],{"class":1966,"line":1967},[1964,2211,2051],{"class":1970},[1964,2213,2182],{"class":2014},[1964,2215,2018],{"class":1974},[1964,2217,2218],{"class":1988},"'",[1964,2220,2221],{"class":1992},"application\u002Fjson",[1964,2223,2218],{"class":1988},[1964,2225,2062],{"class":1974},[1964,2227,2065],{"class":1978},[1964,2229,2230],{"class":1974},")\n",[848,2232,2233],{},[932,2234,1026],{},[936,2236,2237,2247],{},[939,2238,2239],{},[942,2240,2241,2243,2245],{},[945,2242,1035],{},[945,2244,1367],{},[945,2246,1038],{},[952,2248,2249],{},[942,2250,2251,2255,2259],{},[957,2252,2253],{},[852,2254,1378],{},[957,2256,2257],{},[852,2258,1939],{},[957,2260,2261],{},"Content-Type missing or does not match expected value",[894,2263],{},[905,2265,2267],{"id":2266},"definebytelimiterhandlerhandler-limitbytesto-method",[852,2268,2269],{},"defineByteLimiterHandler(handler, limitBytesTo, method)",[848,2271,2272,2273,2276,2277,2280],{},"Higher-order wrapper that asserts the request method, reads the raw request\nbody exactly once, rejects bodies larger than ",[852,2274,2275],{},"limitBytesTo",", parses JSON into\n",[852,2278,2279],{},"event.context.body",", and then calls your handler. The API token management\nwrapper uses this parser so request-size checks happen before any\naction runs.",[848,2282,2283,2284,2286,2287,2290],{},"If the request body is empty, the wrapper leaves ",[852,2285,2279],{},"\nundefined and continues. If ",[852,2288,2289],{},"Content-Length"," is present and already exceeds the\nlimit, the request is rejected before the full body is processed.",[848,2292,2293],{},[932,2294,2295],{},"Parameters",[936,2297,2298,2311],{},[939,2299,2300],{},[942,2301,2302,2305,2308],{},[945,2303,2304],{},"Parameter",[945,2306,2307],{},"Type",[945,2309,2310],{},"Description",[952,2312,2313,2328,2342],{},[942,2314,2315,2320,2325],{},[957,2316,2317],{},[852,2318,2319],{},"handler",[957,2321,2322],{},[852,2323,2324],{},"EventHandler",[957,2326,2327],{},"Your H3 handler",[942,2329,2330,2334,2339],{},[957,2331,2332],{},[852,2333,2275],{},[957,2335,2336],{},[852,2337,2338],{},"number",[957,2340,2341],{},"Maximum accepted request body size in bytes",[942,2343,2344,2349,2354],{},[957,2345,2346],{},[852,2347,2348],{},"method",[957,2350,2351],{},[852,2352,2353],{},"'POST' | 'PUT' | 'PATCH'",[957,2355,2356],{},"The only HTTP method accepted by the wrapper",[848,2358,2359],{},[932,2360,990],{},[936,2362,2363,2371],{},[939,2364,2365],{},[942,2366,2367,2369],{},[945,2368,999],{},[945,2370,950],{},[952,2372,2373],{},[942,2374,2375,2379],{},[957,2376,2377],{},[852,2378,2279],{},[957,2380,2381,2382,2385],{},"Parsed JSON object, or ",[852,2383,2384],{},"undefined"," for an empty body",[848,2387,2388],{},[932,2389,1026],{},[936,2391,2392,2400],{},[939,2393,2394],{},[942,2395,2396,2398],{},[945,2397,1035],{},[945,2399,1038],{},[952,2401,2402,2411,2421],{},[942,2403,2404,2408],{},[957,2405,2406],{},[852,2407,1903],{},[957,2409,2410],{},"JSON parse failed",[942,2412,2413,2417],{},[957,2414,2415],{},[852,2416,1378],{},[957,2418,2118,2419],{},[852,2420,2275],{},[942,2422,2423,2428],{},[957,2424,2425],{},[852,2426,2427],{},"405",[957,2429,2430],{},"Wrong HTTP method",[1955,2432,2435],{"className":1957,"code":2433,"filename":2434,"language":1959,"meta":1960,"style":1960},"export default defineByteLimiterHandler(async (event) => {\n  const body = event.context.body\n  return { ok: true, body }\n}, 2048, 'POST')\n","server\u002Fapi\u002Faccount\u002Fsettings.post.ts",[852,2436,2437,2467,2492,2518],{"__ignoreMap":1960},[1964,2438,2439,2442,2445,2448,2450,2453,2456,2458,2461,2464],{"class":1966,"line":1967},[1964,2440,2441],{"class":1970},"export",[1964,2443,2444],{"class":1970}," default",[1964,2446,2447],{"class":2014}," defineByteLimiterHandler",[1964,2449,2018],{"class":1974},[1964,2451,2452],{"class":2010},"async",[1964,2454,2455],{"class":1974}," (",[1964,2457,2065],{"class":2021},[1964,2459,2460],{"class":1974},") ",[1964,2462,2463],{"class":2010},"=>",[1964,2465,2466],{"class":1974}," {\n",[1964,2468,2469,2472,2476,2479,2482,2484,2487,2489],{"class":1966,"line":2075},[1964,2470,2471],{"class":2010},"  const",[1964,2473,2475],{"class":2474},"s3JHE"," body",[1964,2477,2478],{"class":2024}," =",[1964,2480,2481],{"class":1978}," event",[1964,2483,872],{"class":1974},[1964,2485,2486],{"class":1978},"context",[1964,2488,872],{"class":1974},[1964,2490,2491],{"class":1978},"body\n",[1964,2493,2495,2498,2500,2503,2506,2510,2512,2515],{"class":1966,"line":2494},3,[1964,2496,2497],{"class":1970},"  return",[1964,2499,1975],{"class":1974},[1964,2501,2502],{"class":1978},"ok",[1964,2504,2025],{"class":2505},"s34zl",[1964,2507,2509],{"class":2508},"sjR7W"," true",[1964,2511,1614],{"class":1974},[1964,2513,2514],{"class":1978},"body",[1964,2516,2517],{"class":1974}," }\n",[1964,2519,2521,2524,2527,2529,2531,2534,2536],{"class":1966,"line":2520},4,[1964,2522,2523],{"class":1974},"}, ",[1964,2525,2526],{"class":2058},"2048",[1964,2528,1614],{"class":1974},[1964,2530,2218],{"class":1988},[1964,2532,2533],{"class":1992},"POST",[1964,2535,2218],{"class":1988},[1964,2537,2230],{"class":1974},[894,2539],{},[897,2541,2543],{"id":2542},"event-handler-wrappers","Event handler wrappers",[848,2545,2546,2547,859,2549,2551,2552,2554],{},"Wrappers are higher-order functions that accept your handler and return a new handler with enforcement built in. Import them from ",[852,2548,858],{},[852,2550,862],{},". When using the Nuxt module, they are auto-imported inside the ",[852,2553,866],{}," directory.",[905,2556,2558],{"id":2557},"defineauthenticatedeventhandlerhandler",[852,2559,2560],{},"defineAuthenticatedEventHandler(handler)",[848,2562,2563,2564,2566,2567,2569,2570,2573,2574,2577,2578,2581],{},"The standard wrapper for protected routes. Runs ",[852,2565,1091],{},", then ",[852,2568,910],{}," (token rotation), then calls ",[852,2571,2572],{},"getCachedUserData"," against the IAM service. Populates ",[852,2575,2576],{},"event.context.authorizedData"," with the verified session data. Throws HTTP 401 on failure. Returns HTTP 202 with ",[852,2579,2580],{},"mfaRequired"," when the session requires step-up verification.",[848,2583,2584],{},[932,2585,990],{},[936,2587,2588,2596],{},[939,2589,2590],{},[942,2591,2592,2594],{},[945,2593,999],{},[945,2595,950],{},[952,2597,2598],{},[942,2599,2600,2604],{},[957,2601,2602],{},[852,2603,2576],{},[957,2605,2606],{},[852,2607,2608],{},"{ authorized, userId?, roles?, ipAddress, userAgent, date, reason?, error?, message? }",[848,2610,2611],{},[932,2612,1026],{},[936,2614,2615,2623],{},[939,2616,2617],{},[942,2618,2619,2621],{},[945,2620,1035],{},[945,2622,1038],{},[952,2624,2625,2633,2642,2651],{},[942,2626,2627,2631],{},[957,2628,2629],{},[852,2630,1047],{},[957,2632,1050],{},[942,2634,2635,2639],{},[957,2636,2637],{},[852,2638,1057],{},[957,2640,2641],{},"Not authenticated or invalid session",[942,2643,2644,2648],{},[957,2645,2646],{},[852,2647,1067],{},[957,2649,2650],{},"Rate limit exceeded",[942,2652,2653,2657],{},[957,2654,2655],{},[852,2656,1913],{},[957,2658,2659],{},"IAM service error",[1955,2661,2664],{"className":1957,"code":2662,"filename":2663,"language":1959,"meta":1960,"style":1960},"export default defineAuthenticatedEventHandler(async (event) => {\n  const { userId, roles } = event.context.authorizedData\n  return { userId, roles }\n})\n","server\u002Fapi\u002Fprofile.get.ts",[852,2665,2666,2689,2719,2733],{"__ignoreMap":1960},[1964,2667,2668,2670,2672,2675,2677,2679,2681,2683,2685,2687],{"class":1966,"line":1967},[1964,2669,2441],{"class":1970},[1964,2671,2444],{"class":1970},[1964,2673,2674],{"class":2014}," defineAuthenticatedEventHandler",[1964,2676,2018],{"class":1974},[1964,2678,2452],{"class":2010},[1964,2680,2455],{"class":1974},[1964,2682,2065],{"class":2021},[1964,2684,2460],{"class":1974},[1964,2686,2463],{"class":2010},[1964,2688,2466],{"class":1974},[1964,2690,2691,2693,2695,2698,2700,2703,2705,2708,2710,2712,2714,2716],{"class":1966,"line":2075},[1964,2692,2471],{"class":2010},[1964,2694,1975],{"class":1974},[1964,2696,2697],{"class":2474},"userId",[1964,2699,1614],{"class":1974},[1964,2701,2702],{"class":2474},"roles",[1964,2704,1982],{"class":1974},[1964,2706,2707],{"class":2024},"=",[1964,2709,2481],{"class":1978},[1964,2711,872],{"class":1974},[1964,2713,2486],{"class":1978},[1964,2715,872],{"class":1974},[1964,2717,2718],{"class":1978},"authorizedData\n",[1964,2720,2721,2723,2725,2727,2729,2731],{"class":1966,"line":2494},[1964,2722,2497],{"class":1970},[1964,2724,1975],{"class":1974},[1964,2726,2697],{"class":1978},[1964,2728,1614],{"class":1974},[1964,2730,2702],{"class":1978},[1964,2732,2517],{"class":1974},[1964,2734,2735],{"class":1966,"line":2520},[1964,2736,2737],{"class":1974},"})\n",[894,2739],{},[905,2741,2743],{"id":2742},"defineoptionalauthenticationeventhandler",[852,2744,2745],{},"defineOptionalAuthenticationEvent(handler)",[848,2747,2748,2749,2751,2752,2754,2755,2757,2758,2760],{},"Attempts authentication using the same internal pipeline as ",[852,2750,1079],{},". On success, populates ",[852,2753,2576],{},". On any auth failure other than a rate limit, sets ",[852,2756,2576],{}," to ",[852,2759,2384],{}," and continues to your handler as a guest. HTTP 429 responses are still propagated.",[848,2762,2763],{},[932,2764,990],{},[936,2766,2767,2775],{},[939,2768,2769],{},[942,2770,2771,2773],{},[945,2772,999],{},[945,2774,950],{},[952,2776,2777],{},[942,2778,2779,2783],{},[957,2780,2781],{},[852,2782,2576],{},[957,2784,2785,2786,2788],{},"Verified session data, or ",[852,2787,2384],{}," for unauthenticated requests",[848,2790,2791],{},[932,2792,1026],{},[936,2794,2795,2803],{},[939,2796,2797],{},[942,2798,2799,2801],{},[945,2800,1035],{},[945,2802,1038],{},[952,2804,2805],{},[942,2806,2807,2811],{},[957,2808,2809],{},[852,2810,1067],{},[957,2812,2813],{},"Rate limit exceeded (always propagated, even for guests)",[1955,2815,2818],{"className":1957,"code":2816,"filename":2817,"language":1959,"meta":1960,"style":1960},"export default defineOptionalAuthenticationEvent(async (event) => {\n  const user = event.context.authorizedData \u002F\u002F undefined for guests\n  return user ? { content: 'private', userId: user.userId } : { content: 'public' }\n})\n","server\u002Fapi\u002Fposts\u002F[id].get.ts",[852,2819,2820,2843,2866,2920],{"__ignoreMap":1960},[1964,2821,2822,2824,2826,2829,2831,2833,2835,2837,2839,2841],{"class":1966,"line":1967},[1964,2823,2441],{"class":1970},[1964,2825,2444],{"class":1970},[1964,2827,2828],{"class":2014}," defineOptionalAuthenticationEvent",[1964,2830,2018],{"class":1974},[1964,2832,2452],{"class":2010},[1964,2834,2455],{"class":1974},[1964,2836,2065],{"class":2021},[1964,2838,2460],{"class":1974},[1964,2840,2463],{"class":2010},[1964,2842,2466],{"class":1974},[1964,2844,2845,2847,2850,2852,2854,2856,2858,2860,2863],{"class":1966,"line":2075},[1964,2846,2471],{"class":2010},[1964,2848,2849],{"class":2474}," user",[1964,2851,2478],{"class":2024},[1964,2853,2481],{"class":1978},[1964,2855,872],{"class":1974},[1964,2857,2486],{"class":1978},[1964,2859,872],{"class":1974},[1964,2861,2862],{"class":1978},"authorizedData",[1964,2864,2865],{"class":2071}," \u002F\u002F undefined for guests\n",[1964,2867,2868,2870,2872,2875,2877,2880,2882,2884,2887,2889,2891,2893,2895,2897,2899,2901,2903,2905,2907,2909,2911,2913,2916,2918],{"class":1966,"line":2494},[1964,2869,2497],{"class":1970},[1964,2871,2849],{"class":1978},[1964,2873,2874],{"class":2024}," ?",[1964,2876,1975],{"class":1974},[1964,2878,2879],{"class":1978},"content",[1964,2881,2025],{"class":2505},[1964,2883,1989],{"class":1988},[1964,2885,2886],{"class":1992},"private",[1964,2888,2218],{"class":1988},[1964,2890,1614],{"class":1974},[1964,2892,2697],{"class":1978},[1964,2894,2025],{"class":2505},[1964,2896,2849],{"class":1978},[1964,2898,872],{"class":1974},[1964,2900,2697],{"class":1978},[1964,2902,1982],{"class":1974},[1964,2904,2025],{"class":2024},[1964,2906,1975],{"class":1974},[1964,2908,2879],{"class":1978},[1964,2910,2025],{"class":2505},[1964,2912,1989],{"class":1988},[1964,2914,2915],{"class":1992},"public",[1964,2917,2218],{"class":1988},[1964,2919,2517],{"class":1974},[1964,2921,2922],{"class":1966,"line":2520},[1964,2923,2737],{"class":1974},[894,2925],{},[905,2927,2929],{"id":2928},"defineverifiedcsrfhandlerhandler",[852,2930,2931],{},"defineVerifiedCsrfHandler(handler)",[848,2933,2934,2935,2937],{},"Calls ",[852,2936,1297],{}," before running the handler. Does not check authentication. Use this when you need CSRF protection on a route that is accessible to both guests and authenticated users.",[848,2939,2940],{},[932,2941,1026],{},[936,2943,2944,2952],{},[939,2945,2946],{},[942,2947,2948,2950],{},[945,2949,1035],{},[945,2951,1038],{},[952,2953,2954],{},[942,2955,2956,2960],{},[957,2957,2958],{},[852,2959,1378],{},[957,2961,2962],{},"CSRF cookie missing, invalid, or header mismatch",[1955,2964,2967],{"className":1957,"code":2965,"filename":2966,"language":1959,"meta":1960,"style":1960},"export default defineVerifiedCsrfHandler(async (event) => {\n  const body = await readBody(event)\n  return { ok: true }\n})\n","server\u002Fapi\u002Fcontact.post.ts",[852,2968,2969,2992,3012,3026],{"__ignoreMap":1960},[1964,2970,2971,2973,2975,2978,2980,2982,2984,2986,2988,2990],{"class":1966,"line":1967},[1964,2972,2441],{"class":1970},[1964,2974,2444],{"class":1970},[1964,2976,2977],{"class":2014}," defineVerifiedCsrfHandler",[1964,2979,2018],{"class":1974},[1964,2981,2452],{"class":2010},[1964,2983,2455],{"class":1974},[1964,2985,2065],{"class":2021},[1964,2987,2460],{"class":1974},[1964,2989,2463],{"class":2010},[1964,2991,2466],{"class":1974},[1964,2993,2994,2996,2998,3000,3003,3006,3008,3010],{"class":1966,"line":2075},[1964,2995,2471],{"class":2010},[1964,2997,2475],{"class":2474},[1964,2999,2478],{"class":2024},[1964,3001,3002],{"class":1970}," await",[1964,3004,3005],{"class":2014}," readBody",[1964,3007,2018],{"class":1974},[1964,3009,2065],{"class":1978},[1964,3011,2230],{"class":1974},[1964,3013,3014,3016,3018,3020,3022,3024],{"class":1966,"line":2494},[1964,3015,2497],{"class":1970},[1964,3017,1975],{"class":1974},[1964,3019,2502],{"class":1978},[1964,3021,2025],{"class":2505},[1964,3023,2509],{"class":2508},[1964,3025,2517],{"class":1974},[1964,3027,3028],{"class":1966,"line":2520},[1964,3029,2737],{"class":1974},[894,3031],{},[905,3033,3035],{"id":3034},"defineauthenticatedeventposthandlershandler",[852,3036,3037],{},"defineAuthenticatedEventPostHandlers(handler)",[848,3039,3040,3041,1614,3043,1729,3046,3049],{},"Combines ",[852,3042,1079],{},[852,3044,3045],{},"defineVerifiedCsrfHandler",[852,3047,3048],{},"assertMethod('POST')"," in that order. The correct choice for any state-changing endpoint that requires authentication.",[848,3051,3052],{},[932,3053,1026],{},[936,3055,3056,3064],{},[939,3057,3058],{},[942,3059,3060,3062],{},[945,3061,1035],{},[945,3063,1038],{},[952,3065,3066,3075,3084,3093],{},[942,3067,3068,3072],{},[957,3069,3070],{},[852,3071,1047],{},[957,3073,3074],{},"MFA challenge",[942,3076,3077,3081],{},[957,3078,3079],{},[852,3080,1057],{},[957,3082,3083],{},"Not authenticated",[942,3085,3086,3090],{},[957,3087,3088],{},[852,3089,1378],{},[957,3091,3092],{},"CSRF failure or wrong HTTP method",[942,3094,3095,3099],{},[957,3096,3097],{},[852,3098,1067],{},[957,3100,2650],{},[1955,3102,3104],{"className":1957,"code":3103,"filename":2434,"language":1959,"meta":1960,"style":1960},"export default defineAuthenticatedEventPostHandlers(async (event) => {\n  const { userId } = event.context.authorizedData\n  await updateSettings(userId, await readBody(event))\n  return { ok: true }\n})\n",[852,3105,3106,3129,3151,3176,3190],{"__ignoreMap":1960},[1964,3107,3108,3110,3112,3115,3117,3119,3121,3123,3125,3127],{"class":1966,"line":1967},[1964,3109,2441],{"class":1970},[1964,3111,2444],{"class":1970},[1964,3113,3114],{"class":2014}," defineAuthenticatedEventPostHandlers",[1964,3116,2018],{"class":1974},[1964,3118,2452],{"class":2010},[1964,3120,2455],{"class":1974},[1964,3122,2065],{"class":2021},[1964,3124,2460],{"class":1974},[1964,3126,2463],{"class":2010},[1964,3128,2466],{"class":1974},[1964,3130,3131,3133,3135,3137,3139,3141,3143,3145,3147,3149],{"class":1966,"line":2075},[1964,3132,2471],{"class":2010},[1964,3134,1975],{"class":1974},[1964,3136,2697],{"class":2474},[1964,3138,1982],{"class":1974},[1964,3140,2707],{"class":2024},[1964,3142,2481],{"class":1978},[1964,3144,872],{"class":1974},[1964,3146,2486],{"class":1978},[1964,3148,872],{"class":1974},[1964,3150,2718],{"class":1978},[1964,3152,3153,3156,3159,3161,3163,3165,3167,3169,3171,3173],{"class":1966,"line":2494},[1964,3154,3155],{"class":1970},"  await",[1964,3157,3158],{"class":2014}," updateSettings",[1964,3160,2018],{"class":1974},[1964,3162,2697],{"class":1978},[1964,3164,1614],{"class":1974},[1964,3166,2051],{"class":1970},[1964,3168,3005],{"class":2014},[1964,3170,2018],{"class":1974},[1964,3172,2065],{"class":1978},[1964,3174,3175],{"class":1974},"))\n",[1964,3177,3178,3180,3182,3184,3186,3188],{"class":1966,"line":2520},[1964,3179,2497],{"class":1970},[1964,3181,1975],{"class":1974},[1964,3183,2502],{"class":1978},[1964,3185,2025],{"class":2505},[1964,3187,2509],{"class":2508},[1964,3189,2517],{"class":1974},[1964,3191,3193],{"class":1966,"line":3192},5,[1964,3194,2737],{"class":1974},[894,3196],{},[905,3198,3200],{"id":3199},"defineauthenticatepublicapihandler-userprivilege",[852,3201,3202],{},"defineAuthenticatePublicApi(handler, userPrivilege)",[848,3204,3205,3206,3209,3210,3213,3214,3217],{},"Protects a route with API token verification. The wrapper\nreads ",[852,3207,3208],{},"X-API-KEY"," from the incoming request, forwards it to the IAM\n",[852,3211,3212],{},"\u002Fapi\u002Fpublic\u002Fverify"," endpoint together with the privilege floor defined by\n",[852,3215,3216],{},"userPrivilege",", and only then calls your handler.",[874,3219,3220],{},[848,3221,3222,3223,3226,3227,3230,3231,1729,3234,3237],{},"Do not place routes wrapped with ",[852,3224,3225],{},"defineAuthenticatePublicApi"," behind the Nuxt\nglobal auth middleware or a manual ",[852,3228,3229],{},"isIPValid -> botDetectorMiddleware -> generateCsrfCookie"," chain. These requests are machine-to-machine API-key\nverification calls, so applying the browser session middleware can lead to\nbot-detector rate limits or bans. Keep the global middleware for regular auth\nroutes, ",[852,3232,3233],{},"getApiListsController",[852,3235,3236],{},"defineApiManagementHandler",", because\nthose browser session flows still need bot detection and the CSRF cookie.",[848,3239,3240,3241,3244],{},"On success, the wrapper stores the verified token metadata on\n",[852,3242,3243],{},"event.context.apiVerification",". On failure, it returns a normalized JSON\nresponse instead of throwing.",[848,3246,3247],{},[932,3248,934],{},[936,3250,3251,3259],{},[939,3252,3253],{},[942,3254,3255,3257],{},[945,3256,947],{},[945,3258,950],{},[952,3260,3261,3270],{},[942,3262,3263,3267],{},[957,3264,3265,1349],{},[852,3266,3208],{},[957,3268,3269],{},"Raw API token presented by the caller",[942,3271,3272,3277],{},[957,3273,3274,3276],{},[852,3275,3216],{}," argument",[957,3278,3279],{},"Minimum privilege level your route requires",[848,3281,3282],{},[932,3283,990],{},[936,3285,3286,3294],{},[939,3287,3288],{},[942,3289,3290,3292],{},[945,3291,999],{},[945,3293,950],{},[952,3295,3296],{},[942,3297,3298,3302],{},[957,3299,3300],{},[852,3301,3243],{},[957,3303,3304],{},[852,3305,3306],{},"{ name, tokenId, userId, createdAt, expiresAt, lastUsed, usageCount, providedPrivilege }",[848,3308,3309],{},[932,3310,1026],{},[936,3312,3313,3321],{},[939,3314,3315],{},[942,3316,3317,3319],{},[945,3318,1035],{},[945,3320,1038],{},[952,3322,3323,3332,3341,3349],{},[942,3324,3325,3329],{},[957,3326,3327],{},[852,3328,1057],{},[957,3330,3331],{},"API key missing",[942,3333,3334,3338],{},[957,3335,3336],{},[852,3337,1067],{},[957,3339,3340],{},"Too many invalid verification attempts",[942,3342,3343,3346],{},[957,3344,3345],{},"IAM status",[957,3347,3348],{},"IAM verification rejected the token",[942,3350,3351,3355],{},[957,3352,3353],{},[852,3354,1913],{},[957,3356,3357],{},"IAM service unreachable or returned no response",[1955,3359,3362],{"className":1957,"code":3360,"filename":3361,"language":1959,"meta":1960,"style":1960},"export default defineAuthenticatePublicApi(async (event) => {\n  const token = event.context.apiVerification\n  return { ok: true, tokenId: token.tokenId, userId: token.userId }\n}, 'demo')\n","server\u002Fapi\u002Fpublic\u002Fdata.get.ts",[852,3363,3364,3387,3407,3446],{"__ignoreMap":1960},[1964,3365,3366,3368,3370,3373,3375,3377,3379,3381,3383,3385],{"class":1966,"line":1967},[1964,3367,2441],{"class":1970},[1964,3369,2444],{"class":1970},[1964,3371,3372],{"class":2014}," defineAuthenticatePublicApi",[1964,3374,2018],{"class":1974},[1964,3376,2452],{"class":2010},[1964,3378,2455],{"class":1974},[1964,3380,2065],{"class":2021},[1964,3382,2460],{"class":1974},[1964,3384,2463],{"class":2010},[1964,3386,2466],{"class":1974},[1964,3388,3389,3391,3394,3396,3398,3400,3402,3404],{"class":1966,"line":2075},[1964,3390,2471],{"class":2010},[1964,3392,3393],{"class":2474}," token",[1964,3395,2478],{"class":2024},[1964,3397,2481],{"class":1978},[1964,3399,872],{"class":1974},[1964,3401,2486],{"class":1978},[1964,3403,872],{"class":1974},[1964,3405,3406],{"class":1978},"apiVerification\n",[1964,3408,3409,3411,3413,3415,3417,3419,3421,3424,3426,3428,3430,3432,3434,3436,3438,3440,3442,3444],{"class":1966,"line":2494},[1964,3410,2497],{"class":1970},[1964,3412,1975],{"class":1974},[1964,3414,2502],{"class":1978},[1964,3416,2025],{"class":2505},[1964,3418,2509],{"class":2508},[1964,3420,1614],{"class":1974},[1964,3422,3423],{"class":1978},"tokenId",[1964,3425,2025],{"class":2505},[1964,3427,3393],{"class":1978},[1964,3429,872],{"class":1974},[1964,3431,3423],{"class":1978},[1964,3433,1614],{"class":1974},[1964,3435,2697],{"class":1978},[1964,3437,2025],{"class":2505},[1964,3439,3393],{"class":1978},[1964,3441,872],{"class":1974},[1964,3443,2697],{"class":1978},[1964,3445,2517],{"class":1974},[1964,3447,3448,3450,3452,3455,3457],{"class":1966,"line":2520},[1964,3449,2523],{"class":1974},[1964,3451,2218],{"class":1988},[1964,3453,3454],{"class":1992},"demo",[1964,3456,2218],{"class":1988},[1964,3458,2230],{"class":1974},[894,3460],{},[905,3462,3464],{"id":3463},"defineapimanagementhandlerhandler-allowedprivilege-updatetonewprivilege",[852,3465,3466],{},"defineApiManagementHandler(handler, allowedPrivilege, updateToNewPrivilege?)",[848,3468,3469,3470,3473,3474,3477,3478,3481,3482,3484],{},"Builds a complete authenticated POST pipeline for API token management routes.\nIt wraps ",[852,3471,3472],{},"defineAuthenticatedEventPostHandlers(...)"," with\n",[852,3475,3476],{},"defineByteLimiterHandler(..., 2000, 'POST')",", validates\n",[852,3479,3480],{},"event.context.params"," against the supported actions, and then proxies the\nrequest to the IAM API token management endpoints. This means the raw request\nbody is size-checked and parsed into ",[852,3483,2279],{}," before the\naction-specific logic runs.",[848,3486,3487,3488,1614,3491,1614,3494,1614,3497,3500,3501,1729,3504,872],{},"Supported actions are ",[852,3489,3490],{},"new-token",[852,3492,3493],{},"revoke",[852,3495,3496],{},"metadata",[852,3498,3499],{},"rotate",",\n",[852,3502,3503],{},"ip-restriction-update",[852,3505,3506],{},"privilege-update",[1167,3508,3509],{},[848,3510,3511,3512,3515,3516,3518],{},"The wrapper rejects\n",[852,3513,3514],{},"list-metadata"," on POST because token listing is handled by\n",[852,3517,3233],{}," over GET.",[848,3520,3521,3522,3524,3525,3528,3529,3532,3533,3535,3536,924,3539,3542],{},"For every action except ",[852,3523,3490],{},", the wrapper first calls\n",[852,3526,3527],{},"\u002Fapi\u002Fmanage\u002Flist-metadata"," to resolve the token's ",[852,3530,3531],{},"public_identifier",". This\nmeans the client submits only ",[852,3534,3423],{},", and the wrapper maps that token ID to\n",[852,3537,3538],{},"publicIdentifier",[852,3540,3541],{},"name"," before it calls IAM.",[848,3544,3545,3548,3549,3552,3553,3555],{},[852,3546,3547],{},"allowedPrivilege"," controls the privilege that will be assigned to newly\ncreated tokens. ",[852,3550,3551],{},"updateToNewPrivilege"," is optional, but it must be provided if\nyou want the ",[852,3554,3506],{}," action to succeed.",[848,3557,3558],{},[932,3559,3560],{},"Accepted request bodies",[936,3562,3563,3581],{},[939,3564,3565],{},[942,3566,3567,3570,3575,3578],{},[945,3568,3569],{},"Action",[945,3571,3572,3573],{},"Body accepted by ",[852,3574,3236],{},[945,3576,3577],{},"IAM body sent by the wrapper",[945,3579,3580],{},"See",[952,3582,3583,3603,3623,3641,3659,3679,3698],{},[942,3584,3585,3589,3594,3599],{},[957,3586,3587],{},[852,3588,3490],{},[957,3590,3591],{},[852,3592,3593],{},"{ name, prefix, ipv4?, expires? }",[957,3595,3596],{},[852,3597,3598],{},"{ name, prefix, ipv4?, expires?, privilege: allowedPrivilege }",[957,3600,3601],{},[869,3602,490],{"href":491},[942,3604,3605,3609,3614,3619],{},[957,3606,3607],{},[852,3608,3493],{},[957,3610,3611],{},[852,3612,3613],{},"{ tokenId }",[957,3615,3616],{},[852,3617,3618],{},"{ tokenId, publicIdentifier, name }",[957,3620,3621],{},[869,3622,508],{"href":509},[942,3624,3625,3629,3633,3637],{},[957,3626,3627],{},[852,3628,3496],{},[957,3630,3631],{},[852,3632,3613],{},[957,3634,3635],{},[852,3636,3618],{},[957,3638,3639],{},[869,3640,520],{"href":521},[942,3642,3643,3647,3651,3655],{},[957,3644,3645],{},[852,3646,3499],{},[957,3648,3649],{},[852,3650,3613],{},[957,3652,3653],{},[852,3654,3618],{},[957,3656,3657],{},[869,3658,512],{"href":513},[942,3660,3661,3665,3670,3675],{},[957,3662,3663],{},[852,3664,3503],{},[957,3666,3667],{},[852,3668,3669],{},"{ tokenId, ipv4? }",[957,3671,3672],{},[852,3673,3674],{},"{ tokenId, publicIdentifier, name, ipv4? }",[957,3676,3677],{},[869,3678,516],{"href":517},[942,3680,3681,3685,3689,3694],{},[957,3682,3683],{},[852,3684,3506],{},[957,3686,3687],{},[852,3688,3613],{},[957,3690,3691],{},[852,3692,3693],{},"{ tokenId, publicIdentifier, name, newPrivilege: updateToNewPrivilege }",[957,3695,3696],{},[869,3697,504],{"href":505},[942,3699,3700,3704,3707,3710],{},[957,3701,3702],{},[852,3703,3514],{},[957,3705,3706],{},"Rejected on POST",[957,3708,3709],{},"Not sent",[957,3711,3712],{},[869,3713,524],{"href":525},[848,3715,3716,3717,3720,3721,3723,3724,3726,3727,3730,3731,859,3734,3737,3738,3740,3741,3743],{},"The wrapper schema requires ",[852,3718,3719],{},"prefix"," on ",[852,3722,3490],{}," and validates\n",[852,3725,3503],{}," with an optional ",[852,3728,3729],{},"ipv4"," array.\nThe client request body never supplies ",[852,3732,3733],{},"privilege",[852,3735,3736],{},"newPrivilege",". Your\napplication decides those values through the ",[852,3739,3547],{}," and\n",[852,3742,3551],{}," arguments.",[848,3745,3746,3747,3749,3750,3753,3754,3756,3757,872],{},"On ",[852,3748,3490],{},", IAM returns ",[852,3751,3752],{},"rawPublicId"," in addition to the raw key. The\nwrapper removes ",[852,3755,3752],{}," before it populates ",[852,3758,3759],{},"event.context.newApiToken",[848,3761,3762],{},[932,3763,990],{},[936,3765,3766,3781],{},[939,3767,3768],{},[942,3769,3770,3772,3778],{},[945,3771,3569],{},[945,3773,3774,3777],{},[852,3775,3776],{},"event.context"," field",[945,3779,3780],{},"Shape",[952,3782,3783,3799,3815,3830,3848,3864],{},[942,3784,3785,3789,3794],{},[957,3786,3787],{},[852,3788,3490],{},[957,3790,3791],{},[852,3792,3793],{},"newApiToken",[957,3795,3796],{},[852,3797,3798],{},"{ rawApiKey, expiresAt }",[942,3800,3801,3805,3810],{},[957,3802,3803],{},[852,3804,3503],{},[957,3806,3807],{},[852,3808,3809],{},"ipRestrictionUpdate",[957,3811,3812],{},[852,3813,3814],{},"{ msg }",[942,3816,3817,3821,3826],{},[957,3818,3819],{},[852,3820,3506],{},[957,3822,3823],{},[852,3824,3825],{},"privilegeUpdate",[957,3827,3828],{},[852,3829,3814],{},[942,3831,3832,3836,3840],{},[957,3833,3834],{},[852,3835,3493],{},[957,3837,3838],{},[852,3839,3493],{},[957,3841,3842,859,3845],{},[852,3843,3844],{},"string",[852,3846,3847],{},"{ msg, invalidedTokenId, userId }",[942,3849,3850,3854,3859],{},[957,3851,3852],{},[852,3853,3496],{},[957,3855,3856],{},[852,3857,3858],{},"extensiveMetadata",[957,3860,3861],{},[852,3862,3863],{},"{ tokenMeta, counts }",[942,3865,3866,3870,3874],{},[957,3867,3868],{},[852,3869,3499],{},[957,3871,3872],{},[852,3873,3499],{},[957,3875,3876],{},[852,3877,3878],{},"{ msg, newRawToken, newExpiry }",[848,3880,3881],{},[932,3882,1026],{},[936,3884,3885,3893],{},[939,3886,3887],{},[942,3888,3889,3891],{},[945,3890,1035],{},[945,3892,1038],{},[952,3894,3895,3904,3916,3925,3937,3947,3956],{},[942,3896,3897,3901],{},[957,3898,3899],{},[852,3900,1047],{},[957,3902,3903],{},"MFA challenge pending",[942,3905,3906,3910],{},[957,3907,3908],{},[852,3909,1903],{},[957,3911,3912,3913,3915],{},"Invalid JSON body or ",[852,3914,3514],{}," attempted on POST",[942,3917,3918,3922],{},[957,3919,3920],{},[852,3921,1057],{},[957,3923,3924],{},"Session missing, unauthorized action, or token not owned by the user",[942,3926,3927,3931],{},[957,3928,3929],{},[852,3930,1378],{},[957,3932,3933,3934,3936],{},"CSRF failure, oversized body, or ",[852,3935,3506],{}," not permitted",[942,3938,3939,3944],{},[957,3940,3941],{},[852,3942,3943],{},"404",[957,3945,3946],{},"Invalid route action or invalid action-specific input",[942,3948,3949,3953],{},[957,3950,3951],{},[852,3952,1067],{},[957,3954,3955],{},"Rate limited by IAM",[942,3957,3958,3960],{},[957,3959,3345],{},[957,3961,3962,3963],{},"IAM action failed and returned ",[852,3964,3965],{},"{ ok: false, reason }",[1955,3967,3970],{"className":1957,"code":3968,"filename":3969,"language":1959,"meta":1960,"style":1960},"export default defineApiManagementHandler(async (event) => {\n  const action = event.context.params?.action\n\n  if (action === 'new-token') {\n    return { ok: true, data: event.context.newApiToken }\n  }\n\n  if (action === 'metadata') {\n    return { ok: true, data: event.context.extensiveMetadata }\n  }\n\n  return { ok: true }\n}, 'demo', 'protected')\n","server\u002Fapi\u002Fauth\u002Fapi-tokens\u002F[action].post.ts",[852,3971,3972,3995,4021,4026,4048,4080,4086,4091,4110,4141,4146,4151,4166],{"__ignoreMap":1960},[1964,3973,3974,3976,3978,3981,3983,3985,3987,3989,3991,3993],{"class":1966,"line":1967},[1964,3975,2441],{"class":1970},[1964,3977,2444],{"class":1970},[1964,3979,3980],{"class":2014}," defineApiManagementHandler",[1964,3982,2018],{"class":1974},[1964,3984,2452],{"class":2010},[1964,3986,2455],{"class":1974},[1964,3988,2065],{"class":2021},[1964,3990,2460],{"class":1974},[1964,3992,2463],{"class":2010},[1964,3994,2466],{"class":1974},[1964,3996,3997,3999,4002,4004,4006,4008,4010,4012,4015,4018],{"class":1966,"line":2075},[1964,3998,2471],{"class":2010},[1964,4000,4001],{"class":2474}," action",[1964,4003,2478],{"class":2024},[1964,4005,2481],{"class":1978},[1964,4007,872],{"class":1974},[1964,4009,2486],{"class":1978},[1964,4011,872],{"class":1974},[1964,4013,4014],{"class":1978},"params",[1964,4016,4017],{"class":1974},"?.",[1964,4019,4020],{"class":1978},"action\n",[1964,4022,4023],{"class":1966,"line":2494},[1964,4024,4025],{"emptyLinePlaceholder":8},"\n",[1964,4027,4028,4031,4033,4036,4039,4041,4043,4045],{"class":1966,"line":2520},[1964,4029,4030],{"class":1970},"  if",[1964,4032,2455],{"class":1974},[1964,4034,4035],{"class":1978},"action",[1964,4037,4038],{"class":2024}," ===",[1964,4040,1989],{"class":1988},[1964,4042,3490],{"class":1992},[1964,4044,2218],{"class":1988},[1964,4046,4047],{"class":1974},") {\n",[1964,4049,4050,4053,4055,4057,4059,4061,4063,4066,4068,4070,4072,4074,4076,4078],{"class":1966,"line":3192},[1964,4051,4052],{"class":1970},"    return",[1964,4054,1975],{"class":1974},[1964,4056,2502],{"class":1978},[1964,4058,2025],{"class":2505},[1964,4060,2509],{"class":2508},[1964,4062,1614],{"class":1974},[1964,4064,4065],{"class":1978},"data",[1964,4067,2025],{"class":2505},[1964,4069,2481],{"class":1978},[1964,4071,872],{"class":1974},[1964,4073,2486],{"class":1978},[1964,4075,872],{"class":1974},[1964,4077,3793],{"class":1978},[1964,4079,2517],{"class":1974},[1964,4081,4083],{"class":1966,"line":4082},6,[1964,4084,4085],{"class":1974},"  }\n",[1964,4087,4089],{"class":1966,"line":4088},7,[1964,4090,4025],{"emptyLinePlaceholder":8},[1964,4092,4094,4096,4098,4100,4102,4104,4106,4108],{"class":1966,"line":4093},8,[1964,4095,4030],{"class":1970},[1964,4097,2455],{"class":1974},[1964,4099,4035],{"class":1978},[1964,4101,4038],{"class":2024},[1964,4103,1989],{"class":1988},[1964,4105,3496],{"class":1992},[1964,4107,2218],{"class":1988},[1964,4109,4047],{"class":1974},[1964,4111,4113,4115,4117,4119,4121,4123,4125,4127,4129,4131,4133,4135,4137,4139],{"class":1966,"line":4112},9,[1964,4114,4052],{"class":1970},[1964,4116,1975],{"class":1974},[1964,4118,2502],{"class":1978},[1964,4120,2025],{"class":2505},[1964,4122,2509],{"class":2508},[1964,4124,1614],{"class":1974},[1964,4126,4065],{"class":1978},[1964,4128,2025],{"class":2505},[1964,4130,2481],{"class":1978},[1964,4132,872],{"class":1974},[1964,4134,2486],{"class":1978},[1964,4136,872],{"class":1974},[1964,4138,3858],{"class":1978},[1964,4140,2517],{"class":1974},[1964,4142,4144],{"class":1966,"line":4143},10,[1964,4145,4085],{"class":1974},[1964,4147,4149],{"class":1966,"line":4148},11,[1964,4150,4025],{"emptyLinePlaceholder":8},[1964,4152,4154,4156,4158,4160,4162,4164],{"class":1966,"line":4153},12,[1964,4155,2497],{"class":1970},[1964,4157,1975],{"class":1974},[1964,4159,2502],{"class":1978},[1964,4161,2025],{"class":2505},[1964,4163,2509],{"class":2508},[1964,4165,2517],{"class":1974},[1964,4167,4169,4171,4173,4175,4177,4179,4181,4184,4186],{"class":1966,"line":4168},13,[1964,4170,2523],{"class":1974},[1964,4172,2218],{"class":1988},[1964,4174,3454],{"class":1992},[1964,4176,2218],{"class":1988},[1964,4178,1614],{"class":1974},[1964,4180,2218],{"class":1988},[1964,4182,4183],{"class":1992},"protected",[1964,4185,2218],{"class":1988},[1964,4187,2230],{"class":1974},[894,4189],{},[905,4191,4193],{"id":4192},"defineverifiedmagiclinkgethandlerhandler",[852,4194,4195],{},"defineVerifiedMagicLinkGetHandler(handler)",[848,4197,4198,4199,1614,4201,1729,4203,4205,4206,2455,4209,1614,4212,1614,4215,1614,4218,4221,4222,924,4225,4228],{},"Validates incoming magic link query parameters before running the handler. Enforces GET method, checks that the ",[852,4200,982],{},[852,4202,972],{},[852,4204,961],{}," cookies are present, validates the query string against ",[852,4207,4208],{},"VerificationLinkSchema",[852,4210,4211],{},"visitor",[852,4213,4214],{},"token",[852,4216,4217],{},"random",[852,4219,4220],{},"reason","), and calls the IAM service to verify the link. Populates ",[852,4223,4224],{},"event.context.link",[852,4226,4227],{},"event.context.reason"," on success.",[848,4230,4231],{},[932,4232,990],{},[936,4234,4235,4243],{},[939,4236,4237],{},[942,4238,4239,4241],{},[945,4240,999],{},[945,4242,950],{},[952,4244,4245,4257],{},[942,4246,4247,4251],{},[957,4248,4249],{},[852,4250,4224],{},[957,4252,4253,4254,1796],{},"The link action type string (e.g., ",[852,4255,4256],{},"'Custom MFA'",[942,4258,4259,4263],{},[957,4260,4261],{},[852,4262,4227],{},[957,4264,4265],{},"The link reason string",[848,4267,4268],{},[932,4269,1026],{},[936,4271,4272,4280],{},[939,4273,4274],{},[942,4275,4276,4278],{},[945,4277,1035],{},[945,4279,1038],{},[952,4281,4282,4291,4300],{},[942,4283,4284,4288],{},[957,4285,4286],{},[852,4287,1903],{},[957,4289,4290],{},"Link invalid, expired, or already used (forwarded from IAM)",[942,4292,4293,4297],{},[957,4294,4295],{},[852,4296,2427],{},[957,4298,4299],{},"Not a GET request",[942,4301,4302,4306],{},[957,4303,4304],{},[852,4305,1057],{},[957,4307,4308],{},"Required session cookies missing",[1955,4310,4313],{"className":1957,"code":4311,"filename":4312,"language":1959,"meta":1960,"style":1960},"export default defineVerifiedMagicLinkGetHandler(async (event) => {\n  const { reason } = event.context\n  return { ok: true, reason }\n})\n","server\u002Fapi\u002Fauth\u002Fverify-custom.get.ts",[852,4314,4315,4338,4357,4375],{"__ignoreMap":1960},[1964,4316,4317,4319,4321,4324,4326,4328,4330,4332,4334,4336],{"class":1966,"line":1967},[1964,4318,2441],{"class":1970},[1964,4320,2444],{"class":1970},[1964,4322,4323],{"class":2014}," defineVerifiedMagicLinkGetHandler",[1964,4325,2018],{"class":1974},[1964,4327,2452],{"class":2010},[1964,4329,2455],{"class":1974},[1964,4331,2065],{"class":2021},[1964,4333,2460],{"class":1974},[1964,4335,2463],{"class":2010},[1964,4337,2466],{"class":1974},[1964,4339,4340,4342,4344,4346,4348,4350,4352,4354],{"class":1966,"line":2075},[1964,4341,2471],{"class":2010},[1964,4343,1975],{"class":1974},[1964,4345,4220],{"class":2474},[1964,4347,1982],{"class":1974},[1964,4349,2707],{"class":2024},[1964,4351,2481],{"class":1978},[1964,4353,872],{"class":1974},[1964,4355,4356],{"class":1978},"context\n",[1964,4358,4359,4361,4363,4365,4367,4369,4371,4373],{"class":1966,"line":2494},[1964,4360,2497],{"class":1970},[1964,4362,1975],{"class":1974},[1964,4364,2502],{"class":1978},[1964,4366,2025],{"class":2505},[1964,4368,2509],{"class":2508},[1964,4370,1614],{"class":1974},[1964,4372,4220],{"class":1978},[1964,4374,2517],{"class":1974},[1964,4376,4377],{"class":1966,"line":2520},[1964,4378,2737],{"class":1974},[1167,4380,4381],{},[848,4382,4383,4384,4386],{},"This wrapper does not validate a CSRF token. GET requests arrive directly from an email link, where no ",[852,4385,1201],{}," cookie will be present yet.",[894,4388],{},[905,4390,4392],{"id":4391},"definemfacodeverifierhandlerhandler",[852,4393,4394],{},"defineMfaCodeVerifierHandler(handler)",[848,4396,4397,4398,4400,4401,4404,4405,4408],{},"Validates an MFA code submission after a magic link is verified. Enforces POST method, verifies the CSRF cookie, limits the request body to 8 MB, validates link query parameters against ",[852,4399,4208],{},", reads ",[852,4402,4403],{},"event.context.body.code"," (a 7-digit numeric string), and sends the code to the IAM service for verification. On success, new tokens are issued and applied to the response cookies, and ",[852,4406,4407],{},"event.context.limitedMetaData"," is populated with the verified session metadata before your handler runs.",[848,4410,4411],{},[932,4412,934],{},[936,4414,4415,4423],{},[939,4416,4417],{},[942,4418,4419,4421],{},[945,4420,947],{},[945,4422,950],{},[952,4424,4425,4434],{},[942,4426,4427,4431],{},[957,4428,4429],{},[852,4430,4403],{},[957,4432,4433],{},"The 7-digit OTP code submitted by the user",[942,4435,4436,4439],{},[957,4437,4438],{},"Query parameters",[957,4440,4441,1614,4443,1614,4445,1614,4447],{},[852,4442,4214],{},[852,4444,4217],{},[852,4446,4220],{},[852,4448,4211],{},[848,4450,4451],{},[932,4452,990],{},[936,4454,4455,4463],{},[939,4456,4457],{},[942,4458,4459,4461],{},[945,4460,999],{},[945,4462,950],{},[952,4464,4465],{},[942,4466,4467,4471],{},[957,4468,4469],{},[852,4470,4407],{},[957,4472,4473],{},"Verified session metadata returned by the IAM service",[848,4475,4476],{},[932,4477,1026],{},[936,4479,4480,4488],{},[939,4481,4482],{},[942,4483,4484,4486],{},[945,4485,1035],{},[945,4487,1038],{},[952,4489,4490,4499,4508,4517],{},[942,4491,4492,4496],{},[957,4493,4494],{},[852,4495,1903],{},[957,4497,4498],{},"Malformed code, invalid or expired code, or link parameter mismatch",[942,4500,4501,4505],{},[957,4502,4503],{},[852,4504,1378],{},[957,4506,4507],{},"CSRF failure or user banned",[942,4509,4510,4514],{},[957,4511,4512],{},[852,4513,2427],{},[957,4515,4516],{},"Not a POST request",[942,4518,4519,4523],{},[957,4520,4521],{},[852,4522,1378],{},[957,4524,4525,4526,1796],{},"Body exceeds 8 MB (error code: ",[852,4527,1939],{},[1955,4529,4532],{"className":1957,"code":4530,"filename":4531,"language":1959,"meta":1960,"style":1960},"export default defineMfaCodeVerifierHandler(async (event) => {\n  \u002F\u002F Code verified, new tokens already applied to the response\n  return { ok: true }\n})\n","server\u002Fapi\u002Fauth\u002Fverify-code.post.ts",[852,4533,4534,4557,4562,4576],{"__ignoreMap":1960},[1964,4535,4536,4538,4540,4543,4545,4547,4549,4551,4553,4555],{"class":1966,"line":1967},[1964,4537,2441],{"class":1970},[1964,4539,2444],{"class":1970},[1964,4541,4542],{"class":2014}," defineMfaCodeVerifierHandler",[1964,4544,2018],{"class":1974},[1964,4546,2452],{"class":2010},[1964,4548,2455],{"class":1974},[1964,4550,2065],{"class":2021},[1964,4552,2460],{"class":1974},[1964,4554,2463],{"class":2010},[1964,4556,2466],{"class":1974},[1964,4558,4559],{"class":1966,"line":2075},[1964,4560,4561],{"class":2071},"  \u002F\u002F Code verified, new tokens already applied to the response\n",[1964,4563,4564,4566,4568,4570,4572,4574],{"class":1966,"line":2494},[1964,4565,2497],{"class":1970},[1964,4567,1975],{"class":1974},[1964,4569,2502],{"class":1978},[1964,4571,2025],{"class":2505},[1964,4573,2509],{"class":2508},[1964,4575,2517],{"class":1974},[1964,4577,4578],{"class":1966,"line":2520},[1964,4579,2737],{"class":1974},[894,4581],{},[905,4583,4585],{"id":4584},"definededuplicatedeventhandlerhandler",[852,4586,4587],{},"defineDeduplicatedEventHandler(handler)",[848,4589,4590,4591,4594],{},"Wraps a handler with request-level deduplication using ",[852,4592,4593],{},"lockAsyncAction",". Concurrent requests with the same session identity are coalesced so that only one execution runs at a time. Results are cached briefly to serve requests that arrive after the first completes.",[848,4596,4597],{},"The built-in login, logout, signup, password reset, and MFA handlers already use this wrapper internally.",[1955,4599,4602],{"className":1957,"code":4600,"filename":4601,"language":1959,"meta":1960,"style":1960},"export default defineDeduplicatedEventHandler(async (event) => {\n  await processCheckout(event)\n  return { ok: true }\n})\n","server\u002Fapi\u002Fcheckout.post.ts",[852,4603,4604,4627,4640,4654],{"__ignoreMap":1960},[1964,4605,4606,4608,4610,4613,4615,4617,4619,4621,4623,4625],{"class":1966,"line":1967},[1964,4607,2441],{"class":1970},[1964,4609,2444],{"class":1970},[1964,4611,4612],{"class":2014}," defineDeduplicatedEventHandler",[1964,4614,2018],{"class":1974},[1964,4616,2452],{"class":2010},[1964,4618,2455],{"class":1974},[1964,4620,2065],{"class":2021},[1964,4622,2460],{"class":1974},[1964,4624,2463],{"class":2010},[1964,4626,2466],{"class":1974},[1964,4628,4629,4631,4634,4636,4638],{"class":1966,"line":2075},[1964,4630,3155],{"class":1970},[1964,4632,4633],{"class":2014}," processCheckout",[1964,4635,2018],{"class":1974},[1964,4637,2065],{"class":1978},[1964,4639,2230],{"class":1974},[1964,4641,4642,4644,4646,4648,4650,4652],{"class":1966,"line":2494},[1964,4643,2497],{"class":1970},[1964,4645,1975],{"class":1974},[1964,4647,2502],{"class":1978},[1964,4649,2025],{"class":2505},[1964,4651,2509],{"class":2508},[1964,4653,2517],{"class":1974},[1964,4655,4656],{"class":1966,"line":2520},[1964,4657,2737],{"class":1974},[894,4659],{},[897,4661,4663],{"id":4662},"setup","Setup",[905,4665,4667,4670,4671],{"id":4666},"defineauthconfigurationnitro-config-v1-only",[852,4668,4669],{},"defineAuthConfiguration(nitro, config)"," ",[4672,4673,4674],"badge",{},"v1 only",[848,4676,4677,4678,4681,4682,1614,4685,1614,4687,1614,4690,4693,4694,4697,4698,4701],{},"One-call Nitro plugin setup function. Validates and freezes the configuration, registers ",[852,4679,4680],{},"httpLogger",", mounts all four route registrars (",[852,4683,4684],{},"useAuthRoutes",[852,4686,1751],{},[852,4688,4689],{},"bounceRouter",[852,4691,4692],{},"magicLinksRouter"," with ",[852,4695,4696],{},"'api'"," prefix) on ",[852,4699,4700],{},"nitro.router",", and logs a startup confirmation. Use this inside a Nitro plugin to wire everything in a single call instead of registering each piece manually.",[1955,4703,4706],{"className":1957,"code":4704,"filename":4705,"language":1959,"meta":1960,"style":1960},"import { defineAuthConfiguration } from 'auth-h3client\u002Fv1'\n\nexport default defineNitroPlugin((nitro) => {\n  defineAuthConfiguration(nitro, {\n    server: { auth_location: 'https:\u002F\u002Fiam.example.com' },\n    \u002F\u002F ...\n  })\n})\n","server\u002Fplugins\u002Fauth.ts",[852,4707,4708,4727,4731,4752,4764,4788,4793,4798],{"__ignoreMap":1960},[1964,4709,4710,4712,4714,4717,4719,4721,4723,4725],{"class":1966,"line":1967},[1964,4711,1971],{"class":1970},[1964,4713,1975],{"class":1974},[1964,4715,4716],{"class":1978},"defineAuthConfiguration",[1964,4718,1982],{"class":1974},[1964,4720,1985],{"class":1970},[1964,4722,1989],{"class":1988},[1964,4724,858],{"class":1992},[1964,4726,1995],{"class":1988},[1964,4728,4729],{"class":1966,"line":2075},[1964,4730,4025],{"emptyLinePlaceholder":8},[1964,4732,4733,4735,4737,4740,4743,4746,4748,4750],{"class":1966,"line":2494},[1964,4734,2441],{"class":1970},[1964,4736,2444],{"class":1970},[1964,4738,4739],{"class":2014}," defineNitroPlugin",[1964,4741,4742],{"class":1974},"((",[1964,4744,4745],{"class":2021},"nitro",[1964,4747,2460],{"class":1974},[1964,4749,2463],{"class":2010},[1964,4751,2466],{"class":1974},[1964,4753,4754,4757,4759,4761],{"class":1966,"line":2520},[1964,4755,4756],{"class":2014},"  defineAuthConfiguration",[1964,4758,2018],{"class":1974},[1964,4760,4745],{"class":1978},[1964,4762,4763],{"class":1974},", {\n",[1964,4765,4766,4769,4771,4773,4776,4778,4780,4783,4785],{"class":1966,"line":3192},[1964,4767,4768],{"class":1978},"    server",[1964,4770,2025],{"class":2505},[1964,4772,1975],{"class":1974},[1964,4774,4775],{"class":1978},"auth_location",[1964,4777,2025],{"class":2505},[1964,4779,1989],{"class":1988},[1964,4781,4782],{"class":1992},"https:\u002F\u002Fiam.example.com",[1964,4784,2218],{"class":1988},[1964,4786,4787],{"class":1974}," },\n",[1964,4789,4790],{"class":1966,"line":4082},[1964,4791,4792],{"class":2071},"    \u002F\u002F ...\n",[1964,4794,4795],{"class":1966,"line":4088},[1964,4796,4797],{"class":1974},"  })\n",[1964,4799,4800],{"class":1966,"line":4093},[1964,4801,2737],{"class":1974},[848,4803,4804],{},[932,4805,2295],{},[936,4807,4808,4818],{},[939,4809,4810],{},[942,4811,4812,4814,4816],{},[945,4813,2304],{},[945,4815,2307],{},[945,4817,2310],{},[952,4819,4820,4834],{},[942,4821,4822,4826,4831],{},[957,4823,4824],{},[852,4825,4745],{},[957,4827,4828],{},[852,4829,4830],{},"NitroApp",[957,4832,4833],{},"The Nitro app instance provided by the plugin callback",[942,4835,4836,4841,4845],{},[957,4837,4838],{},[852,4839,4840],{},"config",[957,4842,4843],{},[852,4844,192],{},[957,4846,4847,4848,4851],{},"The full configuration object, passed to ",[852,4849,4850],{},"configuration(config)"," internally",[874,4853,4854],{},[848,4855,4856,4857,4859,4860,4863],{},"This function is only exported from ",[852,4858,858],{},". For H3 v2 setups, call ",[852,4861,4862],{},"configuration()"," and each route registrar individually.",[894,4865],{},[897,4867,4869],{"id":4868},"error-utilities","Error utilities",[905,4871,4873],{"id":4872},"throwhttperrorlog-event-code-status-title-message",[852,4874,4875],{},"throwHttpError(log, event, code, status, title, message)",[848,4877,4878],{},"Logs an error with structured context and throws an H3 error with the given status, title, and message. Use this inside custom handlers to produce consistent JSON error responses.",[848,4880,4881],{},[932,4882,1953],{},[1955,4884,4886],{"className":1957,"code":4885,"language":1959,"meta":1960,"style":1960},"import { throwHttpError } from 'auth-h3client'\n",[852,4887,4888],{"__ignoreMap":1960},[1964,4889,4890,4892,4894,4897,4899,4901,4903,4905],{"class":1966,"line":1967},[1964,4891,1971],{"class":1970},[1964,4893,1975],{"class":1974},[1964,4895,4896],{"class":1978},"throwHttpError",[1964,4898,1982],{"class":1974},[1964,4900,1985],{"class":1970},[1964,4902,1989],{"class":1988},[1964,4904,854],{"class":1992},[1964,4906,1995],{"class":1988},[848,4908,4909],{},[932,4910,2295],{},[4912,4913,4914,4926,4932,4937,4943,4949],"field-group",{},[4915,4916,4919],"field",{":required":1269,"name":4917,"type":4918},"log","Logger",[848,4920,4921,4922,4925],{},"A pino logger instance. Use ",[852,4923,4924],{},"getLogger().child({...})"," to create a scoped logger.",[4915,4927,4929],{":required":1269,"name":2065,"type":4928},"H3Event",[848,4930,4931],{},"The current H3 event.",[4915,4933,4934],{":required":1269,"name":852,"type":3844},[848,4935,4936],{},"An internal error code string for structured logging.",[4915,4938,4940],{":required":1269,"name":4939,"type":2338},"status",[848,4941,4942],{},"The HTTP status code.",[4915,4944,4946],{":required":1269,"name":4945,"type":3844},"title",[848,4947,4948],{},"The public error title.",[4915,4950,4952],{":required":1269,"name":4951,"type":3844},"message",[848,4953,4954],{},"The public error message.",[1955,4956,4958],{"className":1957,"code":4957,"language":1959,"meta":1960,"style":1960},"throwHttpError(log, event, 'FORBIDDEN', 403, 'Forbidden', 'Access denied')\n",[852,4959,4960],{"__ignoreMap":1960},[1964,4961,4962,4964,4966,4968,4970,4972,4974,4976,4979,4981,4983,4985,4987,4989,4992,4994,4996,4998,5001,5003],{"class":1966,"line":1967},[1964,4963,4896],{"class":2014},[1964,4965,2018],{"class":1974},[1964,4967,4917],{"class":1978},[1964,4969,1614],{"class":1974},[1964,4971,2065],{"class":1978},[1964,4973,1614],{"class":1974},[1964,4975,2218],{"class":1988},[1964,4977,4978],{"class":1992},"FORBIDDEN",[1964,4980,2218],{"class":1988},[1964,4982,1614],{"class":1974},[1964,4984,1378],{"class":2058},[1964,4986,1614],{"class":1974},[1964,4988,2218],{"class":1988},[1964,4990,4991],{"class":1992},"Forbidden",[1964,4993,2218],{"class":1988},[1964,4995,1614],{"class":1974},[1964,4997,2218],{"class":1988},[1964,4999,5000],{"class":1992},"Access denied",[1964,5002,2218],{"class":1988},[1964,5004,2230],{"class":1974},[894,5006],{},[905,5008,5010],{"id":5009},"notfoundhandler",[852,5011,5012],{},"notFoundHandler",[848,5014,5015],{},"Returns a 404 JSON response. Used as a fallback inside handlers that receive an invalid magic link or an unknown route.",[894,5017],{},[897,5019,5021],{"id":5020},"logging-middleware","Logging middleware",[905,5023,5025],{"id":5024},"httplogger",[852,5026,5027],{},"httpLogger()",[848,5029,5030,5031,5033],{},"Returns an H3 middleware function that logs every request and response as structured JSON using pino. Register it on your H3 app or Nitro instance during startup, or rely on the Nuxt module to register it automatically. See ",[869,5032,116],{"href":117}," for v1 and v2 registration examples.",[848,5035,5036],{},[932,5037,5038],{},"Features",[5040,5041,5042,5050,5064],"ul",{},[5043,5044,5045,5046,5049],"li",{},"Assigns a unique ",[852,5047,5048],{},"X-Request-Id"," header per request (or passes through an existing one)",[5043,5051,5052,5053,5056,5057,5060,5061,5063],{},"Selects log level by response status: ",[852,5054,5055],{},"info"," for 2xx\u002F3xx, ",[852,5058,5059],{},"warn"," for 4xx, ",[852,5062,1821],{}," for 5xx",[5043,5065,5066],{},"Skips logging for static asset paths",[848,5068,1420,5069,5071],{},[869,5070,116],{"href":117}," for configuring the logger level.",[894,5073],{},[897,5075,5077],{"id":5076},"wrapper-quick-reference","Wrapper quick reference",[936,5079,5080,5101],{},[939,5081,5082],{},[942,5083,5084,5087,5090,5093,5096,5098],{},[945,5085,5086],{},"Wrapper",[945,5088,5089],{},"HMAC",[945,5091,5092],{},"Token rotation",[945,5094,5095],{},"Session check",[945,5097,1423],{},[945,5099,5100],{},"Method",[952,5102,5103,5122,5139,5155,5173,5190,5206,5224,5241],{},[942,5104,5105,5109,5112,5114,5116,5119],{},[957,5106,5107],{},[852,5108,1079],{},[957,5110,5111],{},"Yes",[957,5113,5111],{},[957,5115,5111],{},[957,5117,5118],{},"No",[957,5120,5121],{},"Any",[942,5123,5124,5128,5130,5132,5135,5137],{},[957,5125,5126],{},[852,5127,1082],{},[957,5129,5111],{},[957,5131,5111],{},[957,5133,5134],{},"Yes (optional)",[957,5136,5118],{},[957,5138,5121],{},[942,5140,5141,5145,5147,5149,5151,5153],{},[957,5142,5143],{},[852,5144,3045],{},[957,5146,5118],{},[957,5148,5118],{},[957,5150,5118],{},[957,5152,5111],{},[957,5154,5121],{},[942,5156,5157,5162,5164,5166,5168,5170],{},[957,5158,5159],{},[852,5160,5161],{},"defineAuthenticatedEventPostHandlers",[957,5163,5111],{},[957,5165,5111],{},[957,5167,5111],{},[957,5169,5111],{},[957,5171,5172],{},"POST only",[942,5174,5175,5179,5181,5183,5186,5188],{},[957,5176,5177],{},[852,5178,3225],{},[957,5180,5111],{},[957,5182,5118],{},[957,5184,5185],{},"API key verification",[957,5187,5118],{},[957,5189,5121],{},[942,5191,5192,5196,5198,5200,5202,5204],{},[957,5193,5194],{},[852,5195,3236],{},[957,5197,5111],{},[957,5199,5111],{},[957,5201,5111],{},[957,5203,5111],{},[957,5205,5172],{},[942,5207,5208,5213,5215,5217,5219,5221],{},[957,5209,5210],{},[852,5211,5212],{},"defineVerifiedMagicLinkGetHandler",[957,5214,5118],{},[957,5216,5118],{},[957,5218,5118],{},[957,5220,5118],{},[957,5222,5223],{},"GET only",[942,5225,5226,5231,5233,5235,5237,5239],{},[957,5227,5228],{},[852,5229,5230],{},"defineMfaCodeVerifierHandler",[957,5232,5118],{},[957,5234,5118],{},[957,5236,5118],{},[957,5238,5111],{},[957,5240,5172],{},[942,5242,5243,5248,5250,5252,5254,5256],{},[957,5244,5245],{},[852,5246,5247],{},"defineDeduplicatedEventHandler",[957,5249,5118],{},[957,5251,5118],{},[957,5253,5118],{},[957,5255,5118],{},[957,5257,5121],{},[5259,5260,5261],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}",{"title":1960,"searchDepth":2075,"depth":2075,"links":5263},[5264,5268,5272,5276,5279,5284,5295,5299,5303,5306],{"id":899,"depth":2075,"text":900,"children":5265},[5266,5267],{"id":907,"depth":2494,"text":910},{"id":1088,"depth":2494,"text":1091},{"id":1188,"depth":2075,"text":1189,"children":5269},[5270,5271],{"id":1192,"depth":2494,"text":1195},{"id":1294,"depth":2494,"text":1297},{"id":1432,"depth":2075,"text":1433,"children":5273},[5274,5275],{"id":1436,"depth":2494,"text":1439},{"id":1500,"depth":2494,"text":1503},{"id":1712,"depth":2075,"text":1713,"children":5277},[5278],{"id":1716,"depth":2494,"text":1719},{"id":1926,"depth":2075,"text":1927,"children":5280},[5281,5282,5283],{"id":1930,"depth":2494,"text":1933},{"id":2128,"depth":2494,"text":2131},{"id":2266,"depth":2494,"text":2269},{"id":2542,"depth":2075,"text":2543,"children":5285},[5286,5287,5288,5289,5290,5291,5292,5293,5294],{"id":2557,"depth":2494,"text":2560},{"id":2742,"depth":2494,"text":2745},{"id":2928,"depth":2494,"text":2931},{"id":3034,"depth":2494,"text":3037},{"id":3199,"depth":2494,"text":3202},{"id":3463,"depth":2494,"text":3466},{"id":4192,"depth":2494,"text":4195},{"id":4391,"depth":2494,"text":4394},{"id":4584,"depth":2494,"text":4587},{"id":4662,"depth":2075,"text":4663,"children":5296},[5297],{"id":4666,"depth":2494,"text":5298},"defineAuthConfiguration(nitro, config) v1 only",{"id":4868,"depth":2075,"text":4869,"children":5300},[5301,5302],{"id":4872,"depth":2494,"text":4875},{"id":5009,"depth":2494,"text":5012},{"id":5020,"depth":2075,"text":5021,"children":5304},[5305],{"id":5024,"depth":2494,"text":5027},{"id":5076,"depth":2075,"text":5077},"Complete reference for all middleware, event handler wrappers, and request utilities exported by Auth H3 Client, covering authentication guards, CSRF enforcement, bot detection, body validation, and request enrichment.","md","i-lucide-shield",{},null,"---\ntitle: Middleware Reference\ndescription: Complete reference for all middleware, event handler wrappers, and request utilities exported by Auth H3 Client, covering authentication guards, CSRF enforcement, bot detection, body validation, and request enrichment.\nicon: i-lucide-shield\n---\n\nEvery middleware exported by `auth-h3client` is documented here. Import them from `auth-h3client\u002Fv1` or `auth-h3client\u002Fv2`. When using the Nuxt module, all middleware is auto-imported inside the `server\u002F` directory and the global chain is wired automatically. For other setups, register the global middlewares and route-level wrappers explicitly as shown in the [H3 or Nitro setup](\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro).\n\n::warning\nAll middleware depends on a resolved configuration. Call `configuration(...)` exactly once at startup before any middleware runs.\n::\n\nFor the global middleware stack order applied automatically, see [Security: Request Lifecycle](\u002Fdocs\u002Fauth-h3client\u002Fsecurity#request-lifecycle). For route-level middleware chains per registered endpoint, see the [Routes Reference](\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers).\n\n---\n\n## Authentication guards\n\nThese middleware and wrappers enforce token presence, session validity, and HMAC signature verification before your handler runs.\n\n### `ensureValidCredentials`\n\nThe core token rotation middleware. Checks the access token expiry state and rotates both the access and refresh tokens when needed by calling the IAM `\u002Fauth\u002Fuser\u002Frefresh-session` endpoint. Deduplicates concurrent rotation attempts on the same session so that only one rotation call is sent to the IAM service even if multiple requests arrive simultaneously.\n\nOn success, sets `event.context.accessToken` and `event.context.session`. Returns a 202 MFA response rather than throwing when the session requires step-up verification.\n\n**Reads**\n\n| Source | Value |\n|---|---|\n| `__Secure-a` cookie | The current access token |\n| `session` cookie | The current refresh token |\n| `canary_id` cookie | The visitor fingerprint for anomaly binding |\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.accessToken` | The current (or newly rotated) access token string |\n| `event.context.session` | The current session cookie value |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `202` | MFA challenge, step-up verification required |\n| `401` | No valid session found |\n| `429` | IAM service rate limit exceeded |\n\n::tip\nDo not call this middleware manually inside routes that already use `defineAuthenticatedEventHandler` or `defineOptionalAuthenticationEvent`. Both wrappers call it internally.\n::\n\n---\n\n### `hmacSignatureMiddleware`\n\nGenerates HMAC-SHA256 signature headers for every outbound request the module sends to the IAM service. Reads the current request method and URL path, computes the signature using the `sharedSecret` from the configuration, and stores the resulting headers on `event.context.authHeaders`. `serviceToService` reads those headers when forwarding requests to the IAM service.\n\n**Reads**\n\n| Source | Value |\n|---|---|\n| Request method | HTTP verb of the current inbound request |\n| Request URL path | Path and query string of the current inbound request |\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.authHeaders` | `{ 'X-Client-Id', 'X-Timestamp', 'X-Request-Id', 'X-Signature' }` |\n\n::note\nThis middleware only applies when `enableHmac: true` in the configuration. When disabled, no headers are added. See the [HMAC guide](\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac) for setup and the [IAM HMAC documentation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac) for the server-side signature verification.\n::\n\n---\n\n## CSRF middleware\n\n### `generateCsrfCookie`\n\nMints a signed `__Host-csrf` cookie when one is not already present on the request. The token is a 32-byte random hex string, signed with an expiring HMAC payload using `cryptoCookiesSecret`.\n\n**Cookie attributes**\n\n| Attribute | Value |\n|---|---|\n| Name | `__Host-csrf` |\n| `HttpOnly` | `false` (the client must read it to inject it as a header) |\n| `SameSite` | `Strict` |\n| `Secure` | `true` |\n| `MaxAge` | `1800` seconds |\n\nRuns automatically in global middleware. Also runs on all `GET` magic link routes to prepare a fresh cookie for the page that will be rendered.\n\n---\n\n### `verifyCsrfCookie`\n\nValidates the `__Host-csrf` cookie signature and expiry, then checks that the `X-CSRF-Token` request header contains a value that matches the token stored inside the cookie payload. The comparison uses `isSameBuffer` for timing-safe equality to prevent [timing side-channel attacks](https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTiming_attack).\n\n**Reads**\n\n| Source | Value |\n|---|---|\n| `__Host-csrf` cookie | The signed CSRF token |\n| `X-CSRF-Token` header | The raw token submitted by the client |\n\n**Responses on failure**\n\n| Status | Code | Meaning |\n|---|---|---|\n| `403` | `CSRF_MISSING` | The `__Host-csrf` cookie is absent |\n| `403` | `CSRF_INVALID` | Cookie signature or expiry check failed |\n| `403` | `TOKEN_INVALID` | Header value does not match the cookie payload |\n\nSee [CSRF](\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf) for the double-submit pattern and `executeRequest` integration.\n\n---\n\n## Bot detection middleware\n\n### `isIPValid`\n\nExtracts and validates the client IP address from the request headers using `net.isIP()`. Does not make any network call. Runs as the first step in the global middleware chain.\n\n**Reads**\n\n| Source | Value |\n|---|---|\n| Request headers | Client IP address |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `403` | Invalid or missing IP address |\n\n---\n\n### `botDetectorMiddleware`\n\nForwards the visitor fingerprint to the IAM service `\u002Fcheck` endpoint. Returns HTTP 403 when the visitor's bot score exceeds the configured ban threshold. When `enableFireWallBans: true`, calls `banIp` to block the IP at the operating system firewall level.\n\nOn the first request from a visitor, the middleware calls `\u002Fcheck` and sets `__Host-dr_i_n`, a signed host-only cookie. On every subsequent request where both `__Host-dr_i_n` and `canary_id` are present and the `__Host-dr_i_n` signature is valid, the middleware skips calling the IAM service entirely. If the signature verification fails, the request is rejected with 403 and code `CANARY_TEMPERING`.\n\n::warning\nThis middleware must remain enabled whenever the IAM service is in use. The `canary_id` cookie issued by the IAM service and the `__Host-dr_i_n` cookie set by this middleware are required for session operations including token rotation. Disabling bot detection means these cookies are never set and subsequent IAM calls will fail.\n::\n\n**Reads**\n\n| Source | Value |\n|---|---|\n| `canary_id` cookie | Visitor fingerprint forwarded to IAM `\u002Fcheck` |\n| `__Host-dr_i_n` cookie | Signed tracking cookie: if present and valid, skips IAM call |\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `__Host-dr_i_n` cookie | HMAC-signed tracking cookie (`HttpOnly`, `SameSite: Strict`, `Secure`, 2-hour TTL) |\n| `event.context.trackingResult` | Parsed JSON response from the IAM `\u002Fcheck` endpoint |\n\n**Responses on failure**\n\n| Status | Code | Meaning |\n|---|---|---|\n| `403` | `NOT_ALLOWED` | Visitor bot score exceeds ban threshold |\n| `403` | `CANARY_TEMPERING` | `__Host-dr_i_n` cookie signature verification failed |\n| `502` | `AUTH_SERVER_ERROR` | IAM `\u002Fcheck` endpoint unreachable |\n\nSee [Bot Detection](\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection) for the full flow and the `enableFireWallBans` configuration.\n\n---\n\n## OAuth middleware\n\n### `OAuthTokensValidations`\n\nValidates the OAuth provider callback before the success handler runs. Reads the authorization code and state from the request (query string for GET, form body for POST), verifies the signed state cookie, and for OIDC providers verifies the ID token signature against the provider's JWKS endpoint, the `nonce`, `azp`, and `at_hash` claims, and that `userinfo.sub` matches the ID token subject. On success, sets `event.context.provider`, `event.context.userData`, and `event.context.accessToken`.\n\nCalled automatically by `useOAuthRoutes` as the first middleware in the `\u002Foauth\u002Fcallback\u002F:provider` chain. Export it directly when building a custom OAuth callback route.\n\n**Reads**\n\n| Source | Value |\n|---|---|\n| `state{provider}` cookie | Signed state token for CSRF protection during the OAuth flow |\n| `pkce_v{provider}` cookie | PKCE code verifier (when `supportPKCE: true`) |\n| `nonce{provider}` cookie | Nonce for OIDC ID token verification |\n| Query \u002F form body | `code`, `state`, `error`, `iss` |\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.provider` | The matched provider name from configuration |\n| `event.context.userData` | User info object from the OAuth provider |\n| `event.context.accessToken` | OAuth access token from the provider |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `302` | OAuth error from provider, redirects to `redirectUrlOnError` |\n| `400` | State mismatch, missing code, or token validation failure |\n| `500` | Token exchange or JWKS verification error |\n\nSee [OAuth and OIDC](\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth) for provider configuration and the full OIDC verification sequence.\n\n---\n\n## Request validation middleware\n\n### `limitBytes(maxBytes)`\n\nFactory function. Returns a middleware that reads the raw request body and throws HTTP 403 with code `INVALID_CONTENT_TYPE` if the byte length exceeds `maxBytes`. Pass `0` to reject any body entirely. Applied before JSON parsing, so oversized payloads cannot consume memory during deserialization.\n\n**Import**\n\n```ts\nimport { limitBytes } from 'auth-h3client'\n```\n\n**Signature**\n\n```ts\nfunction limitBytes(maxBytes: number): EventHandler\n```\n\n**Usage**\n\n```ts\nawait limitBytes(1024)(event)  \u002F\u002F Reject bodies over 1 KB\nawait limitBytes(0)(event)     \u002F\u002F Reject any body\n```\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `403` | Body exceeds `maxBytes` (error code: `INVALID_CONTENT_TYPE`) |\n\n---\n\n### `contentType(expected)`\n\nFactory function. Returns a middleware that validates the `Content-Type` request header against the expected value. Throws HTTP 403 if the header is missing or does not match.\n\n**Import**\n\n```ts\nimport { contentType } from 'auth-h3client'\n```\n\n**Signature**\n\n```ts\nfunction contentType(expected: string): EventHandler\n```\n\n**Usage**\n\n```ts\nawait contentType('application\u002Fjson')(event)\n```\n\n**Responses on failure**\n\n| Status | Code | Meaning |\n|---|---|---|\n| `403` | `INVALID_CONTENT_TYPE` | Content-Type missing or does not match expected value |\n\n---\n\n### `defineByteLimiterHandler(handler, limitBytesTo, method)`\n\nHigher-order wrapper that asserts the request method, reads the raw request\nbody exactly once, rejects bodies larger than `limitBytesTo`, parses JSON into\n`event.context.body`, and then calls your handler. The API token management\nwrapper uses this parser so request-size checks happen before any\naction runs.\n\nIf the request body is empty, the wrapper leaves `event.context.body`\nundefined and continues. If `Content-Length` is present and already exceeds the\nlimit, the request is rejected before the full body is processed.\n\n**Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| `handler` | `EventHandler` | Your H3 handler |\n| `limitBytesTo` | `number` | Maximum accepted request body size in bytes |\n| `method` | `'POST' \\| 'PUT' \\| 'PATCH'` | The only HTTP method accepted by the wrapper |\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.body` | Parsed JSON object, or `undefined` for an empty body |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `400` | JSON parse failed |\n| `403` | Body exceeds `limitBytesTo` |\n| `405` | Wrong HTTP method |\n\n```ts [server\u002Fapi\u002Faccount\u002Fsettings.post.ts]\nexport default defineByteLimiterHandler(async (event) => {\n  const body = event.context.body\n  return { ok: true, body }\n}, 2048, 'POST')\n```\n\n---\n\n## Event handler wrappers\n\nWrappers are higher-order functions that accept your handler and return a new handler with enforcement built in. Import them from `auth-h3client\u002Fv1` or `auth-h3client\u002Fv2`. When using the Nuxt module, they are auto-imported inside the `server\u002F` directory.\n\n### `defineAuthenticatedEventHandler(handler)`\n\nThe standard wrapper for protected routes. Runs `hmacSignatureMiddleware`, then `ensureValidCredentials` (token rotation), then calls `getCachedUserData` against the IAM service. Populates `event.context.authorizedData` with the verified session data. Throws HTTP 401 on failure. Returns HTTP 202 with `mfaRequired` when the session requires step-up verification.\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.authorizedData` | `{ authorized, userId?, roles?, ipAddress, userAgent, date, reason?, error?, message? }` |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `202` | MFA challenge, step-up verification required |\n| `401` | Not authenticated or invalid session |\n| `429` | Rate limit exceeded |\n| `500` | IAM service error |\n\n```ts [server\u002Fapi\u002Fprofile.get.ts]\nexport default defineAuthenticatedEventHandler(async (event) => {\n  const { userId, roles } = event.context.authorizedData\n  return { userId, roles }\n})\n```\n\n---\n\n### `defineOptionalAuthenticationEvent(handler)`\n\nAttempts authentication using the same internal pipeline as `defineAuthenticatedEventHandler`. On success, populates `event.context.authorizedData`. On any auth failure other than a rate limit, sets `event.context.authorizedData` to `undefined` and continues to your handler as a guest. HTTP 429 responses are still propagated.\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.authorizedData` | Verified session data, or `undefined` for unauthenticated requests |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `429` | Rate limit exceeded (always propagated, even for guests) |\n\n```ts [server\u002Fapi\u002Fposts\u002F[id].get.ts]\nexport default defineOptionalAuthenticationEvent(async (event) => {\n  const user = event.context.authorizedData \u002F\u002F undefined for guests\n  return user ? { content: 'private', userId: user.userId } : { content: 'public' }\n})\n```\n\n---\n\n### `defineVerifiedCsrfHandler(handler)`\n\nCalls `verifyCsrfCookie` before running the handler. Does not check authentication. Use this when you need CSRF protection on a route that is accessible to both guests and authenticated users.\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `403` | CSRF cookie missing, invalid, or header mismatch |\n\n```ts [server\u002Fapi\u002Fcontact.post.ts]\nexport default defineVerifiedCsrfHandler(async (event) => {\n  const body = await readBody(event)\n  return { ok: true }\n})\n```\n\n---\n\n### `defineAuthenticatedEventPostHandlers(handler)`\n\nCombines `defineAuthenticatedEventHandler`, `defineVerifiedCsrfHandler`, and `assertMethod('POST')` in that order. The correct choice for any state-changing endpoint that requires authentication.\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `202` | MFA challenge |\n| `401` | Not authenticated |\n| `403` | CSRF failure or wrong HTTP method |\n| `429` | Rate limit exceeded |\n\n```ts [server\u002Fapi\u002Faccount\u002Fsettings.post.ts]\nexport default defineAuthenticatedEventPostHandlers(async (event) => {\n  const { userId } = event.context.authorizedData\n  await updateSettings(userId, await readBody(event))\n  return { ok: true }\n})\n```\n\n---\n\n### `defineAuthenticatePublicApi(handler, userPrivilege)`\n\nProtects a route with API token verification. The wrapper\nreads `X-API-KEY` from the incoming request, forwards it to the IAM\n`\u002Fapi\u002Fpublic\u002Fverify` endpoint together with the privilege floor defined by\n`userPrivilege`, and only then calls your handler.\n\n::warning\nDo not place routes wrapped with `defineAuthenticatePublicApi` behind the Nuxt\nglobal auth middleware or a manual `isIPValid -> botDetectorMiddleware ->\ngenerateCsrfCookie` chain. These requests are machine-to-machine API-key\nverification calls, so applying the browser session middleware can lead to\nbot-detector rate limits or bans. Keep the global middleware for regular auth\nroutes, `getApiListsController`, and `defineApiManagementHandler`, because\nthose browser session flows still need bot detection and the CSRF cookie.\n::\n\nOn success, the wrapper stores the verified token metadata on\n`event.context.apiVerification`. On failure, it returns a normalized JSON\nresponse instead of throwing.\n\n**Reads**\n\n| Source | Value |\n|---|---|\n| `X-API-KEY` header | Raw API token presented by the caller |\n| `userPrivilege` argument | Minimum privilege level your route requires |\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.apiVerification` | `{ name, tokenId, userId, createdAt, expiresAt, lastUsed, usageCount, providedPrivilege }` |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `401` | API key missing |\n| `429` | Too many invalid verification attempts |\n| IAM status | IAM verification rejected the token |\n| `500` | IAM service unreachable or returned no response |\n\n```ts [server\u002Fapi\u002Fpublic\u002Fdata.get.ts]\nexport default defineAuthenticatePublicApi(async (event) => {\n  const token = event.context.apiVerification\n  return { ok: true, tokenId: token.tokenId, userId: token.userId }\n}, 'demo')\n```\n\n---\n\n### `defineApiManagementHandler(handler, allowedPrivilege, updateToNewPrivilege?)`\n\nBuilds a complete authenticated POST pipeline for API token management routes.\nIt wraps `defineAuthenticatedEventPostHandlers(...)` with\n`defineByteLimiterHandler(..., 2000, 'POST')`, validates\n`event.context.params` against the supported actions, and then proxies the\nrequest to the IAM API token management endpoints. This means the raw request\nbody is size-checked and parsed into `event.context.body` before the\naction-specific logic runs.\n\nSupported actions are `new-token`, `revoke`, `metadata`, `rotate`,\n`ip-restriction-update`, and `privilege-update`. \n\n::note\nThe wrapper rejects\n`list-metadata` on POST because token listing is handled by\n`getApiListsController` over GET.\n::\n\nFor every action except `new-token`, the wrapper first calls\n`\u002Fapi\u002Fmanage\u002Flist-metadata` to resolve the token's `public_identifier`. This\nmeans the client submits only `tokenId`, and the wrapper maps that token ID to\n`publicIdentifier` and `name` before it calls IAM.\n\n`allowedPrivilege` controls the privilege that will be assigned to newly\ncreated tokens. `updateToNewPrivilege` is optional, but it must be provided if\nyou want the `privilege-update` action to succeed.\n\n**Accepted request bodies**\n\n| Action | Body accepted by `defineApiManagementHandler` | IAM body sent by the wrapper | See |\n|---|---|---|---|\n| `new-token` | `{ name, prefix, ipv4?, expires? }` | `{ name, prefix, ipv4?, expires?, privilege: allowedPrivilege }` | [Creating Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation) |\n| `revoke` | `{ tokenId }` | `{ tokenId, publicIdentifier, name }` | [Revocation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation) |\n| `metadata` | `{ tokenId }` | `{ tokenId, publicIdentifier, name }` | [Metadata](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata) |\n| `rotate` | `{ tokenId }` | `{ tokenId, publicIdentifier, name }` | [Rotation](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation) |\n| `ip-restriction-update` | `{ tokenId, ipv4? }` | `{ tokenId, publicIdentifier, name, ipv4? }` | [IP Restriction](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates) |\n| `privilege-update` | `{ tokenId }` | `{ tokenId, publicIdentifier, name, newPrivilege: updateToNewPrivilege }` | [Privileges](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege) |\n| `list-metadata` | Rejected on POST | Not sent | [Token Listing](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist) |\n\nThe wrapper schema requires `prefix` on `new-token` and validates\n`ip-restriction-update` with an optional `ipv4` array.\nThe client request body never supplies `privilege` or `newPrivilege`. Your\napplication decides those values through the `allowedPrivilege` and\n`updateToNewPrivilege` arguments.\n\nOn `new-token`, IAM returns `rawPublicId` in addition to the raw key. The\nwrapper removes `rawPublicId` before it populates `event.context.newApiToken`.\n\n**Sets**\n\n| Action | `event.context` field | Shape |\n|---|---|---|\n| `new-token` | `newApiToken` | `{ rawApiKey, expiresAt }` |\n| `ip-restriction-update` | `ipRestrictionUpdate` | `{ msg }` |\n| `privilege-update` | `privilegeUpdate` | `{ msg }` |\n| `revoke` | `revoke` | `string` or `{ msg, invalidedTokenId, userId }` |\n| `metadata` | `extensiveMetadata` | `{ tokenMeta, counts }` |\n| `rotate` | `rotate` | `{ msg, newRawToken, newExpiry }` |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `202` | MFA challenge pending |\n| `400` | Invalid JSON body or `list-metadata` attempted on POST |\n| `401` | Session missing, unauthorized action, or token not owned by the user |\n| `403` | CSRF failure, oversized body, or `privilege-update` not permitted |\n| `404` | Invalid route action or invalid action-specific input |\n| `429` | Rate limited by IAM |\n| IAM status | IAM action failed and returned `{ ok: false, reason }` |\n\n```ts [server\u002Fapi\u002Fauth\u002Fapi-tokens\u002F[action].post.ts]\nexport default defineApiManagementHandler(async (event) => {\n  const action = event.context.params?.action\n\n  if (action === 'new-token') {\n    return { ok: true, data: event.context.newApiToken }\n  }\n\n  if (action === 'metadata') {\n    return { ok: true, data: event.context.extensiveMetadata }\n  }\n\n  return { ok: true }\n}, 'demo', 'protected')\n```\n\n---\n\n### `defineVerifiedMagicLinkGetHandler(handler)`\n\nValidates incoming magic link query parameters before running the handler. Enforces GET method, checks that the `canary_id`, `session`, and `__Secure-a` cookies are present, validates the query string against `VerificationLinkSchema` (`visitor`, `token`, `random`, `reason`), and calls the IAM service to verify the link. Populates `event.context.link` and `event.context.reason` on success.\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.link` | The link action type string (e.g., `'Custom MFA'`) |\n| `event.context.reason` | The link reason string |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `400` | Link invalid, expired, or already used (forwarded from IAM) |\n| `405` | Not a GET request |\n| `401` | Required session cookies missing |\n\n```ts [server\u002Fapi\u002Fauth\u002Fverify-custom.get.ts]\nexport default defineVerifiedMagicLinkGetHandler(async (event) => {\n  const { reason } = event.context\n  return { ok: true, reason }\n})\n```\n\n::note\nThis wrapper does not validate a CSRF token. GET requests arrive directly from an email link, where no `__Host-csrf` cookie will be present yet.\n::\n\n---\n\n### `defineMfaCodeVerifierHandler(handler)`\n\nValidates an MFA code submission after a magic link is verified. Enforces POST method, verifies the CSRF cookie, limits the request body to 8 MB, validates link query parameters against `VerificationLinkSchema`, reads `event.context.body.code` (a 7-digit numeric string), and sends the code to the IAM service for verification. On success, new tokens are issued and applied to the response cookies, and `event.context.limitedMetaData` is populated with the verified session metadata before your handler runs.\n\n**Reads**\n\n| Source | Value |\n|---|---|\n| `event.context.body.code` | The 7-digit OTP code submitted by the user |\n| Query parameters | `token`, `random`, `reason`, `visitor` |\n\n**Sets**\n\n| Target | Value |\n|---|---|\n| `event.context.limitedMetaData` | Verified session metadata returned by the IAM service |\n\n**Responses on failure**\n\n| Status | Meaning |\n|---|---|\n| `400` | Malformed code, invalid or expired code, or link parameter mismatch |\n| `403` | CSRF failure or user banned |\n| `405` | Not a POST request |\n| `403` | Body exceeds 8 MB (error code: `INVALID_CONTENT_TYPE`) |\n\n```ts [server\u002Fapi\u002Fauth\u002Fverify-code.post.ts]\nexport default defineMfaCodeVerifierHandler(async (event) => {\n  \u002F\u002F Code verified, new tokens already applied to the response\n  return { ok: true }\n})\n```\n\n---\n\n### `defineDeduplicatedEventHandler(handler)`\n\nWraps a handler with request-level deduplication using `lockAsyncAction`. Concurrent requests with the same session identity are coalesced so that only one execution runs at a time. Results are cached briefly to serve requests that arrive after the first completes.\n\nThe built-in login, logout, signup, password reset, and MFA handlers already use this wrapper internally.\n\n```ts [server\u002Fapi\u002Fcheckout.post.ts]\nexport default defineDeduplicatedEventHandler(async (event) => {\n  await processCheckout(event)\n  return { ok: true }\n})\n```\n\n---\n\n## Setup\n\n### `defineAuthConfiguration(nitro, config)` :badge[v1 only]\n\nOne-call Nitro plugin setup function. Validates and freezes the configuration, registers `httpLogger`, mounts all four route registrars (`useAuthRoutes`, `useOAuthRoutes`, `bounceRouter`, `magicLinksRouter` with `'api'` prefix) on `nitro.router`, and logs a startup confirmation. Use this inside a Nitro plugin to wire everything in a single call instead of registering each piece manually.\n\n```ts [server\u002Fplugins\u002Fauth.ts]\nimport { defineAuthConfiguration } from 'auth-h3client\u002Fv1'\n\nexport default defineNitroPlugin((nitro) => {\n  defineAuthConfiguration(nitro, {\n    server: { auth_location: 'https:\u002F\u002Fiam.example.com' },\n    \u002F\u002F ...\n  })\n})\n```\n\n**Parameters**\n\n| Parameter | Type | Description |\n|---|---|---|\n| `nitro` | `NitroApp` | The Nitro app instance provided by the plugin callback |\n| `config` | `Configuration` | The full configuration object, passed to `configuration(config)` internally |\n\n::warning\nThis function is only exported from `auth-h3client\u002Fv1`. For H3 v2 setups, call `configuration()` and each route registrar individually.\n::\n\n---\n\n## Error utilities\n\n### `throwHttpError(log, event, code, status, title, message)`\n\nLogs an error with structured context and throws an H3 error with the given status, title, and message. Use this inside custom handlers to produce consistent JSON error responses.\n\n**Import**\n\n```ts\nimport { throwHttpError } from 'auth-h3client'\n```\n\n**Parameters**\n\n::field-group\n  ::field{name=\"log\" type=\"Logger\" required}\n  A pino logger instance. Use `getLogger().child({...})` to create a scoped logger.\n  ::\n  ::field{name=\"event\" type=\"H3Event\" required}\n  The current H3 event.\n  ::\n  ::field{name=\"code\" type=\"string\" required}\n  An internal error code string for structured logging.\n  ::\n  ::field{name=\"status\" type=\"number\" required}\n  The HTTP status code.\n  ::\n  ::field{name=\"title\" type=\"string\" required}\n  The public error title.\n  ::\n  ::field{name=\"message\" type=\"string\" required}\n  The public error message.\n  ::\n::\n\n```ts\nthrowHttpError(log, event, 'FORBIDDEN', 403, 'Forbidden', 'Access denied')\n```\n\n---\n\n### `notFoundHandler`\n\nReturns a 404 JSON response. Used as a fallback inside handlers that receive an invalid magic link or an unknown route.\n\n---\n\n## Logging middleware\n\n### `httpLogger()`\n\nReturns an H3 middleware function that logs every request and response as structured JSON using pino. Register it on your H3 app or Nitro instance during startup, or rely on the Nuxt module to register it automatically. See [Logging](\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging) for v1 and v2 registration examples.\n\n**Features**\n\n- Assigns a unique `X-Request-Id` header per request (or passes through an existing one)\n- Selects log level by response status: `info` for 2xx\u002F3xx, `warn` for 4xx, `error` for 5xx\n- Skips logging for static asset paths\n\nSee [Logging](\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging) for configuring the logger level.\n\n---\n\n## Wrapper quick reference\n\n| Wrapper | HMAC | Token rotation | Session check | CSRF | Method |\n|---|---|---|---|---|---|\n| `defineAuthenticatedEventHandler` | Yes | Yes | Yes | No | Any |\n| `defineOptionalAuthenticationEvent` | Yes | Yes | Yes (optional) | No | Any |\n| `defineVerifiedCsrfHandler` | No | No | No | Yes | Any |\n| `defineAuthenticatedEventPostHandlers` | Yes | Yes | Yes | Yes | POST only |\n| `defineAuthenticatePublicApi` | Yes | No | API key verification | No | Any |\n| `defineApiManagementHandler` | Yes | Yes | Yes | Yes | POST only |\n| `defineVerifiedMagicLinkGetHandler` | No | No | No | No | GET only |\n| `defineMfaCodeVerifierHandler` | No | No | No | Yes | POST only |\n| `defineDeduplicatedEventHandler` | No | No | No | No | Any |\n",{"title":206,"description":5307},"9TUjb1aIT3kNpEXMfPN4Bx0hOheEBOZsg0wT1FNrQwg",[5316,5317],{"title":202,"path":203,"stem":204,"children":-1},{"title":210,"path":211,"stem":212,"children":-1},{"id":843,"title":206,"body":5319,"description":5307,"extension":5308,"icon":5309,"meta":9018,"module":5311,"navigation":8,"path":207,"rawbody":5312,"seo":9019,"stem":208,"__hash__":5314},{"type":845,"value":5320,"toc":8974},[5321,5333,5339,5345,5347,5349,5351,5355,5359,5365,5369,5405,5409,5437,5441,5477,5485,5487,5491,5499,5503,5527,5531,5553,5563,5565,5567,5571,5577,5581,5641,5645,5647,5651,5662,5666,5694,5698,5750,5756,5758,5760,5764,5768,5772,5790,5794,5814,5816,5820,5828,5842,5850,5854,5884,5888,5924,5928,5982,5988,5990,5992,5996,6012,6018,6022,6074,6078,6114,6118,6156,6160,6162,6164,6168,6176,6180,6202,6206,6230,6234,6274,6278,6302,6304,6308,6312,6316,6338,6342,6366,6370,6394,6398,6424,6426,6430,6436,6442,6446,6496,6500,6522,6526,6564,6642,6644,6646,6654,6658,6670,6674,6696,6700,6744,6814,6816,6820,6830,6834,6856,6860,6880,6980,6982,6986,6990,6994,7014,7076,7078,7082,7090,7094,7138,7226,7228,7232,7240,7252,7256,7260,7288,7292,7314,7318,7360,7454,7456,7460,7470,7484,7492,7506,7514,7518,7658,7676,7686,7690,7792,7796,7868,8066,8068,8072,8094,8098,8128,8132,8168,8234,8240,8242,8246,8254,8258,8292,8296,8316,8320,8366,8414,8416,8420,8424,8426,8482,8484,8486,8492,8508,8594,8598,8638,8646,8648,8650,8654,8656,8660,8682,8686,8714,8760,8762,8766,8768,8770,8772,8776,8780,8784,8800,8804,8806,8808,8972],[848,5322,850,5323,855,5325,859,5327,863,5329,867,5331,872],{},[852,5324,854],{},[852,5326,858],{},[852,5328,862],{},[852,5330,866],{},[869,5332,871],{"href":177},[874,5334,5335],{},[848,5336,878,5337,882],{},[852,5338,881],{},[848,5340,885,5341,890,5343,872],{},[869,5342,889],{"href":888},[869,5344,202],{"href":203},[894,5346],{},[897,5348,900],{"id":899},[848,5350,903],{},[905,5352,5353],{"id":907},[852,5354,910],{},[848,5356,913,5357,917],{},[852,5358,916],{},[848,5360,920,5361,924,5363,928],{},[852,5362,923],{},[852,5364,927],{},[848,5366,5367],{},[932,5368,934],{},[936,5370,5371,5379],{},[939,5372,5373],{},[942,5374,5375,5377],{},[945,5376,947],{},[945,5378,950],{},[952,5380,5381,5389,5397],{},[942,5382,5383,5387],{},[957,5384,5385,962],{},[852,5386,961],{},[957,5388,965],{},[942,5390,5391,5395],{},[957,5392,5393,962],{},[852,5394,972],{},[957,5396,975],{},[942,5398,5399,5403],{},[957,5400,5401,962],{},[852,5402,982],{},[957,5404,985],{},[848,5406,5407],{},[932,5408,990],{},[936,5410,5411,5419],{},[939,5412,5413],{},[942,5414,5415,5417],{},[945,5416,999],{},[945,5418,950],{},[952,5420,5421,5429],{},[942,5422,5423,5427],{},[957,5424,5425],{},[852,5426,923],{},[957,5428,1012],{},[942,5430,5431,5435],{},[957,5432,5433],{},[852,5434,927],{},[957,5436,1021],{},[848,5438,5439],{},[932,5440,1026],{},[936,5442,5443,5451],{},[939,5444,5445],{},[942,5446,5447,5449],{},[945,5448,1035],{},[945,5450,1038],{},[952,5452,5453,5461,5469],{},[942,5454,5455,5459],{},[957,5456,5457],{},[852,5458,1047],{},[957,5460,1050],{},[942,5462,5463,5467],{},[957,5464,5465],{},[852,5466,1057],{},[957,5468,1060],{},[942,5470,5471,5475],{},[957,5472,5473],{},[852,5474,1067],{},[957,5476,1070],{},[1072,5478,5479],{},[848,5480,1076,5481,859,5483,1083],{},[852,5482,1079],{},[852,5484,1082],{},[894,5486],{},[905,5488,5489],{"id":1088},[852,5490,1091],{},[848,5492,1094,5493,1098,5495,1102,5497,1106],{},[852,5494,1097],{},[852,5496,1101],{},[852,5498,1105],{},[848,5500,5501],{},[932,5502,934],{},[936,5504,5505,5513],{},[939,5506,5507],{},[942,5508,5509,5511],{},[945,5510,947],{},[945,5512,950],{},[952,5514,5515,5521],{},[942,5516,5517,5519],{},[957,5518,1127],{},[957,5520,1130],{},[942,5522,5523,5525],{},[957,5524,1135],{},[957,5526,1138],{},[848,5528,5529],{},[932,5530,990],{},[936,5532,5533,5541],{},[939,5534,5535],{},[942,5536,5537,5539],{},[945,5538,999],{},[945,5540,950],{},[952,5542,5543],{},[942,5544,5545,5549],{},[957,5546,5547],{},[852,5548,1101],{},[957,5550,5551],{},[852,5552,1165],{},[1167,5554,5555],{},[848,5556,1171,5557,1175,5559,1179,5561,1183],{},[852,5558,1174],{},[869,5560,1178],{"href":181},[869,5562,1182],{"href":456},[894,5564],{},[897,5566,1189],{"id":1188},[905,5568,5569],{"id":1192},[852,5570,1195],{},[848,5572,1198,5573,1202,5575,872],{},[852,5574,1201],{},[852,5576,1205],{},[848,5578,5579],{},[932,5580,1210],{},[936,5582,5583,5591],{},[939,5584,5585],{},[942,5586,5587,5589],{},[945,5588,1219],{},[945,5590,950],{},[952,5592,5593,5601,5611,5621,5631],{},[942,5594,5595,5597],{},[957,5596,1228],{},[957,5598,5599],{},[852,5600,1201],{},[942,5602,5603,5607],{},[957,5604,5605],{},[852,5606,1239],{},[957,5608,5609,1245],{},[852,5610,1244],{},[942,5612,5613,5617],{},[957,5614,5615],{},[852,5616,1252],{},[957,5618,5619],{},[852,5620,1257],{},[942,5622,5623,5627],{},[957,5624,5625],{},[852,5626,1264],{},[957,5628,5629],{},[852,5630,1269],{},[942,5632,5633,5637],{},[957,5634,5635],{},[852,5636,1276],{},[957,5638,5639,1282],{},[852,5640,1281],{},[848,5642,1285,5643,1289],{},[852,5644,1288],{},[894,5646],{},[905,5648,5649],{"id":1294},[852,5650,1297],{},[848,5652,1300,5653,1303,5655,1307,5657,1311,5659,872],{},[852,5654,1201],{},[852,5656,1306],{},[852,5658,1310],{},[869,5660,1317],{"href":1314,"rel":5661},[1316],[848,5663,5664],{},[932,5665,934],{},[936,5667,5668,5676],{},[939,5669,5670],{},[942,5671,5672,5674],{},[945,5673,947],{},[945,5675,950],{},[952,5677,5678,5686],{},[942,5679,5680,5684],{},[957,5681,5682,962],{},[852,5683,1201],{},[957,5685,1342],{},[942,5687,5688,5692],{},[957,5689,5690,1349],{},[852,5691,1306],{},[957,5693,1352],{},[848,5695,5696],{},[932,5697,1026],{},[936,5699,5700,5710],{},[939,5701,5702],{},[942,5703,5704,5706,5708],{},[945,5705,1035],{},[945,5707,1367],{},[945,5709,1038],{},[952,5711,5712,5726,5738],{},[942,5713,5714,5718,5722],{},[957,5715,5716],{},[852,5717,1378],{},[957,5719,5720],{},[852,5721,1383],{},[957,5723,1386,5724,1389],{},[852,5725,1201],{},[942,5727,5728,5732,5736],{},[957,5729,5730],{},[852,5731,1378],{},[957,5733,5734],{},[852,5735,1400],{},[957,5737,1403],{},[942,5739,5740,5744,5748],{},[957,5741,5742],{},[852,5743,1378],{},[957,5745,5746],{},[852,5747,1414],{},[957,5749,1417],{},[848,5751,1420,5752,1424,5754,1427],{},[869,5753,1423],{"href":98},[852,5755,160],{},[894,5757],{},[897,5759,1433],{"id":1432},[905,5761,5762],{"id":1436},[852,5763,1439],{},[848,5765,1442,5766,1446],{},[852,5767,1445],{},[848,5769,5770],{},[932,5771,934],{},[936,5773,5774,5782],{},[939,5775,5776],{},[942,5777,5778,5780],{},[945,5779,947],{},[945,5781,950],{},[952,5783,5784],{},[942,5785,5786,5788],{},[957,5787,1467],{},[957,5789,1470],{},[848,5791,5792],{},[932,5793,1026],{},[936,5795,5796,5804],{},[939,5797,5798],{},[942,5799,5800,5802],{},[945,5801,1035],{},[945,5803,1038],{},[952,5805,5806],{},[942,5807,5808,5812],{},[957,5809,5810],{},[852,5811,1378],{},[957,5813,1495],{},[894,5815],{},[905,5817,5818],{"id":1500},[852,5819,1503],{},[848,5821,1506,5822,1510,5824,1514,5826,1518],{},[852,5823,1509],{},[852,5825,1513],{},[852,5827,1517],{},[848,5829,1521,5830,1524,5832,1528,5834,924,5836,1533,5838,1536,5840,872],{},[852,5831,1509],{},[852,5833,1527],{},[852,5835,1527],{},[852,5837,982],{},[852,5839,1527],{},[852,5841,1539],{},[874,5843,5844],{},[848,5845,1544,5846,1547,5848,1550],{},[852,5847,982],{},[852,5849,1527],{},[848,5851,5852],{},[932,5853,934],{},[936,5855,5856,5864],{},[939,5857,5858],{},[942,5859,5860,5862],{},[945,5861,947],{},[945,5863,950],{},[952,5865,5866,5876],{},[942,5867,5868,5872],{},[957,5869,5870,962],{},[852,5871,982],{},[957,5873,1575,5874],{},[852,5875,1509],{},[942,5877,5878,5882],{},[957,5879,5880,962],{},[852,5881,1527],{},[957,5883,1586],{},[848,5885,5886],{},[932,5887,990],{},[936,5889,5890,5898],{},[939,5891,5892],{},[942,5893,5894,5896],{},[945,5895,999],{},[945,5897,950],{},[952,5899,5900,5914],{},[942,5901,5902,5906],{},[957,5903,5904,962],{},[852,5905,1527],{},[957,5907,1611,5908,1614,5910,1614,5912,1620],{},[852,5909,1239],{},[852,5911,1617],{},[852,5913,1264],{},[942,5915,5916,5920],{},[957,5917,5918],{},[852,5919,1627],{},[957,5921,1630,5922,1633],{},[852,5923,1509],{},[848,5925,5926],{},[932,5927,1026],{},[936,5929,5930,5940],{},[939,5931,5932],{},[942,5933,5934,5936,5938],{},[945,5935,1035],{},[945,5937,1367],{},[945,5939,1038],{},[952,5941,5942,5954,5968],{},[942,5943,5944,5948,5952],{},[957,5945,5946],{},[852,5947,1378],{},[957,5949,5950],{},[852,5951,1662],{},[957,5953,1665],{},[942,5955,5956,5960,5964],{},[957,5957,5958],{},[852,5959,1378],{},[957,5961,5962],{},[852,5963,1539],{},[957,5965,5966,1680],{},[852,5967,1527],{},[942,5969,5970,5974,5978],{},[957,5971,5972],{},[852,5973,1687],{},[957,5975,5976],{},[852,5977,1692],{},[957,5979,1695,5980,1698],{},[852,5981,1509],{},[848,5983,1420,5984,1703,5986,1707],{},[869,5985,33],{"href":109},[852,5987,1706],{},[894,5989],{},[897,5991,1713],{"id":1712},[905,5993,5994],{"id":1716},[852,5995,1719],{},[848,5997,1722,5998,1614,6000,1729,6002,1733,6004,1737,6006,1614,6008,1729,6010,872],{},[852,5999,1725],{},[852,6001,1728],{},[852,6003,1732],{},[852,6005,1736],{},[852,6007,1740],{},[852,6009,1743],{},[852,6011,923],{},[848,6013,1748,6014,1752,6016,1756],{},[852,6015,1751],{},[852,6017,1755],{},[848,6019,6020],{},[932,6021,934],{},[936,6023,6024,6032],{},[939,6025,6026],{},[942,6027,6028,6030],{},[945,6029,947],{},[945,6031,950],{},[952,6033,6034,6042,6052,6060],{},[942,6035,6036,6040],{},[957,6037,6038,962],{},[852,6039,1779],{},[957,6041,1782],{},[942,6043,6044,6048],{},[957,6045,6046,962],{},[852,6047,1789],{},[957,6049,1792,6050,1796],{},[852,6051,1795],{},[942,6053,6054,6058],{},[957,6055,6056,962],{},[852,6057,1803],{},[957,6059,1806],{},[942,6061,6062,6064],{},[957,6063,1811],{},[957,6065,6066,1614,6068,1614,6070,1614,6072],{},[852,6067,852],{},[852,6069,1818],{},[852,6071,1821],{},[852,6073,1824],{},[848,6075,6076],{},[932,6077,990],{},[936,6079,6080,6088],{},[939,6081,6082],{},[942,6083,6084,6086],{},[945,6085,999],{},[945,6087,950],{},[952,6089,6090,6098,6106],{},[942,6091,6092,6096],{},[957,6093,6094],{},[852,6095,1740],{},[957,6097,1849],{},[942,6099,6100,6104],{},[957,6101,6102],{},[852,6103,1743],{},[957,6105,1858],{},[942,6107,6108,6112],{},[957,6109,6110],{},[852,6111,923],{},[957,6113,1867],{},[848,6115,6116],{},[932,6117,1026],{},[936,6119,6120,6128],{},[939,6121,6122],{},[942,6123,6124,6126],{},[945,6125,1035],{},[945,6127,1038],{},[952,6129,6130,6140,6148],{},[942,6131,6132,6136],{},[957,6133,6134],{},[852,6135,1890],{},[957,6137,1893,6138],{},[852,6139,1896],{},[942,6141,6142,6146],{},[957,6143,6144],{},[852,6145,1903],{},[957,6147,1906],{},[942,6149,6150,6154],{},[957,6151,6152],{},[852,6153,1913],{},[957,6155,1916],{},[848,6157,1420,6158,1921],{},[869,6159,105],{"href":106},[894,6161],{},[897,6163,1927],{"id":1926},[905,6165,6166],{"id":1930},[852,6167,1933],{},[848,6169,1936,6170,1940,6172,1944,6174,1948],{},[852,6171,1939],{},[852,6173,1943],{},[852,6175,1947],{},[848,6177,6178],{},[932,6179,1953],{},[1955,6181,6182],{"className":1957,"code":1958,"language":1959,"meta":1960,"style":1960},[852,6183,6184],{"__ignoreMap":1960},[1964,6185,6186,6188,6190,6192,6194,6196,6198,6200],{"class":1966,"line":1967},[1964,6187,1971],{"class":1970},[1964,6189,1975],{"class":1974},[1964,6191,1979],{"class":1978},[1964,6193,1982],{"class":1974},[1964,6195,1985],{"class":1970},[1964,6197,1989],{"class":1988},[1964,6199,854],{"class":1992},[1964,6201,1995],{"class":1988},[848,6203,6204],{},[932,6205,2000],{},[1955,6207,6208],{"className":1957,"code":2003,"language":1959,"meta":1960,"style":1960},[852,6209,6210],{"__ignoreMap":1960},[1964,6211,6212,6214,6216,6218,6220,6222,6224,6226,6228],{"class":1966,"line":1967},[1964,6213,2011],{"class":2010},[1964,6215,2015],{"class":2014},[1964,6217,2018],{"class":1974},[1964,6219,1943],{"class":2021},[1964,6221,2025],{"class":2024},[1964,6223,2029],{"class":2028},[1964,6225,1796],{"class":1974},[1964,6227,2025],{"class":2024},[1964,6229,2036],{"class":2028},[848,6231,6232],{},[932,6233,2041],{},[1955,6235,6236],{"className":1957,"code":2044,"language":1959,"meta":1960,"style":1960},[852,6237,6238,6256],{"__ignoreMap":1960},[1964,6239,6240,6242,6244,6246,6248,6250,6252,6254],{"class":1966,"line":1967},[1964,6241,2051],{"class":1970},[1964,6243,2015],{"class":2014},[1964,6245,2018],{"class":1974},[1964,6247,2059],{"class":2058},[1964,6249,2062],{"class":1974},[1964,6251,2065],{"class":1978},[1964,6253,2068],{"class":1974},[1964,6255,2072],{"class":2071},[1964,6257,6258,6260,6262,6264,6266,6268,6270,6272],{"class":1966,"line":2075},[1964,6259,2051],{"class":1970},[1964,6261,2015],{"class":2014},[1964,6263,2018],{"class":1974},[1964,6265,1947],{"class":2058},[1964,6267,2062],{"class":1974},[1964,6269,2065],{"class":1978},[1964,6271,2090],{"class":1974},[1964,6273,2093],{"class":2071},[848,6275,6276],{},[932,6277,1026],{},[936,6279,6280,6288],{},[939,6281,6282],{},[942,6283,6284,6286],{},[945,6285,1035],{},[945,6287,1038],{},[952,6289,6290],{},[942,6291,6292,6296],{},[957,6293,6294],{},[852,6295,1378],{},[957,6297,2118,6298,2121,6300,1796],{},[852,6299,1943],{},[852,6301,1939],{},[894,6303],{},[905,6305,6306],{"id":2128},[852,6307,2131],{},[848,6309,2134,6310,2138],{},[852,6311,2137],{},[848,6313,6314],{},[932,6315,1953],{},[1955,6317,6318],{"className":1957,"code":2145,"language":1959,"meta":1960,"style":1960},[852,6319,6320],{"__ignoreMap":1960},[1964,6321,6322,6324,6326,6328,6330,6332,6334,6336],{"class":1966,"line":1967},[1964,6323,1971],{"class":1970},[1964,6325,1975],{"class":1974},[1964,6327,2156],{"class":1978},[1964,6329,1982],{"class":1974},[1964,6331,1985],{"class":1970},[1964,6333,1989],{"class":1988},[1964,6335,854],{"class":1992},[1964,6337,1995],{"class":1988},[848,6339,6340],{},[932,6341,2000],{},[1955,6343,6344],{"className":1957,"code":2173,"language":1959,"meta":1960,"style":1960},[852,6345,6346],{"__ignoreMap":1960},[1964,6347,6348,6350,6352,6354,6356,6358,6360,6362,6364],{"class":1966,"line":1967},[1964,6349,2011],{"class":2010},[1964,6351,2182],{"class":2014},[1964,6353,2018],{"class":1974},[1964,6355,2187],{"class":2021},[1964,6357,2025],{"class":2024},[1964,6359,2192],{"class":2028},[1964,6361,1796],{"class":1974},[1964,6363,2025],{"class":2024},[1964,6365,2036],{"class":2028},[848,6367,6368],{},[932,6369,2041],{},[1955,6371,6372],{"className":1957,"code":2205,"language":1959,"meta":1960,"style":1960},[852,6373,6374],{"__ignoreMap":1960},[1964,6375,6376,6378,6380,6382,6384,6386,6388,6390,6392],{"class":1966,"line":1967},[1964,6377,2051],{"class":1970},[1964,6379,2182],{"class":2014},[1964,6381,2018],{"class":1974},[1964,6383,2218],{"class":1988},[1964,6385,2221],{"class":1992},[1964,6387,2218],{"class":1988},[1964,6389,2062],{"class":1974},[1964,6391,2065],{"class":1978},[1964,6393,2230],{"class":1974},[848,6395,6396],{},[932,6397,1026],{},[936,6399,6400,6410],{},[939,6401,6402],{},[942,6403,6404,6406,6408],{},[945,6405,1035],{},[945,6407,1367],{},[945,6409,1038],{},[952,6411,6412],{},[942,6413,6414,6418,6422],{},[957,6415,6416],{},[852,6417,1378],{},[957,6419,6420],{},[852,6421,1939],{},[957,6423,2261],{},[894,6425],{},[905,6427,6428],{"id":2266},[852,6429,2269],{},[848,6431,2272,6432,2276,6434,2280],{},[852,6433,2275],{},[852,6435,2279],{},[848,6437,2283,6438,2286,6440,2290],{},[852,6439,2279],{},[852,6441,2289],{},[848,6443,6444],{},[932,6445,2295],{},[936,6447,6448,6458],{},[939,6449,6450],{},[942,6451,6452,6454,6456],{},[945,6453,2304],{},[945,6455,2307],{},[945,6457,2310],{},[952,6459,6460,6472,6484],{},[942,6461,6462,6466,6470],{},[957,6463,6464],{},[852,6465,2319],{},[957,6467,6468],{},[852,6469,2324],{},[957,6471,2327],{},[942,6473,6474,6478,6482],{},[957,6475,6476],{},[852,6477,2275],{},[957,6479,6480],{},[852,6481,2338],{},[957,6483,2341],{},[942,6485,6486,6490,6494],{},[957,6487,6488],{},[852,6489,2348],{},[957,6491,6492],{},[852,6493,2353],{},[957,6495,2356],{},[848,6497,6498],{},[932,6499,990],{},[936,6501,6502,6510],{},[939,6503,6504],{},[942,6505,6506,6508],{},[945,6507,999],{},[945,6509,950],{},[952,6511,6512],{},[942,6513,6514,6518],{},[957,6515,6516],{},[852,6517,2279],{},[957,6519,2381,6520,2385],{},[852,6521,2384],{},[848,6523,6524],{},[932,6525,1026],{},[936,6527,6528,6536],{},[939,6529,6530],{},[942,6531,6532,6534],{},[945,6533,1035],{},[945,6535,1038],{},[952,6537,6538,6546,6556],{},[942,6539,6540,6544],{},[957,6541,6542],{},[852,6543,1903],{},[957,6545,2410],{},[942,6547,6548,6552],{},[957,6549,6550],{},[852,6551,1378],{},[957,6553,2118,6554],{},[852,6555,2275],{},[942,6557,6558,6562],{},[957,6559,6560],{},[852,6561,2427],{},[957,6563,2430],{},[1955,6565,6566],{"className":1957,"code":2433,"filename":2434,"language":1959,"meta":1960,"style":1960},[852,6567,6568,6590,6608,6626],{"__ignoreMap":1960},[1964,6569,6570,6572,6574,6576,6578,6580,6582,6584,6586,6588],{"class":1966,"line":1967},[1964,6571,2441],{"class":1970},[1964,6573,2444],{"class":1970},[1964,6575,2447],{"class":2014},[1964,6577,2018],{"class":1974},[1964,6579,2452],{"class":2010},[1964,6581,2455],{"class":1974},[1964,6583,2065],{"class":2021},[1964,6585,2460],{"class":1974},[1964,6587,2463],{"class":2010},[1964,6589,2466],{"class":1974},[1964,6591,6592,6594,6596,6598,6600,6602,6604,6606],{"class":1966,"line":2075},[1964,6593,2471],{"class":2010},[1964,6595,2475],{"class":2474},[1964,6597,2478],{"class":2024},[1964,6599,2481],{"class":1978},[1964,6601,872],{"class":1974},[1964,6603,2486],{"class":1978},[1964,6605,872],{"class":1974},[1964,6607,2491],{"class":1978},[1964,6609,6610,6612,6614,6616,6618,6620,6622,6624],{"class":1966,"line":2494},[1964,6611,2497],{"class":1970},[1964,6613,1975],{"class":1974},[1964,6615,2502],{"class":1978},[1964,6617,2025],{"class":2505},[1964,6619,2509],{"class":2508},[1964,6621,1614],{"class":1974},[1964,6623,2514],{"class":1978},[1964,6625,2517],{"class":1974},[1964,6627,6628,6630,6632,6634,6636,6638,6640],{"class":1966,"line":2520},[1964,6629,2523],{"class":1974},[1964,6631,2526],{"class":2058},[1964,6633,1614],{"class":1974},[1964,6635,2218],{"class":1988},[1964,6637,2533],{"class":1992},[1964,6639,2218],{"class":1988},[1964,6641,2230],{"class":1974},[894,6643],{},[897,6645,2543],{"id":2542},[848,6647,2546,6648,859,6650,2551,6652,2554],{},[852,6649,858],{},[852,6651,862],{},[852,6653,866],{},[905,6655,6656],{"id":2557},[852,6657,2560],{},[848,6659,2563,6660,2566,6662,2569,6664,2573,6666,2577,6668,2581],{},[852,6661,1091],{},[852,6663,910],{},[852,6665,2572],{},[852,6667,2576],{},[852,6669,2580],{},[848,6671,6672],{},[932,6673,990],{},[936,6675,6676,6684],{},[939,6677,6678],{},[942,6679,6680,6682],{},[945,6681,999],{},[945,6683,950],{},[952,6685,6686],{},[942,6687,6688,6692],{},[957,6689,6690],{},[852,6691,2576],{},[957,6693,6694],{},[852,6695,2608],{},[848,6697,6698],{},[932,6699,1026],{},[936,6701,6702,6710],{},[939,6703,6704],{},[942,6705,6706,6708],{},[945,6707,1035],{},[945,6709,1038],{},[952,6711,6712,6720,6728,6736],{},[942,6713,6714,6718],{},[957,6715,6716],{},[852,6717,1047],{},[957,6719,1050],{},[942,6721,6722,6726],{},[957,6723,6724],{},[852,6725,1057],{},[957,6727,2641],{},[942,6729,6730,6734],{},[957,6731,6732],{},[852,6733,1067],{},[957,6735,2650],{},[942,6737,6738,6742],{},[957,6739,6740],{},[852,6741,1913],{},[957,6743,2659],{},[1955,6745,6746],{"className":1957,"code":2662,"filename":2663,"language":1959,"meta":1960,"style":1960},[852,6747,6748,6770,6796,6810],{"__ignoreMap":1960},[1964,6749,6750,6752,6754,6756,6758,6760,6762,6764,6766,6768],{"class":1966,"line":1967},[1964,6751,2441],{"class":1970},[1964,6753,2444],{"class":1970},[1964,6755,2674],{"class":2014},[1964,6757,2018],{"class":1974},[1964,6759,2452],{"class":2010},[1964,6761,2455],{"class":1974},[1964,6763,2065],{"class":2021},[1964,6765,2460],{"class":1974},[1964,6767,2463],{"class":2010},[1964,6769,2466],{"class":1974},[1964,6771,6772,6774,6776,6778,6780,6782,6784,6786,6788,6790,6792,6794],{"class":1966,"line":2075},[1964,6773,2471],{"class":2010},[1964,6775,1975],{"class":1974},[1964,6777,2697],{"class":2474},[1964,6779,1614],{"class":1974},[1964,6781,2702],{"class":2474},[1964,6783,1982],{"class":1974},[1964,6785,2707],{"class":2024},[1964,6787,2481],{"class":1978},[1964,6789,872],{"class":1974},[1964,6791,2486],{"class":1978},[1964,6793,872],{"class":1974},[1964,6795,2718],{"class":1978},[1964,6797,6798,6800,6802,6804,6806,6808],{"class":1966,"line":2494},[1964,6799,2497],{"class":1970},[1964,6801,1975],{"class":1974},[1964,6803,2697],{"class":1978},[1964,6805,1614],{"class":1974},[1964,6807,2702],{"class":1978},[1964,6809,2517],{"class":1974},[1964,6811,6812],{"class":1966,"line":2520},[1964,6813,2737],{"class":1974},[894,6815],{},[905,6817,6818],{"id":2742},[852,6819,2745],{},[848,6821,2748,6822,2751,6824,2754,6826,2757,6828,2760],{},[852,6823,1079],{},[852,6825,2576],{},[852,6827,2576],{},[852,6829,2384],{},[848,6831,6832],{},[932,6833,990],{},[936,6835,6836,6844],{},[939,6837,6838],{},[942,6839,6840,6842],{},[945,6841,999],{},[945,6843,950],{},[952,6845,6846],{},[942,6847,6848,6852],{},[957,6849,6850],{},[852,6851,2576],{},[957,6853,2785,6854,2788],{},[852,6855,2384],{},[848,6857,6858],{},[932,6859,1026],{},[936,6861,6862,6870],{},[939,6863,6864],{},[942,6865,6866,6868],{},[945,6867,1035],{},[945,6869,1038],{},[952,6871,6872],{},[942,6873,6874,6878],{},[957,6875,6876],{},[852,6877,1067],{},[957,6879,2813],{},[1955,6881,6882],{"className":1957,"code":2816,"filename":2817,"language":1959,"meta":1960,"style":1960},[852,6883,6884,6906,6926,6976],{"__ignoreMap":1960},[1964,6885,6886,6888,6890,6892,6894,6896,6898,6900,6902,6904],{"class":1966,"line":1967},[1964,6887,2441],{"class":1970},[1964,6889,2444],{"class":1970},[1964,6891,2828],{"class":2014},[1964,6893,2018],{"class":1974},[1964,6895,2452],{"class":2010},[1964,6897,2455],{"class":1974},[1964,6899,2065],{"class":2021},[1964,6901,2460],{"class":1974},[1964,6903,2463],{"class":2010},[1964,6905,2466],{"class":1974},[1964,6907,6908,6910,6912,6914,6916,6918,6920,6922,6924],{"class":1966,"line":2075},[1964,6909,2471],{"class":2010},[1964,6911,2849],{"class":2474},[1964,6913,2478],{"class":2024},[1964,6915,2481],{"class":1978},[1964,6917,872],{"class":1974},[1964,6919,2486],{"class":1978},[1964,6921,872],{"class":1974},[1964,6923,2862],{"class":1978},[1964,6925,2865],{"class":2071},[1964,6927,6928,6930,6932,6934,6936,6938,6940,6942,6944,6946,6948,6950,6952,6954,6956,6958,6960,6962,6964,6966,6968,6970,6972,6974],{"class":1966,"line":2494},[1964,6929,2497],{"class":1970},[1964,6931,2849],{"class":1978},[1964,6933,2874],{"class":2024},[1964,6935,1975],{"class":1974},[1964,6937,2879],{"class":1978},[1964,6939,2025],{"class":2505},[1964,6941,1989],{"class":1988},[1964,6943,2886],{"class":1992},[1964,6945,2218],{"class":1988},[1964,6947,1614],{"class":1974},[1964,6949,2697],{"class":1978},[1964,6951,2025],{"class":2505},[1964,6953,2849],{"class":1978},[1964,6955,872],{"class":1974},[1964,6957,2697],{"class":1978},[1964,6959,1982],{"class":1974},[1964,6961,2025],{"class":2024},[1964,6963,1975],{"class":1974},[1964,6965,2879],{"class":1978},[1964,6967,2025],{"class":2505},[1964,6969,1989],{"class":1988},[1964,6971,2915],{"class":1992},[1964,6973,2218],{"class":1988},[1964,6975,2517],{"class":1974},[1964,6977,6978],{"class":1966,"line":2520},[1964,6979,2737],{"class":1974},[894,6981],{},[905,6983,6984],{"id":2928},[852,6985,2931],{},[848,6987,2934,6988,2937],{},[852,6989,1297],{},[848,6991,6992],{},[932,6993,1026],{},[936,6995,6996,7004],{},[939,6997,6998],{},[942,6999,7000,7002],{},[945,7001,1035],{},[945,7003,1038],{},[952,7005,7006],{},[942,7007,7008,7012],{},[957,7009,7010],{},[852,7011,1378],{},[957,7013,2962],{},[1955,7015,7016],{"className":1957,"code":2965,"filename":2966,"language":1959,"meta":1960,"style":1960},[852,7017,7018,7040,7058,7072],{"__ignoreMap":1960},[1964,7019,7020,7022,7024,7026,7028,7030,7032,7034,7036,7038],{"class":1966,"line":1967},[1964,7021,2441],{"class":1970},[1964,7023,2444],{"class":1970},[1964,7025,2977],{"class":2014},[1964,7027,2018],{"class":1974},[1964,7029,2452],{"class":2010},[1964,7031,2455],{"class":1974},[1964,7033,2065],{"class":2021},[1964,7035,2460],{"class":1974},[1964,7037,2463],{"class":2010},[1964,7039,2466],{"class":1974},[1964,7041,7042,7044,7046,7048,7050,7052,7054,7056],{"class":1966,"line":2075},[1964,7043,2471],{"class":2010},[1964,7045,2475],{"class":2474},[1964,7047,2478],{"class":2024},[1964,7049,3002],{"class":1970},[1964,7051,3005],{"class":2014},[1964,7053,2018],{"class":1974},[1964,7055,2065],{"class":1978},[1964,7057,2230],{"class":1974},[1964,7059,7060,7062,7064,7066,7068,7070],{"class":1966,"line":2494},[1964,7061,2497],{"class":1970},[1964,7063,1975],{"class":1974},[1964,7065,2502],{"class":1978},[1964,7067,2025],{"class":2505},[1964,7069,2509],{"class":2508},[1964,7071,2517],{"class":1974},[1964,7073,7074],{"class":1966,"line":2520},[1964,7075,2737],{"class":1974},[894,7077],{},[905,7079,7080],{"id":3034},[852,7081,3037],{},[848,7083,3040,7084,1614,7086,1729,7088,3049],{},[852,7085,1079],{},[852,7087,3045],{},[852,7089,3048],{},[848,7091,7092],{},[932,7093,1026],{},[936,7095,7096,7104],{},[939,7097,7098],{},[942,7099,7100,7102],{},[945,7101,1035],{},[945,7103,1038],{},[952,7105,7106,7114,7122,7130],{},[942,7107,7108,7112],{},[957,7109,7110],{},[852,7111,1047],{},[957,7113,3074],{},[942,7115,7116,7120],{},[957,7117,7118],{},[852,7119,1057],{},[957,7121,3083],{},[942,7123,7124,7128],{},[957,7125,7126],{},[852,7127,1378],{},[957,7129,3092],{},[942,7131,7132,7136],{},[957,7133,7134],{},[852,7135,1067],{},[957,7137,2650],{},[1955,7139,7140],{"className":1957,"code":3103,"filename":2434,"language":1959,"meta":1960,"style":1960},[852,7141,7142,7164,7186,7208,7222],{"__ignoreMap":1960},[1964,7143,7144,7146,7148,7150,7152,7154,7156,7158,7160,7162],{"class":1966,"line":1967},[1964,7145,2441],{"class":1970},[1964,7147,2444],{"class":1970},[1964,7149,3114],{"class":2014},[1964,7151,2018],{"class":1974},[1964,7153,2452],{"class":2010},[1964,7155,2455],{"class":1974},[1964,7157,2065],{"class":2021},[1964,7159,2460],{"class":1974},[1964,7161,2463],{"class":2010},[1964,7163,2466],{"class":1974},[1964,7165,7166,7168,7170,7172,7174,7176,7178,7180,7182,7184],{"class":1966,"line":2075},[1964,7167,2471],{"class":2010},[1964,7169,1975],{"class":1974},[1964,7171,2697],{"class":2474},[1964,7173,1982],{"class":1974},[1964,7175,2707],{"class":2024},[1964,7177,2481],{"class":1978},[1964,7179,872],{"class":1974},[1964,7181,2486],{"class":1978},[1964,7183,872],{"class":1974},[1964,7185,2718],{"class":1978},[1964,7187,7188,7190,7192,7194,7196,7198,7200,7202,7204,7206],{"class":1966,"line":2494},[1964,7189,3155],{"class":1970},[1964,7191,3158],{"class":2014},[1964,7193,2018],{"class":1974},[1964,7195,2697],{"class":1978},[1964,7197,1614],{"class":1974},[1964,7199,2051],{"class":1970},[1964,7201,3005],{"class":2014},[1964,7203,2018],{"class":1974},[1964,7205,2065],{"class":1978},[1964,7207,3175],{"class":1974},[1964,7209,7210,7212,7214,7216,7218,7220],{"class":1966,"line":2520},[1964,7211,2497],{"class":1970},[1964,7213,1975],{"class":1974},[1964,7215,2502],{"class":1978},[1964,7217,2025],{"class":2505},[1964,7219,2509],{"class":2508},[1964,7221,2517],{"class":1974},[1964,7223,7224],{"class":1966,"line":3192},[1964,7225,2737],{"class":1974},[894,7227],{},[905,7229,7230],{"id":3199},[852,7231,3202],{},[848,7233,3205,7234,3209,7236,3213,7238,3217],{},[852,7235,3208],{},[852,7237,3212],{},[852,7239,3216],{},[874,7241,7242],{},[848,7243,3222,7244,3226,7246,3230,7248,1729,7250,3237],{},[852,7245,3225],{},[852,7247,3229],{},[852,7249,3233],{},[852,7251,3236],{},[848,7253,3240,7254,3244],{},[852,7255,3243],{},[848,7257,7258],{},[932,7259,934],{},[936,7261,7262,7270],{},[939,7263,7264],{},[942,7265,7266,7268],{},[945,7267,947],{},[945,7269,950],{},[952,7271,7272,7280],{},[942,7273,7274,7278],{},[957,7275,7276,1349],{},[852,7277,3208],{},[957,7279,3269],{},[942,7281,7282,7286],{},[957,7283,7284,3276],{},[852,7285,3216],{},[957,7287,3279],{},[848,7289,7290],{},[932,7291,990],{},[936,7293,7294,7302],{},[939,7295,7296],{},[942,7297,7298,7300],{},[945,7299,999],{},[945,7301,950],{},[952,7303,7304],{},[942,7305,7306,7310],{},[957,7307,7308],{},[852,7309,3243],{},[957,7311,7312],{},[852,7313,3306],{},[848,7315,7316],{},[932,7317,1026],{},[936,7319,7320,7328],{},[939,7321,7322],{},[942,7323,7324,7326],{},[945,7325,1035],{},[945,7327,1038],{},[952,7329,7330,7338,7346,7352],{},[942,7331,7332,7336],{},[957,7333,7334],{},[852,7335,1057],{},[957,7337,3331],{},[942,7339,7340,7344],{},[957,7341,7342],{},[852,7343,1067],{},[957,7345,3340],{},[942,7347,7348,7350],{},[957,7349,3345],{},[957,7351,3348],{},[942,7353,7354,7358],{},[957,7355,7356],{},[852,7357,1913],{},[957,7359,3357],{},[1955,7361,7362],{"className":1957,"code":3360,"filename":3361,"language":1959,"meta":1960,"style":1960},[852,7363,7364,7386,7404,7442],{"__ignoreMap":1960},[1964,7365,7366,7368,7370,7372,7374,7376,7378,7380,7382,7384],{"class":1966,"line":1967},[1964,7367,2441],{"class":1970},[1964,7369,2444],{"class":1970},[1964,7371,3372],{"class":2014},[1964,7373,2018],{"class":1974},[1964,7375,2452],{"class":2010},[1964,7377,2455],{"class":1974},[1964,7379,2065],{"class":2021},[1964,7381,2460],{"class":1974},[1964,7383,2463],{"class":2010},[1964,7385,2466],{"class":1974},[1964,7387,7388,7390,7392,7394,7396,7398,7400,7402],{"class":1966,"line":2075},[1964,7389,2471],{"class":2010},[1964,7391,3393],{"class":2474},[1964,7393,2478],{"class":2024},[1964,7395,2481],{"class":1978},[1964,7397,872],{"class":1974},[1964,7399,2486],{"class":1978},[1964,7401,872],{"class":1974},[1964,7403,3406],{"class":1978},[1964,7405,7406,7408,7410,7412,7414,7416,7418,7420,7422,7424,7426,7428,7430,7432,7434,7436,7438,7440],{"class":1966,"line":2494},[1964,7407,2497],{"class":1970},[1964,7409,1975],{"class":1974},[1964,7411,2502],{"class":1978},[1964,7413,2025],{"class":2505},[1964,7415,2509],{"class":2508},[1964,7417,1614],{"class":1974},[1964,7419,3423],{"class":1978},[1964,7421,2025],{"class":2505},[1964,7423,3393],{"class":1978},[1964,7425,872],{"class":1974},[1964,7427,3423],{"class":1978},[1964,7429,1614],{"class":1974},[1964,7431,2697],{"class":1978},[1964,7433,2025],{"class":2505},[1964,7435,3393],{"class":1978},[1964,7437,872],{"class":1974},[1964,7439,2697],{"class":1978},[1964,7441,2517],{"class":1974},[1964,7443,7444,7446,7448,7450,7452],{"class":1966,"line":2520},[1964,7445,2523],{"class":1974},[1964,7447,2218],{"class":1988},[1964,7449,3454],{"class":1992},[1964,7451,2218],{"class":1988},[1964,7453,2230],{"class":1974},[894,7455],{},[905,7457,7458],{"id":3463},[852,7459,3466],{},[848,7461,3469,7462,3473,7464,3477,7466,3481,7468,3484],{},[852,7463,3472],{},[852,7465,3476],{},[852,7467,3480],{},[852,7469,2279],{},[848,7471,3487,7472,1614,7474,1614,7476,1614,7478,3500,7480,1729,7482,872],{},[852,7473,3490],{},[852,7475,3493],{},[852,7477,3496],{},[852,7479,3499],{},[852,7481,3503],{},[852,7483,3506],{},[1167,7485,7486],{},[848,7487,3511,7488,3515,7490,3518],{},[852,7489,3514],{},[852,7491,3233],{},[848,7493,3521,7494,3524,7496,3528,7498,3532,7500,3535,7502,924,7504,3542],{},[852,7495,3490],{},[852,7497,3527],{},[852,7499,3531],{},[852,7501,3423],{},[852,7503,3538],{},[852,7505,3541],{},[848,7507,7508,3548,7510,3552,7512,3555],{},[852,7509,3547],{},[852,7511,3551],{},[852,7513,3506],{},[848,7515,7516],{},[932,7517,3560],{},[936,7519,7520,7534],{},[939,7521,7522],{},[942,7523,7524,7526,7530,7532],{},[945,7525,3569],{},[945,7527,3572,7528],{},[852,7529,3236],{},[945,7531,3577],{},[945,7533,3580],{},[952,7535,7536,7554,7572,7590,7608,7626,7644],{},[942,7537,7538,7542,7546,7550],{},[957,7539,7540],{},[852,7541,3490],{},[957,7543,7544],{},[852,7545,3593],{},[957,7547,7548],{},[852,7549,3598],{},[957,7551,7552],{},[869,7553,490],{"href":491},[942,7555,7556,7560,7564,7568],{},[957,7557,7558],{},[852,7559,3493],{},[957,7561,7562],{},[852,7563,3613],{},[957,7565,7566],{},[852,7567,3618],{},[957,7569,7570],{},[869,7571,508],{"href":509},[942,7573,7574,7578,7582,7586],{},[957,7575,7576],{},[852,7577,3496],{},[957,7579,7580],{},[852,7581,3613],{},[957,7583,7584],{},[852,7585,3618],{},[957,7587,7588],{},[869,7589,520],{"href":521},[942,7591,7592,7596,7600,7604],{},[957,7593,7594],{},[852,7595,3499],{},[957,7597,7598],{},[852,7599,3613],{},[957,7601,7602],{},[852,7603,3618],{},[957,7605,7606],{},[869,7607,512],{"href":513},[942,7609,7610,7614,7618,7622],{},[957,7611,7612],{},[852,7613,3503],{},[957,7615,7616],{},[852,7617,3669],{},[957,7619,7620],{},[852,7621,3674],{},[957,7623,7624],{},[869,7625,516],{"href":517},[942,7627,7628,7632,7636,7640],{},[957,7629,7630],{},[852,7631,3506],{},[957,7633,7634],{},[852,7635,3613],{},[957,7637,7638],{},[852,7639,3693],{},[957,7641,7642],{},[869,7643,504],{"href":505},[942,7645,7646,7650,7652,7654],{},[957,7647,7648],{},[852,7649,3514],{},[957,7651,3706],{},[957,7653,3709],{},[957,7655,7656],{},[869,7657,524],{"href":525},[848,7659,3716,7660,3720,7662,3723,7664,3726,7666,3730,7668,859,7670,3737,7672,3740,7674,3743],{},[852,7661,3719],{},[852,7663,3490],{},[852,7665,3503],{},[852,7667,3729],{},[852,7669,3733],{},[852,7671,3736],{},[852,7673,3547],{},[852,7675,3551],{},[848,7677,3746,7678,3749,7680,3753,7682,3756,7684,872],{},[852,7679,3490],{},[852,7681,3752],{},[852,7683,3752],{},[852,7685,3759],{},[848,7687,7688],{},[932,7689,990],{},[936,7691,7692,7704],{},[939,7693,7694],{},[942,7695,7696,7698,7702],{},[945,7697,3569],{},[945,7699,7700,3777],{},[852,7701,3776],{},[945,7703,3780],{},[952,7705,7706,7720,7734,7748,7764,7778],{},[942,7707,7708,7712,7716],{},[957,7709,7710],{},[852,7711,3490],{},[957,7713,7714],{},[852,7715,3793],{},[957,7717,7718],{},[852,7719,3798],{},[942,7721,7722,7726,7730],{},[957,7723,7724],{},[852,7725,3503],{},[957,7727,7728],{},[852,7729,3809],{},[957,7731,7732],{},[852,7733,3814],{},[942,7735,7736,7740,7744],{},[957,7737,7738],{},[852,7739,3506],{},[957,7741,7742],{},[852,7743,3825],{},[957,7745,7746],{},[852,7747,3814],{},[942,7749,7750,7754,7758],{},[957,7751,7752],{},[852,7753,3493],{},[957,7755,7756],{},[852,7757,3493],{},[957,7759,7760,859,7762],{},[852,7761,3844],{},[852,7763,3847],{},[942,7765,7766,7770,7774],{},[957,7767,7768],{},[852,7769,3496],{},[957,7771,7772],{},[852,7773,3858],{},[957,7775,7776],{},[852,7777,3863],{},[942,7779,7780,7784,7788],{},[957,7781,7782],{},[852,7783,3499],{},[957,7785,7786],{},[852,7787,3499],{},[957,7789,7790],{},[852,7791,3878],{},[848,7793,7794],{},[932,7795,1026],{},[936,7797,7798,7806],{},[939,7799,7800],{},[942,7801,7802,7804],{},[945,7803,1035],{},[945,7805,1038],{},[952,7807,7808,7816,7826,7834,7844,7852,7860],{},[942,7809,7810,7814],{},[957,7811,7812],{},[852,7813,1047],{},[957,7815,3903],{},[942,7817,7818,7822],{},[957,7819,7820],{},[852,7821,1903],{},[957,7823,3912,7824,3915],{},[852,7825,3514],{},[942,7827,7828,7832],{},[957,7829,7830],{},[852,7831,1057],{},[957,7833,3924],{},[942,7835,7836,7840],{},[957,7837,7838],{},[852,7839,1378],{},[957,7841,3933,7842,3936],{},[852,7843,3506],{},[942,7845,7846,7850],{},[957,7847,7848],{},[852,7849,3943],{},[957,7851,3946],{},[942,7853,7854,7858],{},[957,7855,7856],{},[852,7857,1067],{},[957,7859,3955],{},[942,7861,7862,7864],{},[957,7863,3345],{},[957,7865,3962,7866],{},[852,7867,3965],{},[1955,7869,7870],{"className":1957,"code":3968,"filename":3969,"language":1959,"meta":1960,"style":1960},[852,7871,7872,7894,7916,7920,7938,7968,7972,7976,7994,8024,8028,8032,8046],{"__ignoreMap":1960},[1964,7873,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892],{"class":1966,"line":1967},[1964,7875,2441],{"class":1970},[1964,7877,2444],{"class":1970},[1964,7879,3980],{"class":2014},[1964,7881,2018],{"class":1974},[1964,7883,2452],{"class":2010},[1964,7885,2455],{"class":1974},[1964,7887,2065],{"class":2021},[1964,7889,2460],{"class":1974},[1964,7891,2463],{"class":2010},[1964,7893,2466],{"class":1974},[1964,7895,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914],{"class":1966,"line":2075},[1964,7897,2471],{"class":2010},[1964,7899,4001],{"class":2474},[1964,7901,2478],{"class":2024},[1964,7903,2481],{"class":1978},[1964,7905,872],{"class":1974},[1964,7907,2486],{"class":1978},[1964,7909,872],{"class":1974},[1964,7911,4014],{"class":1978},[1964,7913,4017],{"class":1974},[1964,7915,4020],{"class":1978},[1964,7917,7918],{"class":1966,"line":2494},[1964,7919,4025],{"emptyLinePlaceholder":8},[1964,7921,7922,7924,7926,7928,7930,7932,7934,7936],{"class":1966,"line":2520},[1964,7923,4030],{"class":1970},[1964,7925,2455],{"class":1974},[1964,7927,4035],{"class":1978},[1964,7929,4038],{"class":2024},[1964,7931,1989],{"class":1988},[1964,7933,3490],{"class":1992},[1964,7935,2218],{"class":1988},[1964,7937,4047],{"class":1974},[1964,7939,7940,7942,7944,7946,7948,7950,7952,7954,7956,7958,7960,7962,7964,7966],{"class":1966,"line":3192},[1964,7941,4052],{"class":1970},[1964,7943,1975],{"class":1974},[1964,7945,2502],{"class":1978},[1964,7947,2025],{"class":2505},[1964,7949,2509],{"class":2508},[1964,7951,1614],{"class":1974},[1964,7953,4065],{"class":1978},[1964,7955,2025],{"class":2505},[1964,7957,2481],{"class":1978},[1964,7959,872],{"class":1974},[1964,7961,2486],{"class":1978},[1964,7963,872],{"class":1974},[1964,7965,3793],{"class":1978},[1964,7967,2517],{"class":1974},[1964,7969,7970],{"class":1966,"line":4082},[1964,7971,4085],{"class":1974},[1964,7973,7974],{"class":1966,"line":4088},[1964,7975,4025],{"emptyLinePlaceholder":8},[1964,7977,7978,7980,7982,7984,7986,7988,7990,7992],{"class":1966,"line":4093},[1964,7979,4030],{"class":1970},[1964,7981,2455],{"class":1974},[1964,7983,4035],{"class":1978},[1964,7985,4038],{"class":2024},[1964,7987,1989],{"class":1988},[1964,7989,3496],{"class":1992},[1964,7991,2218],{"class":1988},[1964,7993,4047],{"class":1974},[1964,7995,7996,7998,8000,8002,8004,8006,8008,8010,8012,8014,8016,8018,8020,8022],{"class":1966,"line":4112},[1964,7997,4052],{"class":1970},[1964,7999,1975],{"class":1974},[1964,8001,2502],{"class":1978},[1964,8003,2025],{"class":2505},[1964,8005,2509],{"class":2508},[1964,8007,1614],{"class":1974},[1964,8009,4065],{"class":1978},[1964,8011,2025],{"class":2505},[1964,8013,2481],{"class":1978},[1964,8015,872],{"class":1974},[1964,8017,2486],{"class":1978},[1964,8019,872],{"class":1974},[1964,8021,3858],{"class":1978},[1964,8023,2517],{"class":1974},[1964,8025,8026],{"class":1966,"line":4143},[1964,8027,4085],{"class":1974},[1964,8029,8030],{"class":1966,"line":4148},[1964,8031,4025],{"emptyLinePlaceholder":8},[1964,8033,8034,8036,8038,8040,8042,8044],{"class":1966,"line":4153},[1964,8035,2497],{"class":1970},[1964,8037,1975],{"class":1974},[1964,8039,2502],{"class":1978},[1964,8041,2025],{"class":2505},[1964,8043,2509],{"class":2508},[1964,8045,2517],{"class":1974},[1964,8047,8048,8050,8052,8054,8056,8058,8060,8062,8064],{"class":1966,"line":4168},[1964,8049,2523],{"class":1974},[1964,8051,2218],{"class":1988},[1964,8053,3454],{"class":1992},[1964,8055,2218],{"class":1988},[1964,8057,1614],{"class":1974},[1964,8059,2218],{"class":1988},[1964,8061,4183],{"class":1992},[1964,8063,2218],{"class":1988},[1964,8065,2230],{"class":1974},[894,8067],{},[905,8069,8070],{"id":4192},[852,8071,4195],{},[848,8073,4198,8074,1614,8076,1729,8078,4205,8080,2455,8082,1614,8084,1614,8086,1614,8088,4221,8090,924,8092,4228],{},[852,8075,982],{},[852,8077,972],{},[852,8079,961],{},[852,8081,4208],{},[852,8083,4211],{},[852,8085,4214],{},[852,8087,4217],{},[852,8089,4220],{},[852,8091,4224],{},[852,8093,4227],{},[848,8095,8096],{},[932,8097,990],{},[936,8099,8100,8108],{},[939,8101,8102],{},[942,8103,8104,8106],{},[945,8105,999],{},[945,8107,950],{},[952,8109,8110,8120],{},[942,8111,8112,8116],{},[957,8113,8114],{},[852,8115,4224],{},[957,8117,4253,8118,1796],{},[852,8119,4256],{},[942,8121,8122,8126],{},[957,8123,8124],{},[852,8125,4227],{},[957,8127,4265],{},[848,8129,8130],{},[932,8131,1026],{},[936,8133,8134,8142],{},[939,8135,8136],{},[942,8137,8138,8140],{},[945,8139,1035],{},[945,8141,1038],{},[952,8143,8144,8152,8160],{},[942,8145,8146,8150],{},[957,8147,8148],{},[852,8149,1903],{},[957,8151,4290],{},[942,8153,8154,8158],{},[957,8155,8156],{},[852,8157,2427],{},[957,8159,4299],{},[942,8161,8162,8166],{},[957,8163,8164],{},[852,8165,1057],{},[957,8167,4308],{},[1955,8169,8170],{"className":1957,"code":4311,"filename":4312,"language":1959,"meta":1960,"style":1960},[852,8171,8172,8194,8212,8230],{"__ignoreMap":1960},[1964,8173,8174,8176,8178,8180,8182,8184,8186,8188,8190,8192],{"class":1966,"line":1967},[1964,8175,2441],{"class":1970},[1964,8177,2444],{"class":1970},[1964,8179,4323],{"class":2014},[1964,8181,2018],{"class":1974},[1964,8183,2452],{"class":2010},[1964,8185,2455],{"class":1974},[1964,8187,2065],{"class":2021},[1964,8189,2460],{"class":1974},[1964,8191,2463],{"class":2010},[1964,8193,2466],{"class":1974},[1964,8195,8196,8198,8200,8202,8204,8206,8208,8210],{"class":1966,"line":2075},[1964,8197,2471],{"class":2010},[1964,8199,1975],{"class":1974},[1964,8201,4220],{"class":2474},[1964,8203,1982],{"class":1974},[1964,8205,2707],{"class":2024},[1964,8207,2481],{"class":1978},[1964,8209,872],{"class":1974},[1964,8211,4356],{"class":1978},[1964,8213,8214,8216,8218,8220,8222,8224,8226,8228],{"class":1966,"line":2494},[1964,8215,2497],{"class":1970},[1964,8217,1975],{"class":1974},[1964,8219,2502],{"class":1978},[1964,8221,2025],{"class":2505},[1964,8223,2509],{"class":2508},[1964,8225,1614],{"class":1974},[1964,8227,4220],{"class":1978},[1964,8229,2517],{"class":1974},[1964,8231,8232],{"class":1966,"line":2520},[1964,8233,2737],{"class":1974},[1167,8235,8236],{},[848,8237,4383,8238,4386],{},[852,8239,1201],{},[894,8241],{},[905,8243,8244],{"id":4391},[852,8245,4394],{},[848,8247,4397,8248,4400,8250,4404,8252,4408],{},[852,8249,4208],{},[852,8251,4403],{},[852,8253,4407],{},[848,8255,8256],{},[932,8257,934],{},[936,8259,8260,8268],{},[939,8261,8262],{},[942,8263,8264,8266],{},[945,8265,947],{},[945,8267,950],{},[952,8269,8270,8278],{},[942,8271,8272,8276],{},[957,8273,8274],{},[852,8275,4403],{},[957,8277,4433],{},[942,8279,8280,8282],{},[957,8281,4438],{},[957,8283,8284,1614,8286,1614,8288,1614,8290],{},[852,8285,4214],{},[852,8287,4217],{},[852,8289,4220],{},[852,8291,4211],{},[848,8293,8294],{},[932,8295,990],{},[936,8297,8298,8306],{},[939,8299,8300],{},[942,8301,8302,8304],{},[945,8303,999],{},[945,8305,950],{},[952,8307,8308],{},[942,8309,8310,8314],{},[957,8311,8312],{},[852,8313,4407],{},[957,8315,4473],{},[848,8317,8318],{},[932,8319,1026],{},[936,8321,8322,8330],{},[939,8323,8324],{},[942,8325,8326,8328],{},[945,8327,1035],{},[945,8329,1038],{},[952,8331,8332,8340,8348,8356],{},[942,8333,8334,8338],{},[957,8335,8336],{},[852,8337,1903],{},[957,8339,4498],{},[942,8341,8342,8346],{},[957,8343,8344],{},[852,8345,1378],{},[957,8347,4507],{},[942,8349,8350,8354],{},[957,8351,8352],{},[852,8353,2427],{},[957,8355,4516],{},[942,8357,8358,8362],{},[957,8359,8360],{},[852,8361,1378],{},[957,8363,4525,8364,1796],{},[852,8365,1939],{},[1955,8367,8368],{"className":1957,"code":4530,"filename":4531,"language":1959,"meta":1960,"style":1960},[852,8369,8370,8392,8396,8410],{"__ignoreMap":1960},[1964,8371,8372,8374,8376,8378,8380,8382,8384,8386,8388,8390],{"class":1966,"line":1967},[1964,8373,2441],{"class":1970},[1964,8375,2444],{"class":1970},[1964,8377,4542],{"class":2014},[1964,8379,2018],{"class":1974},[1964,8381,2452],{"class":2010},[1964,8383,2455],{"class":1974},[1964,8385,2065],{"class":2021},[1964,8387,2460],{"class":1974},[1964,8389,2463],{"class":2010},[1964,8391,2466],{"class":1974},[1964,8393,8394],{"class":1966,"line":2075},[1964,8395,4561],{"class":2071},[1964,8397,8398,8400,8402,8404,8406,8408],{"class":1966,"line":2494},[1964,8399,2497],{"class":1970},[1964,8401,1975],{"class":1974},[1964,8403,2502],{"class":1978},[1964,8405,2025],{"class":2505},[1964,8407,2509],{"class":2508},[1964,8409,2517],{"class":1974},[1964,8411,8412],{"class":1966,"line":2520},[1964,8413,2737],{"class":1974},[894,8415],{},[905,8417,8418],{"id":4584},[852,8419,4587],{},[848,8421,4590,8422,4594],{},[852,8423,4593],{},[848,8425,4597],{},[1955,8427,8428],{"className":1957,"code":4600,"filename":4601,"language":1959,"meta":1960,"style":1960},[852,8429,8430,8452,8464,8478],{"__ignoreMap":1960},[1964,8431,8432,8434,8436,8438,8440,8442,8444,8446,8448,8450],{"class":1966,"line":1967},[1964,8433,2441],{"class":1970},[1964,8435,2444],{"class":1970},[1964,8437,4612],{"class":2014},[1964,8439,2018],{"class":1974},[1964,8441,2452],{"class":2010},[1964,8443,2455],{"class":1974},[1964,8445,2065],{"class":2021},[1964,8447,2460],{"class":1974},[1964,8449,2463],{"class":2010},[1964,8451,2466],{"class":1974},[1964,8453,8454,8456,8458,8460,8462],{"class":1966,"line":2075},[1964,8455,3155],{"class":1970},[1964,8457,4633],{"class":2014},[1964,8459,2018],{"class":1974},[1964,8461,2065],{"class":1978},[1964,8463,2230],{"class":1974},[1964,8465,8466,8468,8470,8472,8474,8476],{"class":1966,"line":2494},[1964,8467,2497],{"class":1970},[1964,8469,1975],{"class":1974},[1964,8471,2502],{"class":1978},[1964,8473,2025],{"class":2505},[1964,8475,2509],{"class":2508},[1964,8477,2517],{"class":1974},[1964,8479,8480],{"class":1966,"line":2520},[1964,8481,2737],{"class":1974},[894,8483],{},[897,8485,4663],{"id":4662},[905,8487,8488,4670,8490],{"id":4666},[852,8489,4669],{},[4672,8491,4674],{},[848,8493,4677,8494,4681,8496,1614,8498,1614,8500,1614,8502,4693,8504,4697,8506,4701],{},[852,8495,4680],{},[852,8497,4684],{},[852,8499,1751],{},[852,8501,4689],{},[852,8503,4692],{},[852,8505,4696],{},[852,8507,4700],{},[1955,8509,8510],{"className":1957,"code":4704,"filename":4705,"language":1959,"meta":1960,"style":1960},[852,8511,8512,8530,8534,8552,8562,8582,8586,8590],{"__ignoreMap":1960},[1964,8513,8514,8516,8518,8520,8522,8524,8526,8528],{"class":1966,"line":1967},[1964,8515,1971],{"class":1970},[1964,8517,1975],{"class":1974},[1964,8519,4716],{"class":1978},[1964,8521,1982],{"class":1974},[1964,8523,1985],{"class":1970},[1964,8525,1989],{"class":1988},[1964,8527,858],{"class":1992},[1964,8529,1995],{"class":1988},[1964,8531,8532],{"class":1966,"line":2075},[1964,8533,4025],{"emptyLinePlaceholder":8},[1964,8535,8536,8538,8540,8542,8544,8546,8548,8550],{"class":1966,"line":2494},[1964,8537,2441],{"class":1970},[1964,8539,2444],{"class":1970},[1964,8541,4739],{"class":2014},[1964,8543,4742],{"class":1974},[1964,8545,4745],{"class":2021},[1964,8547,2460],{"class":1974},[1964,8549,2463],{"class":2010},[1964,8551,2466],{"class":1974},[1964,8553,8554,8556,8558,8560],{"class":1966,"line":2520},[1964,8555,4756],{"class":2014},[1964,8557,2018],{"class":1974},[1964,8559,4745],{"class":1978},[1964,8561,4763],{"class":1974},[1964,8563,8564,8566,8568,8570,8572,8574,8576,8578,8580],{"class":1966,"line":3192},[1964,8565,4768],{"class":1978},[1964,8567,2025],{"class":2505},[1964,8569,1975],{"class":1974},[1964,8571,4775],{"class":1978},[1964,8573,2025],{"class":2505},[1964,8575,1989],{"class":1988},[1964,8577,4782],{"class":1992},[1964,8579,2218],{"class":1988},[1964,8581,4787],{"class":1974},[1964,8583,8584],{"class":1966,"line":4082},[1964,8585,4792],{"class":2071},[1964,8587,8588],{"class":1966,"line":4088},[1964,8589,4797],{"class":1974},[1964,8591,8592],{"class":1966,"line":4093},[1964,8593,2737],{"class":1974},[848,8595,8596],{},[932,8597,2295],{},[936,8599,8600,8610],{},[939,8601,8602],{},[942,8603,8604,8606,8608],{},[945,8605,2304],{},[945,8607,2307],{},[945,8609,2310],{},[952,8611,8612,8624],{},[942,8613,8614,8618,8622],{},[957,8615,8616],{},[852,8617,4745],{},[957,8619,8620],{},[852,8621,4830],{},[957,8623,4833],{},[942,8625,8626,8630,8634],{},[957,8627,8628],{},[852,8629,4840],{},[957,8631,8632],{},[852,8633,192],{},[957,8635,4847,8636,4851],{},[852,8637,4850],{},[874,8639,8640],{},[848,8641,4856,8642,4859,8644,4863],{},[852,8643,858],{},[852,8645,4862],{},[894,8647],{},[897,8649,4869],{"id":4868},[905,8651,8652],{"id":4872},[852,8653,4875],{},[848,8655,4878],{},[848,8657,8658],{},[932,8659,1953],{},[1955,8661,8662],{"className":1957,"code":4885,"language":1959,"meta":1960,"style":1960},[852,8663,8664],{"__ignoreMap":1960},[1964,8665,8666,8668,8670,8672,8674,8676,8678,8680],{"class":1966,"line":1967},[1964,8667,1971],{"class":1970},[1964,8669,1975],{"class":1974},[1964,8671,4896],{"class":1978},[1964,8673,1982],{"class":1974},[1964,8675,1985],{"class":1970},[1964,8677,1989],{"class":1988},[1964,8679,854],{"class":1992},[1964,8681,1995],{"class":1988},[848,8683,8684],{},[932,8685,2295],{},[4912,8687,8688,8694,8698,8702,8706,8710],{},[4915,8689,8690],{":required":1269,"name":4917,"type":4918},[848,8691,4921,8692,4925],{},[852,8693,4924],{},[4915,8695,8696],{":required":1269,"name":2065,"type":4928},[848,8697,4931],{},[4915,8699,8700],{":required":1269,"name":852,"type":3844},[848,8701,4936],{},[4915,8703,8704],{":required":1269,"name":4939,"type":2338},[848,8705,4942],{},[4915,8707,8708],{":required":1269,"name":4945,"type":3844},[848,8709,4948],{},[4915,8711,8712],{":required":1269,"name":4951,"type":3844},[848,8713,4954],{},[1955,8715,8716],{"className":1957,"code":4957,"language":1959,"meta":1960,"style":1960},[852,8717,8718],{"__ignoreMap":1960},[1964,8719,8720,8722,8724,8726,8728,8730,8732,8734,8736,8738,8740,8742,8744,8746,8748,8750,8752,8754,8756,8758],{"class":1966,"line":1967},[1964,8721,4896],{"class":2014},[1964,8723,2018],{"class":1974},[1964,8725,4917],{"class":1978},[1964,8727,1614],{"class":1974},[1964,8729,2065],{"class":1978},[1964,8731,1614],{"class":1974},[1964,8733,2218],{"class":1988},[1964,8735,4978],{"class":1992},[1964,8737,2218],{"class":1988},[1964,8739,1614],{"class":1974},[1964,8741,1378],{"class":2058},[1964,8743,1614],{"class":1974},[1964,8745,2218],{"class":1988},[1964,8747,4991],{"class":1992},[1964,8749,2218],{"class":1988},[1964,8751,1614],{"class":1974},[1964,8753,2218],{"class":1988},[1964,8755,5000],{"class":1992},[1964,8757,2218],{"class":1988},[1964,8759,2230],{"class":1974},[894,8761],{},[905,8763,8764],{"id":5009},[852,8765,5012],{},[848,8767,5015],{},[894,8769],{},[897,8771,5021],{"id":5020},[905,8773,8774],{"id":5024},[852,8775,5027],{},[848,8777,5030,8778,5033],{},[869,8779,116],{"href":117},[848,8781,8782],{},[932,8783,5038],{},[5040,8785,8786,8790,8798],{},[5043,8787,5045,8788,5049],{},[852,8789,5048],{},[5043,8791,5052,8792,5056,8794,5060,8796,5063],{},[852,8793,5055],{},[852,8795,5059],{},[852,8797,1821],{},[5043,8799,5066],{},[848,8801,1420,8802,5071],{},[869,8803,116],{"href":117},[894,8805],{},[897,8807,5077],{"id":5076},[936,8809,8810,8826],{},[939,8811,8812],{},[942,8813,8814,8816,8818,8820,8822,8824],{},[945,8815,5086],{},[945,8817,5089],{},[945,8819,5092],{},[945,8821,5095],{},[945,8823,1423],{},[945,8825,5100],{},[952,8827,8828,8844,8860,8876,8892,8908,8924,8940,8956],{},[942,8829,8830,8834,8836,8838,8840,8842],{},[957,8831,8832],{},[852,8833,1079],{},[957,8835,5111],{},[957,8837,5111],{},[957,8839,5111],{},[957,8841,5118],{},[957,8843,5121],{},[942,8845,8846,8850,8852,8854,8856,8858],{},[957,8847,8848],{},[852,8849,1082],{},[957,8851,5111],{},[957,8853,5111],{},[957,8855,5134],{},[957,8857,5118],{},[957,8859,5121],{},[942,8861,8862,8866,8868,8870,8872,8874],{},[957,8863,8864],{},[852,8865,3045],{},[957,8867,5118],{},[957,8869,5118],{},[957,8871,5118],{},[957,8873,5111],{},[957,8875,5121],{},[942,8877,8878,8882,8884,8886,8888,8890],{},[957,8879,8880],{},[852,8881,5161],{},[957,8883,5111],{},[957,8885,5111],{},[957,8887,5111],{},[957,8889,5111],{},[957,8891,5172],{},[942,8893,8894,8898,8900,8902,8904,8906],{},[957,8895,8896],{},[852,8897,3225],{},[957,8899,5111],{},[957,8901,5118],{},[957,8903,5185],{},[957,8905,5118],{},[957,8907,5121],{},[942,8909,8910,8914,8916,8918,8920,8922],{},[957,8911,8912],{},[852,8913,3236],{},[957,8915,5111],{},[957,8917,5111],{},[957,8919,5111],{},[957,8921,5111],{},[957,8923,5172],{},[942,8925,8926,8930,8932,8934,8936,8938],{},[957,8927,8928],{},[852,8929,5212],{},[957,8931,5118],{},[957,8933,5118],{},[957,8935,5118],{},[957,8937,5118],{},[957,8939,5223],{},[942,8941,8942,8946,8948,8950,8952,8954],{},[957,8943,8944],{},[852,8945,5230],{},[957,8947,5118],{},[957,8949,5118],{},[957,8951,5118],{},[957,8953,5111],{},[957,8955,5172],{},[942,8957,8958,8962,8964,8966,8968,8970],{},[957,8959,8960],{},[852,8961,5247],{},[957,8963,5118],{},[957,8965,5118],{},[957,8967,5118],{},[957,8969,5118],{},[957,8971,5121],{},[5259,8973,5261],{},{"title":1960,"searchDepth":2075,"depth":2075,"links":8975},[8976,8980,8984,8988,8991,8996,9007,9010,9014,9017],{"id":899,"depth":2075,"text":900,"children":8977},[8978,8979],{"id":907,"depth":2494,"text":910},{"id":1088,"depth":2494,"text":1091},{"id":1188,"depth":2075,"text":1189,"children":8981},[8982,8983],{"id":1192,"depth":2494,"text":1195},{"id":1294,"depth":2494,"text":1297},{"id":1432,"depth":2075,"text":1433,"children":8985},[8986,8987],{"id":1436,"depth":2494,"text":1439},{"id":1500,"depth":2494,"text":1503},{"id":1712,"depth":2075,"text":1713,"children":8989},[8990],{"id":1716,"depth":2494,"text":1719},{"id":1926,"depth":2075,"text":1927,"children":8992},[8993,8994,8995],{"id":1930,"depth":2494,"text":1933},{"id":2128,"depth":2494,"text":2131},{"id":2266,"depth":2494,"text":2269},{"id":2542,"depth":2075,"text":2543,"children":8997},[8998,8999,9000,9001,9002,9003,9004,9005,9006],{"id":2557,"depth":2494,"text":2560},{"id":2742,"depth":2494,"text":2745},{"id":2928,"depth":2494,"text":2931},{"id":3034,"depth":2494,"text":3037},{"id":3199,"depth":2494,"text":3202},{"id":3463,"depth":2494,"text":3466},{"id":4192,"depth":2494,"text":4195},{"id":4391,"depth":2494,"text":4394},{"id":4584,"depth":2494,"text":4587},{"id":4662,"depth":2075,"text":4663,"children":9008},[9009],{"id":4666,"depth":2494,"text":5298},{"id":4868,"depth":2075,"text":4869,"children":9011},[9012,9013],{"id":4872,"depth":2494,"text":4875},{"id":5009,"depth":2494,"text":5012},{"id":5020,"depth":2075,"text":5021,"children":9015},[9016],{"id":5024,"depth":2494,"text":5027},{"id":5076,"depth":2075,"text":5077},{},{"title":206,"description":5307},1780436293224]