[{"data":1,"prerenderedAt":4669},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fauth-h3client":64,"navigation":217,"navLinks_footer":829,"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt_page":842,"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt_surround":2991,"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt":2994},{"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":79,"body":844,"description":2984,"extension":2985,"icon":15,"meta":2986,"module":2987,"navigation":8,"path":80,"rawbody":2988,"seo":2989,"stem":81,"__hash__":2990},"docs\u002Fdocs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt.md",{"type":845,"value":846,"toc":2962},"minimark",[847,856,861,879,883,954,957,961,968,1105,1110,1170,1184,1190,1192,1196,1202,1207,1211,1214,1257,1260,1521,1526,1604,1610,1735,1750,1754,1764,1769,2169,2174,2176,2180,2184,2198,2201,2227,2249,2253,2265,2269,2284,2288,2293,2477,2482,2486,2496,2500,2503,2552,2559,2561,2565,2568,2582,2616,2626,2630,2633,2713,2958],[848,849,850,851,855],"p",{},"The ",[852,853,854],"code",{},"@riavzon\u002Fauth-h3client"," module handles authentication for Nuxt applications. It provides a module that auto-imports client-side composables and server-side utilities, plus optional security middleware.",[857,858,860],"h2",{"id":859},"requirements","Requirements",[862,863,864,868,871],"ul",{},[865,866,867],"li",{},"Node.js 22 or later",[865,869,870],{},"Nuxt 3 and later or a Nitro\u002FH3 application",[865,872,873,874,878],{},"A running ",[875,876,877],"a",{"href":396},"IAM service"," reachable from your server",[857,880,882],{"id":881},"installation","Installation",[884,885,886,911,925,940],"code-group",{},[887,888,894],"pre",{"className":889,"code":890,"filename":891,"language":892,"meta":893,"style":893},"language-bash shiki shiki-themes light-plus light-plus dracula","pnpm add @riavzon\u002Fauth-h3client\n","pnpm","bash","",[852,895,896],{"__ignoreMap":893},[897,898,901,904,908],"span",{"class":899,"line":900},"line",1,[897,902,891],{"class":903},"sHOzp",[897,905,907],{"class":906},"sFB1V"," add",[897,909,910],{"class":906}," @riavzon\u002Fauth-h3client\n",[887,912,915],{"className":889,"code":913,"filename":914,"language":892,"meta":893,"style":893},"yarn add @riavzon\u002Fauth-h3client\n","yarn",[852,916,917],{"__ignoreMap":893},[897,918,919,921,923],{"class":899,"line":900},[897,920,914],{"class":903},[897,922,907],{"class":906},[897,924,910],{"class":906},[887,926,929],{"className":889,"code":927,"filename":928,"language":892,"meta":893,"style":893},"npm install @riavzon\u002Fauth-h3client\n","npm",[852,930,931],{"__ignoreMap":893},[897,932,933,935,938],{"class":899,"line":900},[897,934,928],{"class":903},[897,936,937],{"class":906}," install",[897,939,910],{"class":906},[887,941,944],{"className":889,"code":942,"filename":943,"language":892,"meta":893,"style":893},"bun add @riavzon\u002Fauth-h3client\n","bun",[852,945,946],{"__ignoreMap":893},[897,947,948,950,952],{"class":899,"line":900},[897,949,943],{"class":903},[897,951,907],{"class":906},[897,953,910],{"class":906},[955,956],"hr",{},[857,958,960],{"id":959},"nuxt-module-setup","Nuxt module setup",[848,962,963,964,967],{},"Register the module in ",[852,965,966],{},"nuxt.config.ts",". This enables the auto-import of all server utilities and client composables, and optionally registers the global security middleware.",[887,969,973],{"className":970,"code":971,"filename":966,"language":972,"meta":893,"style":893},"language-ts shiki shiki-themes light-plus light-plus dracula","export default defineNuxtConfig({\n  modules: ['auth-h3client\u002Fmodule'],\n  authH3Client: {\n    enableMiddleware: true,\n    authStatusUrl: '\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus',\n    registerApiRoute: {\n      path: '\u002Fapi\u002Fauth\u002Fapi-tokens'\n    }\n  }\n})\n","ts",[852,974,975,991,1017,1028,1043,1061,1071,1087,1093,1099],{"__ignoreMap":893},[897,976,977,981,984,987],{"class":899,"line":900},[897,978,980],{"class":979},"sZ328","export",[897,982,983],{"class":979}," default",[897,985,986],{"class":903}," defineNuxtConfig",[897,988,990],{"class":989},"sDd4n","({\n",[897,992,994,998,1002,1005,1009,1012,1014],{"class":899,"line":993},2,[897,995,997],{"class":996},"sjsA6","  modules",[897,999,1001],{"class":1000},"s34zl",":",[897,1003,1004],{"class":989}," [",[897,1006,1008],{"class":1007},"sFkSl","'",[897,1010,1011],{"class":906},"auth-h3client\u002Fmodule",[897,1013,1008],{"class":1007},[897,1015,1016],{"class":989},"],\n",[897,1018,1020,1023,1025],{"class":899,"line":1019},3,[897,1021,1022],{"class":996},"  authH3Client",[897,1024,1001],{"class":1000},[897,1026,1027],{"class":989}," {\n",[897,1029,1031,1034,1036,1040],{"class":899,"line":1030},4,[897,1032,1033],{"class":996},"    enableMiddleware",[897,1035,1001],{"class":1000},[897,1037,1039],{"class":1038},"sjR7W"," true",[897,1041,1042],{"class":989},",\n",[897,1044,1046,1049,1051,1054,1057,1059],{"class":899,"line":1045},5,[897,1047,1048],{"class":996},"    authStatusUrl",[897,1050,1001],{"class":1000},[897,1052,1053],{"class":1007}," '",[897,1055,1056],{"class":906},"\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus",[897,1058,1008],{"class":1007},[897,1060,1042],{"class":989},[897,1062,1064,1067,1069],{"class":899,"line":1063},6,[897,1065,1066],{"class":996},"    registerApiRoute",[897,1068,1001],{"class":1000},[897,1070,1027],{"class":989},[897,1072,1074,1077,1079,1081,1084],{"class":899,"line":1073},7,[897,1075,1076],{"class":996},"      path",[897,1078,1001],{"class":1000},[897,1080,1053],{"class":1007},[897,1082,1083],{"class":906},"\u002Fapi\u002Fauth\u002Fapi-tokens",[897,1085,1086],{"class":1007},"'\n",[897,1088,1090],{"class":899,"line":1089},8,[897,1091,1092],{"class":989},"    }\n",[897,1094,1096],{"class":899,"line":1095},9,[897,1097,1098],{"class":989},"  }\n",[897,1100,1102],{"class":899,"line":1101},10,[897,1103,1104],{"class":989},"})\n",[1106,1107,1109],"h3",{"id":1108},"module-options","Module options",[1111,1112,1113,1133,1147,1157],"field-group",{},[1114,1115,1118],"field",{"name":1116,"type":1117},"enableMiddleware","boolean",[848,1119,1120,1121,1124,1125,1128,1129,1132],{},"Default to true - Registers a global server middleware that runs on every incoming request. The middleware calls IP validation, bot detection, and CSRF cookie generation in sequence for browser auth flows. Set to ",[852,1122,1123],{},"false"," if you want to provide your own middleware so you can exclude machine-to-machine routes protected by ",[852,1126,1127],{},"defineAuthenticatePublicApi",". This only disables the bundled middleware. The module still registers the auth status route and any configured ",[852,1130,1131],{},"registerApiRoute"," handler.",[1114,1134,1137],{"name":1135,"type":1136},"authStatusUrl","string",[848,1138,1139,1140,1143,1144,1146],{},"Default to ",[852,1141,1142],{},"\"\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus\""," - The route path for the auth\nstatus endpoint. The module registers a GET handler at this path that returns\nthe current session state. The ",[852,1145,152],{}," composable calls this endpoint by\ndefault.",[1114,1148,1150],{"name":1131,"type":1149},"{ path: string }",[848,1151,1152,1153,1156],{},"Optional - When provided, the module registers a GET route backed by\n",[852,1154,1155],{},"getApiListsController",". Use this to expose the authenticated API token\ninventory to your frontend without manually wiring a route.",[1114,1158,1160],{"name":1159,"type":1136},"registerApiRoute.path",[848,1161,1162,1163,1165,1166,1169],{},"Required when ",[852,1164,1131],{}," is set - The path where the module registers\nthe API token inventory route. For example, ",[852,1167,1168],{},"\"\u002Fapi\u002Fauth\u002Fapi-tokens\"",".",[1171,1172,1173],"caution",{},[848,1174,1175,1176,1179,1180,1183],{},"When deploying to a serverless or edge environment such as Vercel, Netlify, or Cloudflare Workers, set ",[852,1177,1178],{},"enableFireWallBans: false"," in your plugin configuration. The firewall ban feature uses ",[852,1181,1182],{},"sudo ufw"," and is only available on Linux servers with UFW installed.",[1185,1186,1187],"warning",{},[848,1188,1189],{},"The bot detector in this module should be enabled by default, disabling it while using the IAM service will fail session rotation and verification.",[955,1191],{},[857,1193,1195],{"id":1194},"plugin-configuration","Plugin configuration",[848,1197,1198,1199,1169],{},"The module does not configure the library automatically because the configuration includes non-serializable values such as storage instances and callbacks. You must create a Nitro plugin that calls ",[852,1200,1201],{},"defineAuthConfiguration",[848,1203,1204,1206],{},[852,1205,1201],{}," initializes the library, starts the HTTP request logger, and registers all authentication routes on the Nitro router in one call. This is the recommended setup for Nuxt applications.",[1106,1208,1210],{"id":1209},"using-a-config-template","Using a config template",[848,1212,1213],{},"The module ships two config templates that read from environment variables, giving you a working baseline with no manual wiring:",[1215,1216,1217,1230],"table",{},[1218,1219,1220],"thead",{},[1221,1222,1223,1227],"tr",{},[1224,1225,1226],"th",{},"Template",[1224,1228,1229],{},"Description",[1231,1232,1233,1244],"tbody",{},[1221,1234,1235,1241],{},[1236,1237,1238],"td",{},[852,1239,1240],{},"configDefaults",[1236,1242,1243],{},"Core authentication with HMAC signing and unstorage caching",[1221,1245,1246,1251],{},[1236,1247,1248],{},[852,1249,1250],{},"configDefaultsWithOAuth",[1236,1252,1253,1254,1256],{},"Extends ",[852,1255,1240],{}," with Google, GitHub, X, and LinkedIn OAuth providers",[848,1258,1259],{},"Create a Nitro plugin and spread the template as the base:",[887,1261,1264],{"className":970,"code":1262,"filename":1263,"language":972,"meta":893,"style":893},"import { defineNitroPlugin } from 'nitropack\u002Fruntime'\nimport { useStorage } from 'nitropack\u002Fruntime\u002Fstorage'\nimport { configDefaults } from 'auth-h3client\u002Fserver\u002Ftemplates'\nimport { defineAuthConfiguration } from 'auth-h3client\u002Fv1'\n\nexport default defineNitroPlugin((nitroApp) => {\n  defineAuthConfiguration(nitroApp, {\n    ...configDefaults,\n    onSuccessRedirect: '\u002Fdashboard',\n    uStorage: {\n      storage: useStorage('cache'),\n      cacheOptions: {\n        successTtl: 60 * 60 * 24 * 30,\n        rateLimitTtl: 10\n      }\n    }\n  })\n})\n","server\u002Fplugins\u002Fauth.ts",[852,1265,1266,1290,1310,1329,1348,1353,1378,1391,1401,1417,1426,1449,1459,1488,1499,1505,1510,1516],{"__ignoreMap":893},[897,1267,1268,1271,1274,1277,1280,1283,1285,1288],{"class":899,"line":900},[897,1269,1270],{"class":979},"import",[897,1272,1273],{"class":989}," { ",[897,1275,1276],{"class":996},"defineNitroPlugin",[897,1278,1279],{"class":989}," } ",[897,1281,1282],{"class":979},"from",[897,1284,1053],{"class":1007},[897,1286,1287],{"class":906},"nitropack\u002Fruntime",[897,1289,1086],{"class":1007},[897,1291,1292,1294,1296,1299,1301,1303,1305,1308],{"class":899,"line":993},[897,1293,1270],{"class":979},[897,1295,1273],{"class":989},[897,1297,1298],{"class":996},"useStorage",[897,1300,1279],{"class":989},[897,1302,1282],{"class":979},[897,1304,1053],{"class":1007},[897,1306,1307],{"class":906},"nitropack\u002Fruntime\u002Fstorage",[897,1309,1086],{"class":1007},[897,1311,1312,1314,1316,1318,1320,1322,1324,1327],{"class":899,"line":1019},[897,1313,1270],{"class":979},[897,1315,1273],{"class":989},[897,1317,1240],{"class":996},[897,1319,1279],{"class":989},[897,1321,1282],{"class":979},[897,1323,1053],{"class":1007},[897,1325,1326],{"class":906},"auth-h3client\u002Fserver\u002Ftemplates",[897,1328,1086],{"class":1007},[897,1330,1331,1333,1335,1337,1339,1341,1343,1346],{"class":899,"line":1030},[897,1332,1270],{"class":979},[897,1334,1273],{"class":989},[897,1336,1201],{"class":996},[897,1338,1279],{"class":989},[897,1340,1282],{"class":979},[897,1342,1053],{"class":1007},[897,1344,1345],{"class":906},"auth-h3client\u002Fv1",[897,1347,1086],{"class":1007},[897,1349,1350],{"class":899,"line":1045},[897,1351,1352],{"emptyLinePlaceholder":8},"\n",[897,1354,1355,1357,1359,1362,1365,1369,1372,1376],{"class":899,"line":1063},[897,1356,980],{"class":979},[897,1358,983],{"class":979},[897,1360,1361],{"class":903}," defineNitroPlugin",[897,1363,1364],{"class":989},"((",[897,1366,1368],{"class":1367},"sygFZ","nitroApp",[897,1370,1371],{"class":989},") ",[897,1373,1375],{"class":1374},"sl46w","=>",[897,1377,1027],{"class":989},[897,1379,1380,1383,1386,1388],{"class":899,"line":1073},[897,1381,1382],{"class":903},"  defineAuthConfiguration",[897,1384,1385],{"class":989},"(",[897,1387,1368],{"class":996},[897,1389,1390],{"class":989},", {\n",[897,1392,1393,1397,1399],{"class":899,"line":1089},[897,1394,1396],{"class":1395},"saOXh","    ...",[897,1398,1240],{"class":996},[897,1400,1042],{"class":989},[897,1402,1403,1406,1408,1410,1413,1415],{"class":899,"line":1095},[897,1404,1405],{"class":996},"    onSuccessRedirect",[897,1407,1001],{"class":1000},[897,1409,1053],{"class":1007},[897,1411,1412],{"class":906},"\u002Fdashboard",[897,1414,1008],{"class":1007},[897,1416,1042],{"class":989},[897,1418,1419,1422,1424],{"class":899,"line":1101},[897,1420,1421],{"class":996},"    uStorage",[897,1423,1001],{"class":1000},[897,1425,1027],{"class":989},[897,1427,1429,1432,1434,1437,1439,1441,1444,1446],{"class":899,"line":1428},11,[897,1430,1431],{"class":996},"      storage",[897,1433,1001],{"class":1000},[897,1435,1436],{"class":903}," useStorage",[897,1438,1385],{"class":989},[897,1440,1008],{"class":1007},[897,1442,1443],{"class":906},"cache",[897,1445,1008],{"class":1007},[897,1447,1448],{"class":989},"),\n",[897,1450,1452,1455,1457],{"class":899,"line":1451},12,[897,1453,1454],{"class":996},"      cacheOptions",[897,1456,1001],{"class":1000},[897,1458,1027],{"class":989},[897,1460,1462,1465,1467,1471,1474,1476,1478,1481,1483,1486],{"class":899,"line":1461},13,[897,1463,1464],{"class":996},"        successTtl",[897,1466,1001],{"class":1000},[897,1468,1470],{"class":1469},"spgvN"," 60",[897,1472,1473],{"class":1395}," *",[897,1475,1470],{"class":1469},[897,1477,1473],{"class":1395},[897,1479,1480],{"class":1469}," 24",[897,1482,1473],{"class":1395},[897,1484,1485],{"class":1469}," 30",[897,1487,1042],{"class":989},[897,1489,1491,1494,1496],{"class":899,"line":1490},14,[897,1492,1493],{"class":996},"        rateLimitTtl",[897,1495,1001],{"class":1000},[897,1497,1498],{"class":1469}," 10\n",[897,1500,1502],{"class":899,"line":1501},15,[897,1503,1504],{"class":989},"      }\n",[897,1506,1508],{"class":899,"line":1507},16,[897,1509,1092],{"class":989},[897,1511,1513],{"class":899,"line":1512},17,[897,1514,1515],{"class":989},"  })\n",[897,1517,1519],{"class":899,"line":1518},18,[897,1520,1104],{"class":989},[848,1522,1523,1525],{},[852,1524,1240],{}," reads the following environment variables:",[1215,1527,1528,1540],{},[1218,1529,1530],{},[1221,1531,1532,1535,1538],{},[1224,1533,1534],{},"Variable",[1224,1536,1537],{},"Required",[1224,1539,1229],{},[1231,1541,1542,1555,1567,1580,1592],{},[1221,1543,1544,1549,1552],{},[1236,1545,1546],{},[852,1547,1548],{},"AUTH_SERVER_LOCATION",[1236,1550,1551],{},"Yes",[1236,1553,1554],{},"Hostname or IP address of the IAM service",[1221,1556,1557,1562,1564],{},[1236,1558,1559],{},[852,1560,1561],{},"AUTH_PORT_LOCATION",[1236,1563,1551],{},[1236,1565,1566],{},"Port the IAM service listens on",[1221,1568,1569,1574,1577],{},[1236,1570,1571],{},[852,1572,1573],{},"HMAC_CLIENT_ID",[1236,1575,1576],{},"No",[1236,1578,1579],{},"HMAC client identifier. Auto-generated if omitted",[1221,1581,1582,1587,1589],{},[1236,1583,1584],{},[852,1585,1586],{},"HMAC_SHARED_SECRET",[1236,1588,1576],{},[1236,1590,1591],{},"HMAC shared secret. Auto-generated if omitted",[1221,1593,1594,1599,1601],{},[1236,1595,1596],{},[852,1597,1598],{},"AUTH_CRYPTO_COOKIES",[1236,1600,1576],{},[1236,1602,1603],{},"Secret used to sign cookies. Auto-generated if omitted",[848,1605,1606,1607,1609],{},"When using ",[852,1608,1250],{},", add the following variables:",[1215,1611,1612,1622],{},[1218,1613,1614],{},[1221,1615,1616,1618,1620],{},[1224,1617,1534],{},[1224,1619,1537],{},[1224,1621,1229],{},[1231,1623,1624,1639,1651,1663,1675,1687,1699,1711,1723],{},[1221,1625,1626,1631,1633],{},[1236,1627,1628],{},[852,1629,1630],{},"BASEURL",[1236,1632,1551],{},[1236,1634,1635,1636],{},"Full base URL of your application, e.g. ",[852,1637,1638],{},"https:\u002F\u002Fapp.example.com",[1221,1640,1641,1646,1648],{},[1236,1642,1643],{},[852,1644,1645],{},"OAUTH_GOOGLE_CLIENT_ID",[1236,1647,1551],{},[1236,1649,1650],{},"Google OAuth client ID",[1221,1652,1653,1658,1660],{},[1236,1654,1655],{},[852,1656,1657],{},"OAUTH_GOOGLE_CLIENT_SECRET",[1236,1659,1551],{},[1236,1661,1662],{},"Google OAuth client secret",[1221,1664,1665,1670,1672],{},[1236,1666,1667],{},[852,1668,1669],{},"OAUTH_GITHUB_CLIENT_ID",[1236,1671,1551],{},[1236,1673,1674],{},"GitHub OAuth client ID",[1221,1676,1677,1682,1684],{},[1236,1678,1679],{},[852,1680,1681],{},"OAUTH_GITHUB_CLIENT_SECRET",[1236,1683,1551],{},[1236,1685,1686],{},"GitHub OAuth client secret",[1221,1688,1689,1694,1696],{},[1236,1690,1691],{},[852,1692,1693],{},"OAUTH_X_CLIENT_ID",[1236,1695,1551],{},[1236,1697,1698],{},"X (Twitter) OAuth client ID",[1221,1700,1701,1706,1708],{},[1236,1702,1703],{},[852,1704,1705],{},"OAUTH_X_CLIENT_SECRET",[1236,1707,1551],{},[1236,1709,1710],{},"X (Twitter) OAuth client secret",[1221,1712,1713,1718,1720],{},[1236,1714,1715],{},[852,1716,1717],{},"OAUTH_LINKEDIN_CLIENT_ID",[1236,1719,1551],{},[1236,1721,1722],{},"LinkedIn OAuth client ID",[1221,1724,1725,1730,1732],{},[1236,1726,1727],{},[852,1728,1729],{},"OAUTH_LINKEDIN_CLIENT_SECRET",[1236,1731,1551],{},[1236,1733,1734],{},"LinkedIn OAuth client secret",[1736,1737,1738],"tip",{},[848,1739,1740,1741,1743,1744,1746,1747,1749],{},"Production values for ",[852,1742,1573],{},", ",[852,1745,1586],{},", and ",[852,1748,1598],{}," should be stable across restarts and match what the IAM service expects. If you let the template auto-generate them, they will differ on every cold start.",[1106,1751,1753],{"id":1752},"manual-configuration","Manual configuration",[848,1755,1756,1757,1759,1760,1763],{},"If you need full control over every option, pass the full configuration object directly to ",[852,1758,1201],{}," without a template. See the ",[875,1761,1762],{"href":193},"Configuration reference"," for a description of every field.",[1736,1765,1766],{},[848,1767,1768],{},"You can spread a template as the base and override only the fields you need, rather than writing the full object from scratch.",[887,1770,1772],{"className":970,"code":1771,"filename":1263,"language":972,"meta":893,"style":893},"import { defineNitroPlugin } from 'nitropack\u002Fruntime'\nimport { useStorage } from 'nitropack\u002Fruntime\u002Fstorage'\nimport { configDefaults } from 'auth-h3client\u002Fserver\u002Ftemplates'\nimport { defineAuthConfiguration } from 'auth-h3client\u002Fv1'\n\nexport default defineNitroPlugin((nitroApp) => {\n  defineAuthConfiguration(nitroApp, {\n    ...configDefaults,\n    \u002F\u002F Override individual fields as needed\n    onSuccessRedirect: '\u002Fdashboard',\n    enableFireWallBans: false,\n    logLevel: 'info',\n    htmlSanitizer: {\n      IrritationCount: 50,\n      maxAllowedInputLength: 50000\n    },\n    imageUploader: {\n      allowedBytes: 5_000_000,\n      allowedMimes: ['image\u002Fpng', 'image\u002Fjpeg', 'image\u002Fwebp'],\n      allowedExtensions: ['png', 'webp', 'jpeg', 'jpg']\n    },\n    uStorage: {\n      storage: useStorage('cache'),\n      cacheOptions: {\n        successTtl: 60 * 60 * 24 * 30,\n        rateLimitTtl: 10\n      }\n    }\n  })\n})\n",[852,1773,1774,1792,1810,1828,1846,1850,1868,1878,1886,1892,1906,1918,1934,1943,1955,1965,1970,1979,1991,2028,2075,2080,2089,2108,2117,2140,2149,2154,2159,2164],{"__ignoreMap":893},[897,1775,1776,1778,1780,1782,1784,1786,1788,1790],{"class":899,"line":900},[897,1777,1270],{"class":979},[897,1779,1273],{"class":989},[897,1781,1276],{"class":996},[897,1783,1279],{"class":989},[897,1785,1282],{"class":979},[897,1787,1053],{"class":1007},[897,1789,1287],{"class":906},[897,1791,1086],{"class":1007},[897,1793,1794,1796,1798,1800,1802,1804,1806,1808],{"class":899,"line":993},[897,1795,1270],{"class":979},[897,1797,1273],{"class":989},[897,1799,1298],{"class":996},[897,1801,1279],{"class":989},[897,1803,1282],{"class":979},[897,1805,1053],{"class":1007},[897,1807,1307],{"class":906},[897,1809,1086],{"class":1007},[897,1811,1812,1814,1816,1818,1820,1822,1824,1826],{"class":899,"line":1019},[897,1813,1270],{"class":979},[897,1815,1273],{"class":989},[897,1817,1240],{"class":996},[897,1819,1279],{"class":989},[897,1821,1282],{"class":979},[897,1823,1053],{"class":1007},[897,1825,1326],{"class":906},[897,1827,1086],{"class":1007},[897,1829,1830,1832,1834,1836,1838,1840,1842,1844],{"class":899,"line":1030},[897,1831,1270],{"class":979},[897,1833,1273],{"class":989},[897,1835,1201],{"class":996},[897,1837,1279],{"class":989},[897,1839,1282],{"class":979},[897,1841,1053],{"class":1007},[897,1843,1345],{"class":906},[897,1845,1086],{"class":1007},[897,1847,1848],{"class":899,"line":1045},[897,1849,1352],{"emptyLinePlaceholder":8},[897,1851,1852,1854,1856,1858,1860,1862,1864,1866],{"class":899,"line":1063},[897,1853,980],{"class":979},[897,1855,983],{"class":979},[897,1857,1361],{"class":903},[897,1859,1364],{"class":989},[897,1861,1368],{"class":1367},[897,1863,1371],{"class":989},[897,1865,1375],{"class":1374},[897,1867,1027],{"class":989},[897,1869,1870,1872,1874,1876],{"class":899,"line":1073},[897,1871,1382],{"class":903},[897,1873,1385],{"class":989},[897,1875,1368],{"class":996},[897,1877,1390],{"class":989},[897,1879,1880,1882,1884],{"class":899,"line":1089},[897,1881,1396],{"class":1395},[897,1883,1240],{"class":996},[897,1885,1042],{"class":989},[897,1887,1888],{"class":899,"line":1095},[897,1889,1891],{"class":1890},"sghk6","    \u002F\u002F Override individual fields as needed\n",[897,1893,1894,1896,1898,1900,1902,1904],{"class":899,"line":1101},[897,1895,1405],{"class":996},[897,1897,1001],{"class":1000},[897,1899,1053],{"class":1007},[897,1901,1412],{"class":906},[897,1903,1008],{"class":1007},[897,1905,1042],{"class":989},[897,1907,1908,1911,1913,1916],{"class":899,"line":1428},[897,1909,1910],{"class":996},"    enableFireWallBans",[897,1912,1001],{"class":1000},[897,1914,1915],{"class":1038}," false",[897,1917,1042],{"class":989},[897,1919,1920,1923,1925,1927,1930,1932],{"class":899,"line":1451},[897,1921,1922],{"class":996},"    logLevel",[897,1924,1001],{"class":1000},[897,1926,1053],{"class":1007},[897,1928,1929],{"class":906},"info",[897,1931,1008],{"class":1007},[897,1933,1042],{"class":989},[897,1935,1936,1939,1941],{"class":899,"line":1461},[897,1937,1938],{"class":996},"    htmlSanitizer",[897,1940,1001],{"class":1000},[897,1942,1027],{"class":989},[897,1944,1945,1948,1950,1953],{"class":899,"line":1490},[897,1946,1947],{"class":996},"      IrritationCount",[897,1949,1001],{"class":1000},[897,1951,1952],{"class":1469}," 50",[897,1954,1042],{"class":989},[897,1956,1957,1960,1962],{"class":899,"line":1501},[897,1958,1959],{"class":996},"      maxAllowedInputLength",[897,1961,1001],{"class":1000},[897,1963,1964],{"class":1469}," 50000\n",[897,1966,1967],{"class":899,"line":1507},[897,1968,1969],{"class":989},"    },\n",[897,1971,1972,1975,1977],{"class":899,"line":1512},[897,1973,1974],{"class":996},"    imageUploader",[897,1976,1001],{"class":1000},[897,1978,1027],{"class":989},[897,1980,1981,1984,1986,1989],{"class":899,"line":1518},[897,1982,1983],{"class":996},"      allowedBytes",[897,1985,1001],{"class":1000},[897,1987,1988],{"class":1469}," 5_000_000",[897,1990,1042],{"class":989},[897,1992,1994,1997,1999,2001,2003,2006,2008,2010,2012,2015,2017,2019,2021,2024,2026],{"class":899,"line":1993},19,[897,1995,1996],{"class":996},"      allowedMimes",[897,1998,1001],{"class":1000},[897,2000,1004],{"class":989},[897,2002,1008],{"class":1007},[897,2004,2005],{"class":906},"image\u002Fpng",[897,2007,1008],{"class":1007},[897,2009,1743],{"class":989},[897,2011,1008],{"class":1007},[897,2013,2014],{"class":906},"image\u002Fjpeg",[897,2016,1008],{"class":1007},[897,2018,1743],{"class":989},[897,2020,1008],{"class":1007},[897,2022,2023],{"class":906},"image\u002Fwebp",[897,2025,1008],{"class":1007},[897,2027,1016],{"class":989},[897,2029,2031,2034,2036,2038,2040,2043,2045,2047,2049,2052,2054,2056,2058,2061,2063,2065,2067,2070,2072],{"class":899,"line":2030},20,[897,2032,2033],{"class":996},"      allowedExtensions",[897,2035,1001],{"class":1000},[897,2037,1004],{"class":989},[897,2039,1008],{"class":1007},[897,2041,2042],{"class":906},"png",[897,2044,1008],{"class":1007},[897,2046,1743],{"class":989},[897,2048,1008],{"class":1007},[897,2050,2051],{"class":906},"webp",[897,2053,1008],{"class":1007},[897,2055,1743],{"class":989},[897,2057,1008],{"class":1007},[897,2059,2060],{"class":906},"jpeg",[897,2062,1008],{"class":1007},[897,2064,1743],{"class":989},[897,2066,1008],{"class":1007},[897,2068,2069],{"class":906},"jpg",[897,2071,1008],{"class":1007},[897,2073,2074],{"class":989},"]\n",[897,2076,2078],{"class":899,"line":2077},21,[897,2079,1969],{"class":989},[897,2081,2083,2085,2087],{"class":899,"line":2082},22,[897,2084,1421],{"class":996},[897,2086,1001],{"class":1000},[897,2088,1027],{"class":989},[897,2090,2092,2094,2096,2098,2100,2102,2104,2106],{"class":899,"line":2091},23,[897,2093,1431],{"class":996},[897,2095,1001],{"class":1000},[897,2097,1436],{"class":903},[897,2099,1385],{"class":989},[897,2101,1008],{"class":1007},[897,2103,1443],{"class":906},[897,2105,1008],{"class":1007},[897,2107,1448],{"class":989},[897,2109,2111,2113,2115],{"class":899,"line":2110},24,[897,2112,1454],{"class":996},[897,2114,1001],{"class":1000},[897,2116,1027],{"class":989},[897,2118,2120,2122,2124,2126,2128,2130,2132,2134,2136,2138],{"class":899,"line":2119},25,[897,2121,1464],{"class":996},[897,2123,1001],{"class":1000},[897,2125,1470],{"class":1469},[897,2127,1473],{"class":1395},[897,2129,1470],{"class":1469},[897,2131,1473],{"class":1395},[897,2133,1480],{"class":1469},[897,2135,1473],{"class":1395},[897,2137,1485],{"class":1469},[897,2139,1042],{"class":989},[897,2141,2143,2145,2147],{"class":899,"line":2142},26,[897,2144,1493],{"class":996},[897,2146,1001],{"class":1000},[897,2148,1498],{"class":1469},[897,2150,2152],{"class":899,"line":2151},27,[897,2153,1504],{"class":989},[897,2155,2157],{"class":899,"line":2156},28,[897,2158,1092],{"class":989},[897,2160,2162],{"class":899,"line":2161},29,[897,2163,1515],{"class":989},[897,2165,2167],{"class":899,"line":2166},30,[897,2168,1104],{"class":989},[848,2170,2171,2172,1763],{},"See the ",[875,2173,1762],{"href":193},[955,2175],{},[857,2177,2179],{"id":2178},"what-the-module-registers","What the module registers",[1106,2181,2183],{"id":2182},"global-middleware","Global middleware",[848,2185,2186,2187,2189,2190,2193,2194,2197],{},"When ",[852,2188,1116],{}," is ",[852,2191,2192],{},"true",", the module registers a single server middleware that runs on every request before your route handlers. It skips HEAD requests, the ",[852,2195,2196],{},"\u002Fapi\u002Fhealth"," path, Nuxt internal paths, and requests forwarded from localhost.",[848,2199,2200],{},"For all other requests it runs three operations in order:",[2202,2203,2204,2211,2217],"ol",{},[865,2205,2206,2210],{},[2207,2208,2209],"strong",{},"IP validation",": extracts and validates the client IP and visitor fingerprint",[865,2212,2213,2216],{},[2207,2214,2215],{},"Bot detection",": forwards the fingerprint to the IAM service check endpoint and returns 403 if the visitor is flagged",[865,2218,2219,2222,2223,2226],{},[2207,2220,2221],{},"CSRF cookie",": mints a signed ",[852,2224,2225],{},"__Host-csrf"," cookie if one is not already present",[1185,2228,2229],{},[848,2230,2231,2232,2234,2235,2238,2239,1746,2241,2244,2245,2248],{},"Do not apply the Nuxt global auth middleware to routes that use\n",[852,2233,1127],{},". Those routes handle machine-to-machine\n",[852,2236,2237],{},"X-API-KEY"," verification, so running browser middleware on every request can\ntrigger bot-detector rate limits or bans. Keep the middleware enabled for\nregular auth routes, because login, session rotation, MFA,\n",[852,2240,1155],{},[852,2242,2243],{},"defineApiManagementHandler"," still depend on bot\ndetection and the CSRF cookie. In mixed apps, set ",[852,2246,2247],{},"enableMiddleware: false","\nand register your own server middleware that skips the API-key routes.",[1106,2250,2252],{"id":2251},"auth-status-route","Auth status route",[848,2254,2255,2256,2258,2259,2261,2262,2264],{},"The module registers a GET handler at ",[852,2257,1135],{}," (default\n",[852,2260,1056],{},"). This route proxies to the IAM service and\nreturns the current session state. The ",[852,2263,152],{}," composable fetches this\nroute during SSR and on the client.",[1106,2266,2268],{"id":2267},"optional-api-token-list-route","Optional API token list route",[848,2270,2186,2271,2273,2274,2276,2277,2279,2280,2283],{},[852,2272,1131],{}," is set, the module registers a GET handler at\n",[852,2275,1159],{}," using ",[852,2278,1155],{},". This route returns the\nauthenticated user's API token inventory and strips each token's\n",[852,2281,2282],{},"public_identifier"," before the response reaches the browser.",[1106,2285,2287],{"id":2286},"authentication-routes","Authentication routes",[848,2289,2290,2292],{},[852,2291,1201],{}," registers the following routes on the Nitro router:",[1215,2294,2295,2307],{},[1218,2296,2297],{},[1221,2298,2299,2302,2305],{},[1224,2300,2301],{},"Method",[1224,2303,2304],{},"Path",[1224,2306,1229],{},[1231,2308,2309,2322,2334,2346,2359,2372,2384,2396,2407,2419,2431,2442,2454,2466],{},[1221,2310,2311,2314,2319],{},[1236,2312,2313],{},"POST",[1236,2315,2316],{},[852,2317,2318],{},"\u002Flogin",[1236,2320,2321],{},"Email and password login",[1221,2323,2324,2326,2331],{},[1236,2325,2313],{},[1236,2327,2328],{},[852,2329,2330],{},"\u002Fsignup",[1236,2332,2333],{},"User registration",[1221,2335,2336,2338,2343],{},[1236,2337,2313],{},[1236,2339,2340],{},[852,2341,2342],{},"\u002Flogout",[1236,2344,2345],{},"Session termination",[1221,2347,2348,2351,2356],{},[1236,2349,2350],{},"GET",[1236,2352,2353],{},[852,2354,2355],{},"\u002Foauth\u002F:provider",[1236,2357,2358],{},"Initiate an OAuth or OIDC flow",[1221,2360,2361,2364,2369],{},[1236,2362,2363],{},"GET\u002FPOST",[1236,2365,2366],{},[852,2367,2368],{},"\u002Foauth\u002Fcallback\u002F:provider",[1236,2370,2371],{},"OAuth provider callback handler",[1221,2373,2374,2376,2381],{},[1236,2375,2350],{},[1236,2377,2378],{},[852,2379,2380],{},"\u002Fauth\u002Fbounce",[1236,2382,2383],{},"Magic link redirect entry point",[1221,2385,2386,2388,2393],{},[1236,2387,2350],{},[1236,2389,2390],{},[852,2391,2392],{},"\u002Fapi\u002Fauth\u002Fverify-mfa",[1236,2394,2395],{},"MFA magic link validation",[1221,2397,2398,2400,2404],{},[1236,2399,2313],{},[1236,2401,2402],{},[852,2403,2392],{},[1236,2405,2406],{},"Submit an MFA code",[1221,2408,2409,2411,2416],{},[1236,2410,2313],{},[1236,2412,2413],{},[852,2414,2415],{},"\u002Fapi\u002Fauth\u002Fpassword-reset",[1236,2417,2418],{},"Request a password reset link",[1221,2420,2421,2423,2428],{},[1236,2422,2350],{},[1236,2424,2425],{},[852,2426,2427],{},"\u002Fapi\u002Fauth\u002Freset-password",[1236,2429,2430],{},"Password reset link validation",[1221,2432,2433,2435,2439],{},[1236,2434,2313],{},[1236,2436,2437],{},[852,2438,2427],{},[1236,2440,2441],{},"Submit a new password",[1221,2443,2444,2446,2451],{},[1236,2445,2313],{},[1236,2447,2448],{},[852,2449,2450],{},"\u002Fapi\u002Fauth\u002Fchange-email",[1236,2452,2453],{},"Initiate an email change",[1221,2455,2456,2458,2463],{},[1236,2457,2350],{},[1236,2459,2460],{},[852,2461,2462],{},"\u002Fapi\u002Fauth\u002Fupdate-email",[1236,2464,2465],{},"Email change link validation",[1221,2467,2468,2470,2474],{},[1236,2469,2313],{},[1236,2471,2472],{},[852,2473,2462],{},[1236,2475,2476],{},"Confirm new email address",[848,2478,2479,2480,1169],{},"For the full middleware chain and request\u002Fresponse details for each route, see the ",[875,2481,202],{"href":203},[1106,2483,2485],{"id":2484},"auto-imported-server-utilities","Auto-imported server utilities",[848,2487,2488,2489,2491,2492,2495],{},"All server utilities from ",[852,2490,1345],{}," are auto-imported in your ",[852,2493,2494],{},"server\u002F"," directory. You do not need to import them manually inside any server route or plugin.",[1106,2497,2499],{"id":2498},"auto-imported-client-composables","Auto-imported client composables",[848,2501,2502],{},"The following composables are auto-imported in your Vue components and pages:",[1215,2504,2505,2514],{},[1218,2506,2507],{},[1221,2508,2509,2512],{},[1224,2510,2511],{},"Composable",[1224,2513,1229],{},[1231,2515,2516,2525,2534,2543],{},[1221,2517,2518,2522],{},[1236,2519,2520],{},[852,2521,152],{},[1236,2523,2524],{},"Reactive authentication state with SSR hydration",[1221,2526,2527,2531],{},[1236,2528,2529],{},[852,2530,156],{},[1236,2532,2533],{},"Reads and routes magic link query parameters",[1221,2535,2536,2540],{},[1236,2537,2538],{},[852,2539,160],{},[1236,2541,2542],{},"Fetch wrapper with CSRF injection and cookie forwarding",[1221,2544,2545,2549],{},[1236,2546,2547],{},[852,2548,164],{},[1236,2550,2551],{},"Reads the CSRF token from the cookie",[848,2553,2554,2555,2558],{},"See ",[875,2556,2557],{"href":147},"Client-Side"," for full details.",[955,2560],{},[857,2562,2564],{"id":2563},"verify-the-setup","Verify the setup",[848,2566,2567],{},"Start your development server and make a request to the auth status endpoint. With no active session the response should be:",[887,2569,2572],{"className":889,"code":2570,"filename":2571,"language":892,"meta":893,"style":893},"curl http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus\n","Terminal",[852,2573,2574],{"__ignoreMap":893},[897,2575,2576,2579],{"class":899,"line":900},[897,2577,2578],{"class":903},"curl",[897,2580,2581],{"class":906}," http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus\n",[887,2583,2586],{"className":2584,"code":2585,"language":5,"meta":893,"style":893},"language-json shiki shiki-themes light-plus light-plus dracula","{\n  \"authorized\": false\n}\n",[852,2587,2588,2593,2611],{"__ignoreMap":893},[897,2589,2590],{"class":899,"line":900},[897,2591,2592],{"class":989},"{\n",[897,2594,2595,2599,2603,2606,2608],{"class":899,"line":993},[897,2596,2598],{"class":2597},"saJyd","  \"",[897,2600,2602],{"class":2601},"s_W10","authorized",[897,2604,2605],{"class":2597},"\"",[897,2607,1001],{"class":1395},[897,2609,2610],{"class":1038}," false\n",[897,2612,2613],{"class":899,"line":1019},[897,2614,2615],{"class":989},"}\n",[848,2617,2618,2619,2621,2622,2625],{},"A ",[852,2620,2225],{}," cookie should also be present on the response. If the IAM service is unreachable, the auth status handler returns ",[852,2623,2624],{},"{ \"authorized\": false }"," rather than erroring, so check the server logs if you expect a different result.",[1106,2627,2629],{"id":2628},"create-a-protected-endpoint","Create a protected endpoint",[848,2631,2632],{},"Try creating a simple endpoint and querying it in your frontend:",[887,2634,2637],{"className":970,"code":2635,"filename":2636,"language":972,"meta":893,"style":893},"\u002F\u002F This will only return successful response in the user its authenticate\nexport default defineAuthenticatedEventHandler(async (event) => { \n  const user = event.context.authorizedData; \n  return user;\n})\n","server\u002Fapi\u002Fprotected.get.ts",[852,2638,2639,2644,2671,2699,2709],{"__ignoreMap":893},[897,2640,2641],{"class":899,"line":900},[897,2642,2643],{"class":1890},"\u002F\u002F This will only return successful response in the user its authenticate\n",[897,2645,2646,2648,2650,2653,2655,2658,2661,2664,2666,2668],{"class":899,"line":993},[897,2647,980],{"class":979},[897,2649,983],{"class":979},[897,2651,2652],{"class":903}," defineAuthenticatedEventHandler",[897,2654,1385],{"class":989},[897,2656,2657],{"class":1374},"async",[897,2659,2660],{"class":989}," (",[897,2662,2663],{"class":1367},"event",[897,2665,1371],{"class":989},[897,2667,1375],{"class":1374},[897,2669,2670],{"class":989}," { \n",[897,2672,2673,2676,2680,2683,2686,2688,2691,2693,2696],{"class":899,"line":1019},[897,2674,2675],{"class":1374},"  const",[897,2677,2679],{"class":2678},"s3JHE"," user",[897,2681,2682],{"class":1395}," =",[897,2684,2685],{"class":996}," event",[897,2687,1169],{"class":989},[897,2689,2690],{"class":996},"context",[897,2692,1169],{"class":989},[897,2694,2695],{"class":996},"authorizedData",[897,2697,2698],{"class":989},"; \n",[897,2700,2701,2704,2706],{"class":899,"line":1030},[897,2702,2703],{"class":979},"  return",[897,2705,2679],{"class":996},[897,2707,2708],{"class":989},";\n",[897,2710,2711],{"class":899,"line":1045},[897,2712,1104],{"class":989},[887,2714,2719],{"className":2715,"code":2716,"filename":2717,"language":2718,"meta":893,"style":893},"language-vue shiki shiki-themes light-plus light-plus dracula","\u003Cscript setup lang=\"ts\">\nimport { executeRequest } from '@riavzon\u002Fauth-h3client\u002Fclient';\n\nconst result = await executeRequest\u003CData>(\n  '\u002Fapi\u002Fprotected',\n  'GET',\n  {},\n  {},\n  {},\n  {\n    headers: useRequestHeaders(),\n    event: useRequestEvent(),\n    fetcher: useRequestFetch(),\n  },\n)\nconst data = result.data\n\u003C\u002Fscript>\n\n\u003Ctemplate> \n  \u003Cdiv> {{ data }} \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","app\u002Fcomponents\u002Fcomponent.vue","vue",[852,2720,2721,2752,2773,2777,2802,2814,2824,2829,2833,2837,2842,2855,2867,2879,2884,2889,2905,2914,2918,2931,2950],{"__ignoreMap":893},[897,2722,2723,2727,2731,2735,2738,2741,2744,2747,2749],{"class":899,"line":900},[897,2724,2726],{"class":2725},"spX-7","\u003C",[897,2728,2730],{"class":2729},"scd-l","script",[897,2732,2734],{"class":2733},"sAY9V"," setup",[897,2736,2737],{"class":2733}," lang",[897,2739,2740],{"class":1395},"=",[897,2742,2605],{"class":2743},"seisi",[897,2745,972],{"class":2746},"sKKzR",[897,2748,2605],{"class":2743},[897,2750,2751],{"class":2725},">\n",[897,2753,2754,2756,2758,2760,2762,2764,2766,2769,2771],{"class":899,"line":993},[897,2755,1270],{"class":979},[897,2757,1273],{"class":989},[897,2759,160],{"class":996},[897,2761,1279],{"class":989},[897,2763,1282],{"class":979},[897,2765,1053],{"class":1007},[897,2767,2768],{"class":906},"@riavzon\u002Fauth-h3client\u002Fclient",[897,2770,1008],{"class":1007},[897,2772,2708],{"class":989},[897,2774,2775],{"class":899,"line":1019},[897,2776,1352],{"emptyLinePlaceholder":8},[897,2778,2779,2782,2785,2787,2790,2793,2795,2799],{"class":899,"line":1030},[897,2780,2781],{"class":1374},"const",[897,2783,2784],{"class":2678}," result",[897,2786,2682],{"class":1395},[897,2788,2789],{"class":979}," await",[897,2791,2792],{"class":903}," executeRequest",[897,2794,2726],{"class":989},[897,2796,2798],{"class":2797},"sW-rI","Data",[897,2800,2801],{"class":989},">(\n",[897,2803,2804,2807,2810,2812],{"class":899,"line":1045},[897,2805,2806],{"class":1007},"  '",[897,2808,2809],{"class":906},"\u002Fapi\u002Fprotected",[897,2811,1008],{"class":1007},[897,2813,1042],{"class":989},[897,2815,2816,2818,2820,2822],{"class":899,"line":1063},[897,2817,2806],{"class":1007},[897,2819,2350],{"class":906},[897,2821,1008],{"class":1007},[897,2823,1042],{"class":989},[897,2825,2826],{"class":899,"line":1073},[897,2827,2828],{"class":989},"  {},\n",[897,2830,2831],{"class":899,"line":1089},[897,2832,2828],{"class":989},[897,2834,2835],{"class":899,"line":1095},[897,2836,2828],{"class":989},[897,2838,2839],{"class":899,"line":1101},[897,2840,2841],{"class":989},"  {\n",[897,2843,2844,2847,2849,2852],{"class":899,"line":1428},[897,2845,2846],{"class":996},"    headers",[897,2848,1001],{"class":1000},[897,2850,2851],{"class":903}," useRequestHeaders",[897,2853,2854],{"class":989},"(),\n",[897,2856,2857,2860,2862,2865],{"class":899,"line":1451},[897,2858,2859],{"class":996},"    event",[897,2861,1001],{"class":1000},[897,2863,2864],{"class":903}," useRequestEvent",[897,2866,2854],{"class":989},[897,2868,2869,2872,2874,2877],{"class":899,"line":1461},[897,2870,2871],{"class":996},"    fetcher",[897,2873,1001],{"class":1000},[897,2875,2876],{"class":903}," useRequestFetch",[897,2878,2854],{"class":989},[897,2880,2881],{"class":899,"line":1490},[897,2882,2883],{"class":989},"  },\n",[897,2885,2886],{"class":899,"line":1501},[897,2887,2888],{"class":989},")\n",[897,2890,2891,2893,2896,2898,2900,2902],{"class":899,"line":1507},[897,2892,2781],{"class":1374},[897,2894,2895],{"class":2678}," data",[897,2897,2682],{"class":1395},[897,2899,2784],{"class":996},[897,2901,1169],{"class":989},[897,2903,2904],{"class":996},"data\n",[897,2906,2907,2910,2912],{"class":899,"line":1512},[897,2908,2909],{"class":2725},"\u003C\u002F",[897,2911,2730],{"class":2729},[897,2913,2751],{"class":2725},[897,2915,2916],{"class":899,"line":1518},[897,2917,1352],{"emptyLinePlaceholder":8},[897,2919,2920,2922,2925,2928],{"class":899,"line":1993},[897,2921,2726],{"class":2725},[897,2923,2924],{"class":2729},"template",[897,2926,2927],{"class":2725},">",[897,2929,2930],{"class":989}," \n",[897,2932,2933,2936,2939,2941,2944,2946,2948],{"class":899,"line":2030},[897,2934,2935],{"class":2725},"  \u003C",[897,2937,2938],{"class":2729},"div",[897,2940,2927],{"class":2725},[897,2942,2943],{"class":989}," {{ data }} ",[897,2945,2909],{"class":2725},[897,2947,2938],{"class":2729},[897,2949,2751],{"class":2725},[897,2951,2952,2954,2956],{"class":899,"line":2077},[897,2953,2909],{"class":2725},[897,2955,2924],{"class":2729},[897,2957,2751],{"class":2725},[2959,2960,2961],"style",{},"html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}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 .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 .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}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 .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}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 .saJyd, html code.shiki .saJyd{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FE}html pre.shiki code .s_W10, html code.shiki .s_W10{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FD}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .spX-7, html code.shiki .spX-7{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#F8F8F2}html pre.shiki code .scd-l, html code.shiki .scd-l{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#FF79C6}html pre.shiki code .sAY9V, html code.shiki .sAY9V{--shiki-light:#E50000;--shiki-light-font-style:inherit;--shiki-default:#E50000;--shiki-default-font-style:inherit;--shiki-dark:#50FA7B;--shiki-dark-font-style:italic}html pre.shiki code .seisi, html code.shiki .seisi{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#E9F284}html pre.shiki code .sKKzR, html code.shiki .sKKzR{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#F1FA8C}html pre.shiki code .sW-rI, html code.shiki .sW-rI{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}",{"title":893,"searchDepth":993,"depth":993,"links":2963},[2964,2965,2966,2969,2973,2981],{"id":859,"depth":993,"text":860},{"id":881,"depth":993,"text":882},{"id":959,"depth":993,"text":960,"children":2967},[2968],{"id":1108,"depth":1019,"text":1109},{"id":1194,"depth":993,"text":1195,"children":2970},[2971,2972],{"id":1209,"depth":1019,"text":1210},{"id":1752,"depth":1019,"text":1753},{"id":2178,"depth":993,"text":2179,"children":2974},[2975,2976,2977,2978,2979,2980],{"id":2182,"depth":1019,"text":2183},{"id":2251,"depth":1019,"text":2252},{"id":2267,"depth":1019,"text":2268},{"id":2286,"depth":1019,"text":2287},{"id":2484,"depth":1019,"text":2485},{"id":2498,"depth":1019,"text":2499},{"id":2563,"depth":993,"text":2564,"children":2982},[2983],{"id":2628,"depth":1019,"text":2629},"Nuxt module setup, plugin configuration, and first-run verification for the Auth H3 Client.","md",{},null,"---\ntitle: Nuxt Module\ndescription: Nuxt module setup, plugin configuration, and first-run verification for the Auth H3 Client.\nicon: i-lucide-rocket\n---\n\nThe `@riavzon\u002Fauth-h3client` module handles authentication for Nuxt applications. It provides a module that auto-imports client-side composables and server-side utilities, plus optional security middleware.\n\n## Requirements\n\n- Node.js 22 or later\n- Nuxt 3 and later or a Nitro\u002FH3 application\n- A running [IAM service](\u002Fdocs\u002Fiam\u002Fgetting-started) reachable from your server\n\n## Installation\n\n::code-group\n\n```bash [pnpm]\npnpm add @riavzon\u002Fauth-h3client\n```\n\n```bash [yarn]\nyarn add @riavzon\u002Fauth-h3client\n```\n\n```bash [npm]\nnpm install @riavzon\u002Fauth-h3client\n```\n\n```bash [bun]\nbun add @riavzon\u002Fauth-h3client\n```\n\n::\n\n---\n\n## Nuxt module setup\n\nRegister the module in `nuxt.config.ts`. This enables the auto-import of all server utilities and client composables, and optionally registers the global security middleware.\n\n```ts [nuxt.config.ts]\nexport default defineNuxtConfig({\n  modules: ['auth-h3client\u002Fmodule'],\n  authH3Client: {\n    enableMiddleware: true,\n    authStatusUrl: '\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus',\n    registerApiRoute: {\n      path: '\u002Fapi\u002Fauth\u002Fapi-tokens'\n    }\n  }\n})\n```\n\n### Module options\n\n::field-group\n\n::field{name=\"enableMiddleware\" type=\"boolean\"}\nDefault to true - Registers a global server middleware that runs on every incoming request. The middleware calls IP validation, bot detection, and CSRF cookie generation in sequence for browser auth flows. Set to `false` if you want to provide your own middleware so you can exclude machine-to-machine routes protected by `defineAuthenticatePublicApi`. This only disables the bundled middleware. The module still registers the auth status route and any configured `registerApiRoute` handler.\n::\n\n::field{name=\"authStatusUrl\" type=\"string\"}\nDefault to `\"\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus\"` - The route path for the auth\nstatus endpoint. The module registers a GET handler at this path that returns\nthe current session state. The `useAuthData` composable calls this endpoint by\ndefault.\n::\n\n::field{name=\"registerApiRoute\" type=\"{ path: string }\"}\nOptional - When provided, the module registers a GET route backed by\n`getApiListsController`. Use this to expose the authenticated API token\ninventory to your frontend without manually wiring a route.\n::\n\n::field{name=\"registerApiRoute.path\" type=\"string\"}\nRequired when `registerApiRoute` is set - The path where the module registers\nthe API token inventory route. For example, `\"\u002Fapi\u002Fauth\u002Fapi-tokens\"`.\n::\n\n::\n\n::caution\nWhen deploying to a serverless or edge environment such as Vercel, Netlify, or Cloudflare Workers, set `enableFireWallBans: false` in your plugin configuration. The firewall ban feature uses `sudo ufw` and is only available on Linux servers with UFW installed.\n::\n\n::warning\nThe bot detector in this module should be enabled by default, disabling it while using the IAM service will fail session rotation and verification.\n::\n\n---\n\n## Plugin configuration\n\nThe module does not configure the library automatically because the configuration includes non-serializable values such as storage instances and callbacks. You must create a Nitro plugin that calls `defineAuthConfiguration`.\n\n`defineAuthConfiguration` initializes the library, starts the HTTP request logger, and registers all authentication routes on the Nitro router in one call. This is the recommended setup for Nuxt applications.\n\n### Using a config template\n\nThe module ships two config templates that read from environment variables, giving you a working baseline with no manual wiring:\n\n| Template | Description |\n|---|---|\n| `configDefaults` | Core authentication with HMAC signing and unstorage caching |\n| `configDefaultsWithOAuth` | Extends `configDefaults` with Google, GitHub, X, and LinkedIn OAuth providers |\n\nCreate a Nitro plugin and spread the template as the base:\n\n```ts [server\u002Fplugins\u002Fauth.ts]\nimport { defineNitroPlugin } from 'nitropack\u002Fruntime'\nimport { useStorage } from 'nitropack\u002Fruntime\u002Fstorage'\nimport { configDefaults } from 'auth-h3client\u002Fserver\u002Ftemplates'\nimport { defineAuthConfiguration } from 'auth-h3client\u002Fv1'\n\nexport default defineNitroPlugin((nitroApp) => {\n  defineAuthConfiguration(nitroApp, {\n    ...configDefaults,\n    onSuccessRedirect: '\u002Fdashboard',\n    uStorage: {\n      storage: useStorage('cache'),\n      cacheOptions: {\n        successTtl: 60 * 60 * 24 * 30,\n        rateLimitTtl: 10\n      }\n    }\n  })\n})\n```\n\n`configDefaults` reads the following environment variables:\n\n| Variable | Required | Description |\n|---|---|---|\n| `AUTH_SERVER_LOCATION` | Yes | Hostname or IP address of the IAM service |\n| `AUTH_PORT_LOCATION` | Yes | Port the IAM service listens on |\n| `HMAC_CLIENT_ID` | No | HMAC client identifier. Auto-generated if omitted |\n| `HMAC_SHARED_SECRET` | No | HMAC shared secret. Auto-generated if omitted |\n| `AUTH_CRYPTO_COOKIES` | No | Secret used to sign cookies. Auto-generated if omitted |\n\nWhen using `configDefaultsWithOAuth`, add the following variables:\n\n| Variable | Required | Description |\n|---|---|---|\n| `BASEURL` | Yes | Full base URL of your application, e.g. `https:\u002F\u002Fapp.example.com` |\n| `OAUTH_GOOGLE_CLIENT_ID` | Yes | Google OAuth client ID |\n| `OAUTH_GOOGLE_CLIENT_SECRET` | Yes | Google OAuth client secret |\n| `OAUTH_GITHUB_CLIENT_ID` | Yes | GitHub OAuth client ID |\n| `OAUTH_GITHUB_CLIENT_SECRET` | Yes | GitHub OAuth client secret |\n| `OAUTH_X_CLIENT_ID` | Yes | X (Twitter) OAuth client ID |\n| `OAUTH_X_CLIENT_SECRET` | Yes | X (Twitter) OAuth client secret |\n| `OAUTH_LINKEDIN_CLIENT_ID` | Yes | LinkedIn OAuth client ID |\n| `OAUTH_LINKEDIN_CLIENT_SECRET` | Yes | LinkedIn OAuth client secret |\n\n::tip\nProduction values for `HMAC_CLIENT_ID`, `HMAC_SHARED_SECRET`, and `AUTH_CRYPTO_COOKIES` should be stable across restarts and match what the IAM service expects. If you let the template auto-generate them, they will differ on every cold start.\n::\n\n### Manual configuration\n\nIf you need full control over every option, pass the full configuration object directly to `defineAuthConfiguration` without a template. See the [Configuration reference](\u002Fdocs\u002Fauth-h3client\u002Fconfiguration) for a description of every field.\n\n::tip\nYou can spread a template as the base and override only the fields you need, rather than writing the full object from scratch.\n::\n\n```ts [server\u002Fplugins\u002Fauth.ts]\nimport { defineNitroPlugin } from 'nitropack\u002Fruntime'\nimport { useStorage } from 'nitropack\u002Fruntime\u002Fstorage'\nimport { configDefaults } from 'auth-h3client\u002Fserver\u002Ftemplates'\nimport { defineAuthConfiguration } from 'auth-h3client\u002Fv1'\n\nexport default defineNitroPlugin((nitroApp) => {\n  defineAuthConfiguration(nitroApp, {\n    ...configDefaults,\n    \u002F\u002F Override individual fields as needed\n    onSuccessRedirect: '\u002Fdashboard',\n    enableFireWallBans: false,\n    logLevel: 'info',\n    htmlSanitizer: {\n      IrritationCount: 50,\n      maxAllowedInputLength: 50000\n    },\n    imageUploader: {\n      allowedBytes: 5_000_000,\n      allowedMimes: ['image\u002Fpng', 'image\u002Fjpeg', 'image\u002Fwebp'],\n      allowedExtensions: ['png', 'webp', 'jpeg', 'jpg']\n    },\n    uStorage: {\n      storage: useStorage('cache'),\n      cacheOptions: {\n        successTtl: 60 * 60 * 24 * 30,\n        rateLimitTtl: 10\n      }\n    }\n  })\n})\n```\n\nSee the [Configuration reference](\u002Fdocs\u002Fauth-h3client\u002Fconfiguration) for a description of every field.\n\n---\n\n## What the module registers\n\n### Global middleware\n\nWhen `enableMiddleware` is `true`, the module registers a single server middleware that runs on every request before your route handlers. It skips HEAD requests, the `\u002Fapi\u002Fhealth` path, Nuxt internal paths, and requests forwarded from localhost.\n\nFor all other requests it runs three operations in order:\n\n1. **IP validation**: extracts and validates the client IP and visitor fingerprint\n2. **Bot detection**: forwards the fingerprint to the IAM service check endpoint and returns 403 if the visitor is flagged\n3. **CSRF cookie**: mints a signed `__Host-csrf` cookie if one is not already present\n\n::warning\nDo not apply the Nuxt global auth middleware to routes that use\n`defineAuthenticatePublicApi`. Those routes handle machine-to-machine\n`X-API-KEY` verification, so running browser middleware on every request can\ntrigger bot-detector rate limits or bans. Keep the middleware enabled for\nregular auth routes, because login, session rotation, MFA,\n`getApiListsController`, and `defineApiManagementHandler` still depend on bot\ndetection and the CSRF cookie. In mixed apps, set `enableMiddleware: false`\nand register your own server middleware that skips the API-key routes.\n::\n\n### Auth status route\n\nThe module registers a GET handler at `authStatusUrl` (default\n`\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus`). This route proxies to the IAM service and\nreturns the current session state. The `useAuthData` composable fetches this\nroute during SSR and on the client.\n\n### Optional API token list route\n\nWhen `registerApiRoute` is set, the module registers a GET handler at\n`registerApiRoute.path` using `getApiListsController`. This route returns the\nauthenticated user's API token inventory and strips each token's\n`public_identifier` before the response reaches the browser.\n\n### Authentication routes\n\n`defineAuthConfiguration` registers the following routes on the Nitro router:\n\n| Method | Path | Description |\n|---|---|---|\n| POST | `\u002Flogin` | Email and password login |\n| POST | `\u002Fsignup` | User registration |\n| POST | `\u002Flogout` | Session termination |\n| GET | `\u002Foauth\u002F:provider` | Initiate an OAuth or OIDC flow |\n| GET\u002FPOST | `\u002Foauth\u002Fcallback\u002F:provider` | OAuth provider callback handler |\n| GET | `\u002Fauth\u002Fbounce` | Magic link redirect entry point |\n| GET | `\u002Fapi\u002Fauth\u002Fverify-mfa` | MFA magic link validation |\n| POST | `\u002Fapi\u002Fauth\u002Fverify-mfa` | Submit an MFA code |\n| POST | `\u002Fapi\u002Fauth\u002Fpassword-reset` | Request a password reset link |\n| GET | `\u002Fapi\u002Fauth\u002Freset-password` | Password reset link validation |\n| POST | `\u002Fapi\u002Fauth\u002Freset-password` | Submit a new password |\n| POST | `\u002Fapi\u002Fauth\u002Fchange-email` | Initiate an email change |\n| GET | `\u002Fapi\u002Fauth\u002Fupdate-email` | Email change link validation |\n| POST | `\u002Fapi\u002Fauth\u002Fupdate-email` | Confirm new email address |\n\nFor the full middleware chain and request\u002Fresponse details for each route, see the [Routes Reference](\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers).\n\n### Auto-imported server utilities\n\nAll server utilities from `auth-h3client\u002Fv1` are auto-imported in your `server\u002F` directory. You do not need to import them manually inside any server route or plugin.\n\n### Auto-imported client composables\n\nThe following composables are auto-imported in your Vue components and pages:\n\n| Composable | Description |\n|---|---|\n| `useAuthData` | Reactive authentication state with SSR hydration |\n| `useMagicLink` | Reads and routes magic link query parameters |\n| `executeRequest` | Fetch wrapper with CSRF injection and cookie forwarding |\n| `getCsrfToken` | Reads the CSRF token from the cookie |\n\nSee [Client-Side](\u002Fdocs\u002Fauth-h3client\u002Fclient) for full details.\n\n---\n\n## Verify the setup\n\nStart your development server and make a request to the auth status endpoint. With no active session the response should be:\n\n```bash [Terminal]\ncurl http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus\n```\n\n```json\n{\n  \"authorized\": false\n}\n```\n\nA `__Host-csrf` cookie should also be present on the response. If the IAM service is unreachable, the auth status handler returns `{ \"authorized\": false }` rather than erroring, so check the server logs if you expect a different result.\n\n### Create a protected endpoint\n\nTry creating a simple endpoint and querying it in your frontend:\n\n```ts [server\u002Fapi\u002Fprotected.get.ts]\n\u002F\u002F This will only return successful response in the user its authenticate\nexport default defineAuthenticatedEventHandler(async (event) => { \n  const user = event.context.authorizedData; \n  return user;\n})\n```\n\n```vue [app\u002Fcomponents\u002Fcomponent.vue]\n\u003Cscript setup lang=\"ts\">\nimport { executeRequest } from '@riavzon\u002Fauth-h3client\u002Fclient';\n\nconst result = await executeRequest\u003CData>(\n  '\u002Fapi\u002Fprotected',\n  'GET',\n  {},\n  {},\n  {},\n  {\n    headers: useRequestHeaders(),\n    event: useRequestEvent(),\n    fetcher: useRequestFetch(),\n  },\n)\nconst data = result.data\n\u003C\u002Fscript>\n\n\u003Ctemplate> \n  \u003Cdiv> {{ data }} \u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n```",{"title":79,"description":2984},"93KGNuP6fCdCq6cAJC_0p5lCdowAaItNTYXRwrHXPyY",[2992,2993],{"title":14,"path":74,"stem":75,"children":-1},{"title":83,"path":84,"stem":85,"children":-1},{"id":843,"title":79,"body":2995,"description":2984,"extension":2985,"icon":15,"meta":4667,"module":2987,"navigation":8,"path":80,"rawbody":2988,"seo":4668,"stem":81,"__hash__":2990},{"type":845,"value":2996,"toc":4645},[2997,3001,3003,3013,3015,3065,3067,3069,3073,3167,3169,3203,3211,3215,3217,3219,3223,3227,3229,3231,3261,3263,3473,3477,3541,3545,3651,3661,3663,3669,3673,4035,4039,4041,4043,4045,4053,4055,4071,4085,4087,4095,4097,4107,4109,4113,4267,4271,4273,4279,4281,4283,4327,4331,4333,4335,4337,4347,4371,4377,4379,4381,4443,4643],[848,2998,850,2999,855],{},[852,3000,854],{},[857,3002,860],{"id":859},[862,3004,3005,3007,3009],{},[865,3006,867],{},[865,3008,870],{},[865,3010,873,3011,878],{},[875,3012,877],{"href":396},[857,3014,882],{"id":881},[884,3016,3017,3029,3041,3053],{},[887,3018,3019],{"className":889,"code":890,"filename":891,"language":892,"meta":893,"style":893},[852,3020,3021],{"__ignoreMap":893},[897,3022,3023,3025,3027],{"class":899,"line":900},[897,3024,891],{"class":903},[897,3026,907],{"class":906},[897,3028,910],{"class":906},[887,3030,3031],{"className":889,"code":913,"filename":914,"language":892,"meta":893,"style":893},[852,3032,3033],{"__ignoreMap":893},[897,3034,3035,3037,3039],{"class":899,"line":900},[897,3036,914],{"class":903},[897,3038,907],{"class":906},[897,3040,910],{"class":906},[887,3042,3043],{"className":889,"code":927,"filename":928,"language":892,"meta":893,"style":893},[852,3044,3045],{"__ignoreMap":893},[897,3046,3047,3049,3051],{"class":899,"line":900},[897,3048,928],{"class":903},[897,3050,937],{"class":906},[897,3052,910],{"class":906},[887,3054,3055],{"className":889,"code":942,"filename":943,"language":892,"meta":893,"style":893},[852,3056,3057],{"__ignoreMap":893},[897,3058,3059,3061,3063],{"class":899,"line":900},[897,3060,943],{"class":903},[897,3062,907],{"class":906},[897,3064,910],{"class":906},[955,3066],{},[857,3068,960],{"id":959},[848,3070,963,3071,967],{},[852,3072,966],{},[887,3074,3075],{"className":970,"code":971,"filename":966,"language":972,"meta":893,"style":893},[852,3076,3077,3087,3103,3111,3121,3135,3143,3155,3159,3163],{"__ignoreMap":893},[897,3078,3079,3081,3083,3085],{"class":899,"line":900},[897,3080,980],{"class":979},[897,3082,983],{"class":979},[897,3084,986],{"class":903},[897,3086,990],{"class":989},[897,3088,3089,3091,3093,3095,3097,3099,3101],{"class":899,"line":993},[897,3090,997],{"class":996},[897,3092,1001],{"class":1000},[897,3094,1004],{"class":989},[897,3096,1008],{"class":1007},[897,3098,1011],{"class":906},[897,3100,1008],{"class":1007},[897,3102,1016],{"class":989},[897,3104,3105,3107,3109],{"class":899,"line":1019},[897,3106,1022],{"class":996},[897,3108,1001],{"class":1000},[897,3110,1027],{"class":989},[897,3112,3113,3115,3117,3119],{"class":899,"line":1030},[897,3114,1033],{"class":996},[897,3116,1001],{"class":1000},[897,3118,1039],{"class":1038},[897,3120,1042],{"class":989},[897,3122,3123,3125,3127,3129,3131,3133],{"class":899,"line":1045},[897,3124,1048],{"class":996},[897,3126,1001],{"class":1000},[897,3128,1053],{"class":1007},[897,3130,1056],{"class":906},[897,3132,1008],{"class":1007},[897,3134,1042],{"class":989},[897,3136,3137,3139,3141],{"class":899,"line":1063},[897,3138,1066],{"class":996},[897,3140,1001],{"class":1000},[897,3142,1027],{"class":989},[897,3144,3145,3147,3149,3151,3153],{"class":899,"line":1073},[897,3146,1076],{"class":996},[897,3148,1001],{"class":1000},[897,3150,1053],{"class":1007},[897,3152,1083],{"class":906},[897,3154,1086],{"class":1007},[897,3156,3157],{"class":899,"line":1089},[897,3158,1092],{"class":989},[897,3160,3161],{"class":899,"line":1095},[897,3162,1098],{"class":989},[897,3164,3165],{"class":899,"line":1101},[897,3166,1104],{"class":989},[1106,3168,1109],{"id":1108},[1111,3170,3171,3181,3189,3195],{},[1114,3172,3173],{"name":1116,"type":1117},[848,3174,1120,3175,1124,3177,1128,3179,1132],{},[852,3176,1123],{},[852,3178,1127],{},[852,3180,1131],{},[1114,3182,3183],{"name":1135,"type":1136},[848,3184,1139,3185,1143,3187,1146],{},[852,3186,1142],{},[852,3188,152],{},[1114,3190,3191],{"name":1131,"type":1149},[848,3192,1152,3193,1156],{},[852,3194,1155],{},[1114,3196,3197],{"name":1159,"type":1136},[848,3198,1162,3199,1165,3201,1169],{},[852,3200,1131],{},[852,3202,1168],{},[1171,3204,3205],{},[848,3206,1175,3207,1179,3209,1183],{},[852,3208,1178],{},[852,3210,1182],{},[1185,3212,3213],{},[848,3214,1189],{},[955,3216],{},[857,3218,1195],{"id":1194},[848,3220,1198,3221,1169],{},[852,3222,1201],{},[848,3224,3225,1206],{},[852,3226,1201],{},[1106,3228,1210],{"id":1209},[848,3230,1213],{},[1215,3232,3233,3241],{},[1218,3234,3235],{},[1221,3236,3237,3239],{},[1224,3238,1226],{},[1224,3240,1229],{},[1231,3242,3243,3251],{},[1221,3244,3245,3249],{},[1236,3246,3247],{},[852,3248,1240],{},[1236,3250,1243],{},[1221,3252,3253,3257],{},[1236,3254,3255],{},[852,3256,1250],{},[1236,3258,1253,3259,1256],{},[852,3260,1240],{},[848,3262,1259],{},[887,3264,3265],{"className":970,"code":1262,"filename":1263,"language":972,"meta":893,"style":893},[852,3266,3267,3285,3303,3321,3339,3343,3361,3371,3379,3393,3401,3419,3427,3449,3457,3461,3465,3469],{"__ignoreMap":893},[897,3268,3269,3271,3273,3275,3277,3279,3281,3283],{"class":899,"line":900},[897,3270,1270],{"class":979},[897,3272,1273],{"class":989},[897,3274,1276],{"class":996},[897,3276,1279],{"class":989},[897,3278,1282],{"class":979},[897,3280,1053],{"class":1007},[897,3282,1287],{"class":906},[897,3284,1086],{"class":1007},[897,3286,3287,3289,3291,3293,3295,3297,3299,3301],{"class":899,"line":993},[897,3288,1270],{"class":979},[897,3290,1273],{"class":989},[897,3292,1298],{"class":996},[897,3294,1279],{"class":989},[897,3296,1282],{"class":979},[897,3298,1053],{"class":1007},[897,3300,1307],{"class":906},[897,3302,1086],{"class":1007},[897,3304,3305,3307,3309,3311,3313,3315,3317,3319],{"class":899,"line":1019},[897,3306,1270],{"class":979},[897,3308,1273],{"class":989},[897,3310,1240],{"class":996},[897,3312,1279],{"class":989},[897,3314,1282],{"class":979},[897,3316,1053],{"class":1007},[897,3318,1326],{"class":906},[897,3320,1086],{"class":1007},[897,3322,3323,3325,3327,3329,3331,3333,3335,3337],{"class":899,"line":1030},[897,3324,1270],{"class":979},[897,3326,1273],{"class":989},[897,3328,1201],{"class":996},[897,3330,1279],{"class":989},[897,3332,1282],{"class":979},[897,3334,1053],{"class":1007},[897,3336,1345],{"class":906},[897,3338,1086],{"class":1007},[897,3340,3341],{"class":899,"line":1045},[897,3342,1352],{"emptyLinePlaceholder":8},[897,3344,3345,3347,3349,3351,3353,3355,3357,3359],{"class":899,"line":1063},[897,3346,980],{"class":979},[897,3348,983],{"class":979},[897,3350,1361],{"class":903},[897,3352,1364],{"class":989},[897,3354,1368],{"class":1367},[897,3356,1371],{"class":989},[897,3358,1375],{"class":1374},[897,3360,1027],{"class":989},[897,3362,3363,3365,3367,3369],{"class":899,"line":1073},[897,3364,1382],{"class":903},[897,3366,1385],{"class":989},[897,3368,1368],{"class":996},[897,3370,1390],{"class":989},[897,3372,3373,3375,3377],{"class":899,"line":1089},[897,3374,1396],{"class":1395},[897,3376,1240],{"class":996},[897,3378,1042],{"class":989},[897,3380,3381,3383,3385,3387,3389,3391],{"class":899,"line":1095},[897,3382,1405],{"class":996},[897,3384,1001],{"class":1000},[897,3386,1053],{"class":1007},[897,3388,1412],{"class":906},[897,3390,1008],{"class":1007},[897,3392,1042],{"class":989},[897,3394,3395,3397,3399],{"class":899,"line":1101},[897,3396,1421],{"class":996},[897,3398,1001],{"class":1000},[897,3400,1027],{"class":989},[897,3402,3403,3405,3407,3409,3411,3413,3415,3417],{"class":899,"line":1428},[897,3404,1431],{"class":996},[897,3406,1001],{"class":1000},[897,3408,1436],{"class":903},[897,3410,1385],{"class":989},[897,3412,1008],{"class":1007},[897,3414,1443],{"class":906},[897,3416,1008],{"class":1007},[897,3418,1448],{"class":989},[897,3420,3421,3423,3425],{"class":899,"line":1451},[897,3422,1454],{"class":996},[897,3424,1001],{"class":1000},[897,3426,1027],{"class":989},[897,3428,3429,3431,3433,3435,3437,3439,3441,3443,3445,3447],{"class":899,"line":1461},[897,3430,1464],{"class":996},[897,3432,1001],{"class":1000},[897,3434,1470],{"class":1469},[897,3436,1473],{"class":1395},[897,3438,1470],{"class":1469},[897,3440,1473],{"class":1395},[897,3442,1480],{"class":1469},[897,3444,1473],{"class":1395},[897,3446,1485],{"class":1469},[897,3448,1042],{"class":989},[897,3450,3451,3453,3455],{"class":899,"line":1490},[897,3452,1493],{"class":996},[897,3454,1001],{"class":1000},[897,3456,1498],{"class":1469},[897,3458,3459],{"class":899,"line":1501},[897,3460,1504],{"class":989},[897,3462,3463],{"class":899,"line":1507},[897,3464,1092],{"class":989},[897,3466,3467],{"class":899,"line":1512},[897,3468,1515],{"class":989},[897,3470,3471],{"class":899,"line":1518},[897,3472,1104],{"class":989},[848,3474,3475,1525],{},[852,3476,1240],{},[1215,3478,3479,3489],{},[1218,3480,3481],{},[1221,3482,3483,3485,3487],{},[1224,3484,1534],{},[1224,3486,1537],{},[1224,3488,1229],{},[1231,3490,3491,3501,3511,3521,3531],{},[1221,3492,3493,3497,3499],{},[1236,3494,3495],{},[852,3496,1548],{},[1236,3498,1551],{},[1236,3500,1554],{},[1221,3502,3503,3507,3509],{},[1236,3504,3505],{},[852,3506,1561],{},[1236,3508,1551],{},[1236,3510,1566],{},[1221,3512,3513,3517,3519],{},[1236,3514,3515],{},[852,3516,1573],{},[1236,3518,1576],{},[1236,3520,1579],{},[1221,3522,3523,3527,3529],{},[1236,3524,3525],{},[852,3526,1586],{},[1236,3528,1576],{},[1236,3530,1591],{},[1221,3532,3533,3537,3539],{},[1236,3534,3535],{},[852,3536,1598],{},[1236,3538,1576],{},[1236,3540,1603],{},[848,3542,1606,3543,1609],{},[852,3544,1250],{},[1215,3546,3547,3557],{},[1218,3548,3549],{},[1221,3550,3551,3553,3555],{},[1224,3552,1534],{},[1224,3554,1537],{},[1224,3556,1229],{},[1231,3558,3559,3571,3581,3591,3601,3611,3621,3631,3641],{},[1221,3560,3561,3565,3567],{},[1236,3562,3563],{},[852,3564,1630],{},[1236,3566,1551],{},[1236,3568,1635,3569],{},[852,3570,1638],{},[1221,3572,3573,3577,3579],{},[1236,3574,3575],{},[852,3576,1645],{},[1236,3578,1551],{},[1236,3580,1650],{},[1221,3582,3583,3587,3589],{},[1236,3584,3585],{},[852,3586,1657],{},[1236,3588,1551],{},[1236,3590,1662],{},[1221,3592,3593,3597,3599],{},[1236,3594,3595],{},[852,3596,1669],{},[1236,3598,1551],{},[1236,3600,1674],{},[1221,3602,3603,3607,3609],{},[1236,3604,3605],{},[852,3606,1681],{},[1236,3608,1551],{},[1236,3610,1686],{},[1221,3612,3613,3617,3619],{},[1236,3614,3615],{},[852,3616,1693],{},[1236,3618,1551],{},[1236,3620,1698],{},[1221,3622,3623,3627,3629],{},[1236,3624,3625],{},[852,3626,1705],{},[1236,3628,1551],{},[1236,3630,1710],{},[1221,3632,3633,3637,3639],{},[1236,3634,3635],{},[852,3636,1717],{},[1236,3638,1551],{},[1236,3640,1722],{},[1221,3642,3643,3647,3649],{},[1236,3644,3645],{},[852,3646,1729],{},[1236,3648,1551],{},[1236,3650,1734],{},[1736,3652,3653],{},[848,3654,1740,3655,1743,3657,1746,3659,1749],{},[852,3656,1573],{},[852,3658,1586],{},[852,3660,1598],{},[1106,3662,1753],{"id":1752},[848,3664,1756,3665,1759,3667,1763],{},[852,3666,1201],{},[875,3668,1762],{"href":193},[1736,3670,3671],{},[848,3672,1768],{},[887,3674,3675],{"className":970,"code":1771,"filename":1263,"language":972,"meta":893,"style":893},[852,3676,3677,3695,3713,3731,3749,3753,3771,3781,3789,3793,3807,3817,3831,3839,3849,3857,3861,3869,3879,3911,3951,3955,3963,3981,3989,4011,4019,4023,4027,4031],{"__ignoreMap":893},[897,3678,3679,3681,3683,3685,3687,3689,3691,3693],{"class":899,"line":900},[897,3680,1270],{"class":979},[897,3682,1273],{"class":989},[897,3684,1276],{"class":996},[897,3686,1279],{"class":989},[897,3688,1282],{"class":979},[897,3690,1053],{"class":1007},[897,3692,1287],{"class":906},[897,3694,1086],{"class":1007},[897,3696,3697,3699,3701,3703,3705,3707,3709,3711],{"class":899,"line":993},[897,3698,1270],{"class":979},[897,3700,1273],{"class":989},[897,3702,1298],{"class":996},[897,3704,1279],{"class":989},[897,3706,1282],{"class":979},[897,3708,1053],{"class":1007},[897,3710,1307],{"class":906},[897,3712,1086],{"class":1007},[897,3714,3715,3717,3719,3721,3723,3725,3727,3729],{"class":899,"line":1019},[897,3716,1270],{"class":979},[897,3718,1273],{"class":989},[897,3720,1240],{"class":996},[897,3722,1279],{"class":989},[897,3724,1282],{"class":979},[897,3726,1053],{"class":1007},[897,3728,1326],{"class":906},[897,3730,1086],{"class":1007},[897,3732,3733,3735,3737,3739,3741,3743,3745,3747],{"class":899,"line":1030},[897,3734,1270],{"class":979},[897,3736,1273],{"class":989},[897,3738,1201],{"class":996},[897,3740,1279],{"class":989},[897,3742,1282],{"class":979},[897,3744,1053],{"class":1007},[897,3746,1345],{"class":906},[897,3748,1086],{"class":1007},[897,3750,3751],{"class":899,"line":1045},[897,3752,1352],{"emptyLinePlaceholder":8},[897,3754,3755,3757,3759,3761,3763,3765,3767,3769],{"class":899,"line":1063},[897,3756,980],{"class":979},[897,3758,983],{"class":979},[897,3760,1361],{"class":903},[897,3762,1364],{"class":989},[897,3764,1368],{"class":1367},[897,3766,1371],{"class":989},[897,3768,1375],{"class":1374},[897,3770,1027],{"class":989},[897,3772,3773,3775,3777,3779],{"class":899,"line":1073},[897,3774,1382],{"class":903},[897,3776,1385],{"class":989},[897,3778,1368],{"class":996},[897,3780,1390],{"class":989},[897,3782,3783,3785,3787],{"class":899,"line":1089},[897,3784,1396],{"class":1395},[897,3786,1240],{"class":996},[897,3788,1042],{"class":989},[897,3790,3791],{"class":899,"line":1095},[897,3792,1891],{"class":1890},[897,3794,3795,3797,3799,3801,3803,3805],{"class":899,"line":1101},[897,3796,1405],{"class":996},[897,3798,1001],{"class":1000},[897,3800,1053],{"class":1007},[897,3802,1412],{"class":906},[897,3804,1008],{"class":1007},[897,3806,1042],{"class":989},[897,3808,3809,3811,3813,3815],{"class":899,"line":1428},[897,3810,1910],{"class":996},[897,3812,1001],{"class":1000},[897,3814,1915],{"class":1038},[897,3816,1042],{"class":989},[897,3818,3819,3821,3823,3825,3827,3829],{"class":899,"line":1451},[897,3820,1922],{"class":996},[897,3822,1001],{"class":1000},[897,3824,1053],{"class":1007},[897,3826,1929],{"class":906},[897,3828,1008],{"class":1007},[897,3830,1042],{"class":989},[897,3832,3833,3835,3837],{"class":899,"line":1461},[897,3834,1938],{"class":996},[897,3836,1001],{"class":1000},[897,3838,1027],{"class":989},[897,3840,3841,3843,3845,3847],{"class":899,"line":1490},[897,3842,1947],{"class":996},[897,3844,1001],{"class":1000},[897,3846,1952],{"class":1469},[897,3848,1042],{"class":989},[897,3850,3851,3853,3855],{"class":899,"line":1501},[897,3852,1959],{"class":996},[897,3854,1001],{"class":1000},[897,3856,1964],{"class":1469},[897,3858,3859],{"class":899,"line":1507},[897,3860,1969],{"class":989},[897,3862,3863,3865,3867],{"class":899,"line":1512},[897,3864,1974],{"class":996},[897,3866,1001],{"class":1000},[897,3868,1027],{"class":989},[897,3870,3871,3873,3875,3877],{"class":899,"line":1518},[897,3872,1983],{"class":996},[897,3874,1001],{"class":1000},[897,3876,1988],{"class":1469},[897,3878,1042],{"class":989},[897,3880,3881,3883,3885,3887,3889,3891,3893,3895,3897,3899,3901,3903,3905,3907,3909],{"class":899,"line":1993},[897,3882,1996],{"class":996},[897,3884,1001],{"class":1000},[897,3886,1004],{"class":989},[897,3888,1008],{"class":1007},[897,3890,2005],{"class":906},[897,3892,1008],{"class":1007},[897,3894,1743],{"class":989},[897,3896,1008],{"class":1007},[897,3898,2014],{"class":906},[897,3900,1008],{"class":1007},[897,3902,1743],{"class":989},[897,3904,1008],{"class":1007},[897,3906,2023],{"class":906},[897,3908,1008],{"class":1007},[897,3910,1016],{"class":989},[897,3912,3913,3915,3917,3919,3921,3923,3925,3927,3929,3931,3933,3935,3937,3939,3941,3943,3945,3947,3949],{"class":899,"line":2030},[897,3914,2033],{"class":996},[897,3916,1001],{"class":1000},[897,3918,1004],{"class":989},[897,3920,1008],{"class":1007},[897,3922,2042],{"class":906},[897,3924,1008],{"class":1007},[897,3926,1743],{"class":989},[897,3928,1008],{"class":1007},[897,3930,2051],{"class":906},[897,3932,1008],{"class":1007},[897,3934,1743],{"class":989},[897,3936,1008],{"class":1007},[897,3938,2060],{"class":906},[897,3940,1008],{"class":1007},[897,3942,1743],{"class":989},[897,3944,1008],{"class":1007},[897,3946,2069],{"class":906},[897,3948,1008],{"class":1007},[897,3950,2074],{"class":989},[897,3952,3953],{"class":899,"line":2077},[897,3954,1969],{"class":989},[897,3956,3957,3959,3961],{"class":899,"line":2082},[897,3958,1421],{"class":996},[897,3960,1001],{"class":1000},[897,3962,1027],{"class":989},[897,3964,3965,3967,3969,3971,3973,3975,3977,3979],{"class":899,"line":2091},[897,3966,1431],{"class":996},[897,3968,1001],{"class":1000},[897,3970,1436],{"class":903},[897,3972,1385],{"class":989},[897,3974,1008],{"class":1007},[897,3976,1443],{"class":906},[897,3978,1008],{"class":1007},[897,3980,1448],{"class":989},[897,3982,3983,3985,3987],{"class":899,"line":2110},[897,3984,1454],{"class":996},[897,3986,1001],{"class":1000},[897,3988,1027],{"class":989},[897,3990,3991,3993,3995,3997,3999,4001,4003,4005,4007,4009],{"class":899,"line":2119},[897,3992,1464],{"class":996},[897,3994,1001],{"class":1000},[897,3996,1470],{"class":1469},[897,3998,1473],{"class":1395},[897,4000,1470],{"class":1469},[897,4002,1473],{"class":1395},[897,4004,1480],{"class":1469},[897,4006,1473],{"class":1395},[897,4008,1485],{"class":1469},[897,4010,1042],{"class":989},[897,4012,4013,4015,4017],{"class":899,"line":2142},[897,4014,1493],{"class":996},[897,4016,1001],{"class":1000},[897,4018,1498],{"class":1469},[897,4020,4021],{"class":899,"line":2151},[897,4022,1504],{"class":989},[897,4024,4025],{"class":899,"line":2156},[897,4026,1092],{"class":989},[897,4028,4029],{"class":899,"line":2161},[897,4030,1515],{"class":989},[897,4032,4033],{"class":899,"line":2166},[897,4034,1104],{"class":989},[848,4036,2171,4037,1763],{},[875,4038,1762],{"href":193},[955,4040],{},[857,4042,2179],{"id":2178},[1106,4044,2183],{"id":2182},[848,4046,2186,4047,2189,4049,2193,4051,2197],{},[852,4048,1116],{},[852,4050,2192],{},[852,4052,2196],{},[848,4054,2200],{},[2202,4056,4057,4061,4065],{},[865,4058,4059,2210],{},[2207,4060,2209],{},[865,4062,4063,2216],{},[2207,4064,2215],{},[865,4066,4067,2222,4069,2226],{},[2207,4068,2221],{},[852,4070,2225],{},[1185,4072,4073],{},[848,4074,2231,4075,2234,4077,2238,4079,1746,4081,2244,4083,2248],{},[852,4076,1127],{},[852,4078,2237],{},[852,4080,1155],{},[852,4082,2243],{},[852,4084,2247],{},[1106,4086,2252],{"id":2251},[848,4088,2255,4089,2258,4091,2261,4093,2264],{},[852,4090,1135],{},[852,4092,1056],{},[852,4094,152],{},[1106,4096,2268],{"id":2267},[848,4098,2186,4099,2273,4101,2276,4103,2279,4105,2283],{},[852,4100,1131],{},[852,4102,1159],{},[852,4104,1155],{},[852,4106,2282],{},[1106,4108,2287],{"id":2286},[848,4110,4111,2292],{},[852,4112,1201],{},[1215,4114,4115,4125],{},[1218,4116,4117],{},[1221,4118,4119,4121,4123],{},[1224,4120,2301],{},[1224,4122,2304],{},[1224,4124,1229],{},[1231,4126,4127,4137,4147,4157,4167,4177,4187,4197,4207,4217,4227,4237,4247,4257],{},[1221,4128,4129,4131,4135],{},[1236,4130,2313],{},[1236,4132,4133],{},[852,4134,2318],{},[1236,4136,2321],{},[1221,4138,4139,4141,4145],{},[1236,4140,2313],{},[1236,4142,4143],{},[852,4144,2330],{},[1236,4146,2333],{},[1221,4148,4149,4151,4155],{},[1236,4150,2313],{},[1236,4152,4153],{},[852,4154,2342],{},[1236,4156,2345],{},[1221,4158,4159,4161,4165],{},[1236,4160,2350],{},[1236,4162,4163],{},[852,4164,2355],{},[1236,4166,2358],{},[1221,4168,4169,4171,4175],{},[1236,4170,2363],{},[1236,4172,4173],{},[852,4174,2368],{},[1236,4176,2371],{},[1221,4178,4179,4181,4185],{},[1236,4180,2350],{},[1236,4182,4183],{},[852,4184,2380],{},[1236,4186,2383],{},[1221,4188,4189,4191,4195],{},[1236,4190,2350],{},[1236,4192,4193],{},[852,4194,2392],{},[1236,4196,2395],{},[1221,4198,4199,4201,4205],{},[1236,4200,2313],{},[1236,4202,4203],{},[852,4204,2392],{},[1236,4206,2406],{},[1221,4208,4209,4211,4215],{},[1236,4210,2313],{},[1236,4212,4213],{},[852,4214,2415],{},[1236,4216,2418],{},[1221,4218,4219,4221,4225],{},[1236,4220,2350],{},[1236,4222,4223],{},[852,4224,2427],{},[1236,4226,2430],{},[1221,4228,4229,4231,4235],{},[1236,4230,2313],{},[1236,4232,4233],{},[852,4234,2427],{},[1236,4236,2441],{},[1221,4238,4239,4241,4245],{},[1236,4240,2313],{},[1236,4242,4243],{},[852,4244,2450],{},[1236,4246,2453],{},[1221,4248,4249,4251,4255],{},[1236,4250,2350],{},[1236,4252,4253],{},[852,4254,2462],{},[1236,4256,2465],{},[1221,4258,4259,4261,4265],{},[1236,4260,2313],{},[1236,4262,4263],{},[852,4264,2462],{},[1236,4266,2476],{},[848,4268,2479,4269,1169],{},[875,4270,202],{"href":203},[1106,4272,2485],{"id":2484},[848,4274,2488,4275,2491,4277,2495],{},[852,4276,1345],{},[852,4278,2494],{},[1106,4280,2499],{"id":2498},[848,4282,2502],{},[1215,4284,4285,4293],{},[1218,4286,4287],{},[1221,4288,4289,4291],{},[1224,4290,2511],{},[1224,4292,1229],{},[1231,4294,4295,4303,4311,4319],{},[1221,4296,4297,4301],{},[1236,4298,4299],{},[852,4300,152],{},[1236,4302,2524],{},[1221,4304,4305,4309],{},[1236,4306,4307],{},[852,4308,156],{},[1236,4310,2533],{},[1221,4312,4313,4317],{},[1236,4314,4315],{},[852,4316,160],{},[1236,4318,2542],{},[1221,4320,4321,4325],{},[1236,4322,4323],{},[852,4324,164],{},[1236,4326,2551],{},[848,4328,2554,4329,2558],{},[875,4330,2557],{"href":147},[955,4332],{},[857,4334,2564],{"id":2563},[848,4336,2567],{},[887,4338,4339],{"className":889,"code":2570,"filename":2571,"language":892,"meta":893,"style":893},[852,4340,4341],{"__ignoreMap":893},[897,4342,4343,4345],{"class":899,"line":900},[897,4344,2578],{"class":903},[897,4346,2581],{"class":906},[887,4348,4349],{"className":2584,"code":2585,"language":5,"meta":893,"style":893},[852,4350,4351,4355,4367],{"__ignoreMap":893},[897,4352,4353],{"class":899,"line":900},[897,4354,2592],{"class":989},[897,4356,4357,4359,4361,4363,4365],{"class":899,"line":993},[897,4358,2598],{"class":2597},[897,4360,2602],{"class":2601},[897,4362,2605],{"class":2597},[897,4364,1001],{"class":1395},[897,4366,2610],{"class":1038},[897,4368,4369],{"class":899,"line":1019},[897,4370,2615],{"class":989},[848,4372,2618,4373,2621,4375,2625],{},[852,4374,2225],{},[852,4376,2624],{},[1106,4378,2629],{"id":2628},[848,4380,2632],{},[887,4382,4383],{"className":970,"code":2635,"filename":2636,"language":972,"meta":893,"style":893},[852,4384,4385,4389,4411,4431,4439],{"__ignoreMap":893},[897,4386,4387],{"class":899,"line":900},[897,4388,2643],{"class":1890},[897,4390,4391,4393,4395,4397,4399,4401,4403,4405,4407,4409],{"class":899,"line":993},[897,4392,980],{"class":979},[897,4394,983],{"class":979},[897,4396,2652],{"class":903},[897,4398,1385],{"class":989},[897,4400,2657],{"class":1374},[897,4402,2660],{"class":989},[897,4404,2663],{"class":1367},[897,4406,1371],{"class":989},[897,4408,1375],{"class":1374},[897,4410,2670],{"class":989},[897,4412,4413,4415,4417,4419,4421,4423,4425,4427,4429],{"class":899,"line":1019},[897,4414,2675],{"class":1374},[897,4416,2679],{"class":2678},[897,4418,2682],{"class":1395},[897,4420,2685],{"class":996},[897,4422,1169],{"class":989},[897,4424,2690],{"class":996},[897,4426,1169],{"class":989},[897,4428,2695],{"class":996},[897,4430,2698],{"class":989},[897,4432,4433,4435,4437],{"class":899,"line":1030},[897,4434,2703],{"class":979},[897,4436,2679],{"class":996},[897,4438,2708],{"class":989},[897,4440,4441],{"class":899,"line":1045},[897,4442,1104],{"class":989},[887,4444,4445],{"className":2715,"code":2716,"filename":2717,"language":2718,"meta":893,"style":893},[852,4446,4447,4467,4487,4491,4509,4519,4529,4533,4537,4541,4545,4555,4565,4575,4579,4583,4597,4605,4609,4619,4635],{"__ignoreMap":893},[897,4448,4449,4451,4453,4455,4457,4459,4461,4463,4465],{"class":899,"line":900},[897,4450,2726],{"class":2725},[897,4452,2730],{"class":2729},[897,4454,2734],{"class":2733},[897,4456,2737],{"class":2733},[897,4458,2740],{"class":1395},[897,4460,2605],{"class":2743},[897,4462,972],{"class":2746},[897,4464,2605],{"class":2743},[897,4466,2751],{"class":2725},[897,4468,4469,4471,4473,4475,4477,4479,4481,4483,4485],{"class":899,"line":993},[897,4470,1270],{"class":979},[897,4472,1273],{"class":989},[897,4474,160],{"class":996},[897,4476,1279],{"class":989},[897,4478,1282],{"class":979},[897,4480,1053],{"class":1007},[897,4482,2768],{"class":906},[897,4484,1008],{"class":1007},[897,4486,2708],{"class":989},[897,4488,4489],{"class":899,"line":1019},[897,4490,1352],{"emptyLinePlaceholder":8},[897,4492,4493,4495,4497,4499,4501,4503,4505,4507],{"class":899,"line":1030},[897,4494,2781],{"class":1374},[897,4496,2784],{"class":2678},[897,4498,2682],{"class":1395},[897,4500,2789],{"class":979},[897,4502,2792],{"class":903},[897,4504,2726],{"class":989},[897,4506,2798],{"class":2797},[897,4508,2801],{"class":989},[897,4510,4511,4513,4515,4517],{"class":899,"line":1045},[897,4512,2806],{"class":1007},[897,4514,2809],{"class":906},[897,4516,1008],{"class":1007},[897,4518,1042],{"class":989},[897,4520,4521,4523,4525,4527],{"class":899,"line":1063},[897,4522,2806],{"class":1007},[897,4524,2350],{"class":906},[897,4526,1008],{"class":1007},[897,4528,1042],{"class":989},[897,4530,4531],{"class":899,"line":1073},[897,4532,2828],{"class":989},[897,4534,4535],{"class":899,"line":1089},[897,4536,2828],{"class":989},[897,4538,4539],{"class":899,"line":1095},[897,4540,2828],{"class":989},[897,4542,4543],{"class":899,"line":1101},[897,4544,2841],{"class":989},[897,4546,4547,4549,4551,4553],{"class":899,"line":1428},[897,4548,2846],{"class":996},[897,4550,1001],{"class":1000},[897,4552,2851],{"class":903},[897,4554,2854],{"class":989},[897,4556,4557,4559,4561,4563],{"class":899,"line":1451},[897,4558,2859],{"class":996},[897,4560,1001],{"class":1000},[897,4562,2864],{"class":903},[897,4564,2854],{"class":989},[897,4566,4567,4569,4571,4573],{"class":899,"line":1461},[897,4568,2871],{"class":996},[897,4570,1001],{"class":1000},[897,4572,2876],{"class":903},[897,4574,2854],{"class":989},[897,4576,4577],{"class":899,"line":1490},[897,4578,2883],{"class":989},[897,4580,4581],{"class":899,"line":1501},[897,4582,2888],{"class":989},[897,4584,4585,4587,4589,4591,4593,4595],{"class":899,"line":1507},[897,4586,2781],{"class":1374},[897,4588,2895],{"class":2678},[897,4590,2682],{"class":1395},[897,4592,2784],{"class":996},[897,4594,1169],{"class":989},[897,4596,2904],{"class":996},[897,4598,4599,4601,4603],{"class":899,"line":1512},[897,4600,2909],{"class":2725},[897,4602,2730],{"class":2729},[897,4604,2751],{"class":2725},[897,4606,4607],{"class":899,"line":1518},[897,4608,1352],{"emptyLinePlaceholder":8},[897,4610,4611,4613,4615,4617],{"class":899,"line":1993},[897,4612,2726],{"class":2725},[897,4614,2924],{"class":2729},[897,4616,2927],{"class":2725},[897,4618,2930],{"class":989},[897,4620,4621,4623,4625,4627,4629,4631,4633],{"class":899,"line":2030},[897,4622,2935],{"class":2725},[897,4624,2938],{"class":2729},[897,4626,2927],{"class":2725},[897,4628,2943],{"class":989},[897,4630,2909],{"class":2725},[897,4632,2938],{"class":2729},[897,4634,2751],{"class":2725},[897,4636,4637,4639,4641],{"class":899,"line":2077},[897,4638,2909],{"class":2725},[897,4640,2924],{"class":2729},[897,4642,2751],{"class":2725},[2959,4644,2961],{},{"title":893,"searchDepth":993,"depth":993,"links":4646},[4647,4648,4649,4652,4656,4664],{"id":859,"depth":993,"text":860},{"id":881,"depth":993,"text":882},{"id":959,"depth":993,"text":960,"children":4650},[4651],{"id":1108,"depth":1019,"text":1109},{"id":1194,"depth":993,"text":1195,"children":4653},[4654,4655],{"id":1209,"depth":1019,"text":1210},{"id":1752,"depth":1019,"text":1753},{"id":2178,"depth":993,"text":2179,"children":4657},[4658,4659,4660,4661,4662,4663],{"id":2182,"depth":1019,"text":2183},{"id":2251,"depth":1019,"text":2252},{"id":2267,"depth":1019,"text":2268},{"id":2286,"depth":1019,"text":2287},{"id":2484,"depth":1019,"text":2485},{"id":2498,"depth":1019,"text":2499},{"id":2563,"depth":993,"text":2564,"children":4665},[4666],{"id":2628,"depth":1019,"text":2629},{},{"title":79,"description":2984},1780436290086]