[{"data":1,"prerenderedAt":6256},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fblog\u002Fiam-api-tokens-auth-h3client":64,"navigation":76,"navLinks_footer":790,"\u002Fblog\u002Fiam-api-tokens-auth-h3client_page":803,"\u002Fblog\u002Fiam-api-tokens-auth-h3client":3799},{"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":54,"path":56,"stem":66,"children":67,"page":53},"blog",[68,72],{"title":69,"path":70,"stem":71},"IAM API Tokens with Auth H3 Client: Secure M2M Access in Nuxt and Nitro","\u002Fblog\u002Fiam-api-tokens-auth-h3client","blog\u002Fiam-api-tokens-auth-h3client",{"title":73,"path":74,"stem":75},"Layered Bot Defense: How Shield Base, Bot Detector, and the IAM Canary Cookie Work Together","\u002Fblog\u002Flayered-bot-defense","blog\u002Flayered-bot-defense",[77],{"title":9,"path":78,"stem":79,"children":80,"page":53},"\u002Fdocs","docs",[81,229,347,352,530,597],{"title":20,"path":22,"stem":82,"children":83},"docs\u002Fauth-h3client\u002Findex",[84,85,94,131,157,179,182,203,207],{"title":20,"path":22,"stem":82},{"title":14,"path":86,"stem":87,"children":88},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[89,90],{"title":14,"path":86,"stem":87},{"title":91,"path":92,"stem":93},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":95,"path":96,"stem":97,"children":98},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[99,100,104,108,112,116,120,123,127],{"title":95,"path":96,"stem":97},{"title":101,"path":102,"stem":103},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":105,"path":106,"stem":107},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":109,"path":110,"stem":111},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":113,"path":114,"stem":115},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":117,"path":118,"stem":119},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":121,"stem":122},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":124,"path":125,"stem":126},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":128,"path":129,"stem":130},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":132,"path":133,"stem":134,"children":135},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[136,137,141,145,149,153],{"title":132,"path":133,"stem":134},{"title":138,"path":139,"stem":140},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":142,"path":143,"stem":144},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":146,"path":147,"stem":148},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":150,"path":151,"stem":152},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":154,"path":155,"stem":156},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":158,"path":159,"stem":160,"children":161},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[162,163,167,171,175],{"title":158,"path":159,"stem":160},{"title":164,"path":165,"stem":166},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":168,"path":169,"stem":170},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":172,"path":173,"stem":174},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":176,"path":177,"stem":178},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":180,"stem":181},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":183,"path":184,"stem":185,"children":186,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[187,191,195,199],{"title":188,"path":189,"stem":190},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":192,"path":193,"stem":194},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":196,"path":197,"stem":198},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":200,"path":201,"stem":202},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":204,"path":205,"stem":206},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":208,"path":209,"stem":210,"children":211},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[212,213,217,221,225],{"title":208,"path":209,"stem":210},{"title":214,"path":215,"stem":216},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":218,"path":219,"stem":220},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":222,"path":223,"stem":224},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":226,"path":227,"stem":228},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":230,"path":35,"stem":231,"children":232},"Bot Detector","docs\u002Fbot-detection\u002Findex",[233,234,237,241,245,264,338,341,344],{"title":230,"path":35,"stem":231},{"title":14,"path":235,"stem":236},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":238,"path":239,"stem":240},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":242,"path":243,"stem":244},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":183,"path":246,"stem":247,"children":248,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[249,253,257,260],{"title":250,"path":251,"stem":252},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":254,"path":255,"stem":256},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":128,"path":258,"stem":259},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":261,"path":262,"stem":263},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":265,"path":266,"stem":267,"children":268},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[269,270,274,278,282,286,290,294,298,302,306,310,314,318,322,326,330,334],{"title":265,"path":266,"stem":267},{"title":271,"path":272,"stem":273},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":275,"path":276,"stem":277},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":279,"path":280,"stem":281},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":283,"path":284,"stem":285},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":287,"path":288,"stem":289},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":291,"path":292,"stem":293},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":295,"path":296,"stem":297},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":299,"path":300,"stem":301},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":303,"path":304,"stem":305},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":307,"path":308,"stem":309},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":311,"path":312,"stem":313},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":315,"path":316,"stem":317},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":319,"path":320,"stem":321},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":323,"path":324,"stem":325},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":327,"path":328,"stem":329},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":331,"path":332,"stem":333},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":335,"path":336,"stem":337},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":339,"stem":340},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":208,"path":342,"stem":343},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":204,"path":345,"stem":346},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":348,"path":11,"stem":349,"children":350},"Introduction","docs\u002Fgetting-started\u002Findex",[351],{"title":348,"path":11,"stem":349},{"title":27,"path":29,"stem":353,"children":354},"docs\u002Fiam\u002Findex",[355,356,359,494,497,513,516],{"title":27,"path":29,"stem":353},{"title":14,"path":357,"stem":358},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":95,"path":360,"stem":361,"children":362},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[363,364,368,372,376,380,384,388,392,396,400,404,407,411,415,419,423,426,430,434,437,441,444],{"title":95,"path":360,"stem":361},{"title":365,"path":366,"stem":367},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":369,"path":370,"stem":371},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":373,"path":374,"stem":375},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":377,"path":378,"stem":379},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":381,"path":382,"stem":383},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":385,"path":386,"stem":387},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":389,"path":390,"stem":391},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":393,"path":394,"stem":395},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":397,"path":398,"stem":399},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":401,"path":402,"stem":403},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":132,"path":405,"stem":406},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":408,"path":409,"stem":410},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":412,"path":413,"stem":414},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":416,"path":417,"stem":418},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":420,"path":421,"stem":422},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":128,"path":424,"stem":425},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":427,"path":428,"stem":429},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":431,"path":432,"stem":433},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":124,"path":435,"stem":436},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":438,"path":439,"stem":440},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":142,"path":442,"stem":443},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":445,"path":446,"stem":447,"children":448},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[449,450,454,458,488,491],{"title":445,"path":446,"stem":447},{"title":451,"path":452,"stem":453},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":455,"path":456,"stem":457},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":459,"path":460,"stem":461,"children":462},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[463,464,468,472,476,480,484],{"title":459,"path":460,"stem":461},{"title":465,"path":466,"stem":467},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":469,"path":470,"stem":471},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":473,"path":474,"stem":475},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":477,"path":478,"stem":479},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":481,"path":482,"stem":483},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":485,"path":486,"stem":487},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":427,"path":489,"stem":490},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":492,"stem":493},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":495,"stem":496},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":183,"path":498,"stem":499,"children":500,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[501,505,509],{"title":502,"path":503,"stem":504},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":506,"path":507,"stem":508},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":510,"path":511,"stem":512},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":204,"path":514,"stem":515},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":517,"path":518,"stem":519,"children":520,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[521,524,527],{"title":208,"path":522,"stem":523},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":218,"path":525,"stem":526},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":214,"path":528,"stem":529},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":531,"children":532},"docs\u002Fshield-base\u002Findex",[533,534,537,541,582,586,590,594],{"title":40,"path":42,"stem":531},{"title":14,"path":535,"stem":536},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":538,"path":539,"stem":540},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":242,"path":542,"stem":543,"children":544},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[545,546,550,554,558,562,566,570,574,578],{"title":242,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":551,"path":552,"stem":553},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":555,"path":556,"stem":557},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":559,"path":560,"stem":561},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":563,"path":564,"stem":565},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":567,"path":568,"stem":569},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":571,"path":572,"stem":573},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":575,"path":576,"stem":577},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":579,"path":580,"stem":581},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":583,"path":584,"stem":585},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":587,"path":588,"stem":589},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":591,"path":592,"stem":593},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":208,"path":595,"stem":596},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":226,"path":48,"stem":598,"children":599},"docs\u002Futils\u002Findex",[600,601,618,651,748],{"title":226,"path":48,"stem":598},{"title":602,"path":603,"stem":604,"children":605,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[606,610,614],{"title":607,"path":608,"stem":609},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":611,"path":612,"stem":613},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":615,"path":616,"stem":617},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":619,"path":620,"stem":621,"children":622,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[623,627,631,635,639,643,647],{"title":624,"path":625,"stem":626},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":628,"path":629,"stem":630},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":632,"path":633,"stem":634},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":636,"path":637,"stem":638},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":640,"path":641,"stem":642},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":644,"path":645,"stem":646},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":648,"path":649,"stem":650},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":652,"path":653,"stem":654,"children":655,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[656,660,664,668,672,676,680,684,688,692,696,700,704,708,712,716,720,724,728,732,736,740,744],{"title":657,"path":658,"stem":659},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":661,"path":662,"stem":663},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":665,"path":666,"stem":667},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":669,"path":670,"stem":671},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":673,"path":674,"stem":675},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":677,"path":678,"stem":679},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":681,"path":682,"stem":683},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":685,"path":686,"stem":687},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":689,"path":690,"stem":691},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":693,"path":694,"stem":695},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":697,"path":698,"stem":699},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":701,"path":702,"stem":703},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":705,"path":706,"stem":707},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":709,"path":710,"stem":711},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":713,"path":714,"stem":715},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":717,"path":718,"stem":719},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":721,"path":722,"stem":723},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":725,"path":726,"stem":727},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":729,"path":730,"stem":731},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":733,"path":734,"stem":735},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":737,"path":738,"stem":739},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":741,"path":742,"stem":743},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":745,"path":746,"stem":747},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":749,"path":750,"stem":751,"children":752},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[753,754,758,762,766,770,774,778,782,786],{"title":749,"path":750,"stem":751},{"title":755,"path":756,"stem":757},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":759,"path":760,"stem":761},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":763,"path":764,"stem":765},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":767,"path":768,"stem":769},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":771,"path":772,"stem":773},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":775,"path":776,"stem":777},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":779,"path":780,"stem":781},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":783,"path":784,"stem":785},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":787,"path":788,"stem":789},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":791,"meta":802,"stem":62,"__hash__":63},[792,800,801],{"nested":8,"label":9,"icon":10,"to":11,"children":793},[794,795,796,797,798,799],{"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":804,"title":69,"author":805,"authorGithub":806,"authorGithubUserName":807,"authorImg":808,"body":809,"date":3787,"description":3788,"extension":3789,"featured":53,"icon":3790,"image":3791,"meta":3792,"navigation":8,"path":70,"rawbody":3793,"readingTime":3794,"seo":3795,"stem":71,"tags":3796,"__hash__":3798},"blog\u002Fblog\u002Fiam-api-tokens-auth-h3client.md","Sergio","https:\u002F\u002Fgithub.com\u002FSergo706","Sergo706","https:\u002F\u002Fgithub.com\u002FSergo706.png",{"type":810,"value":811,"toc":3774},"minimark",[812,816,819,834,837,842,845,1009,1037,1058,1060,1064,1071,1082,1089,1110,1113,1115,1119,1129,1148,1151,1154,1207,1213,1445,1447,1451,1464,1467,1470,1651,1654,1670,1672,1676,1689,1695,1709,1711,1715,1725,1728,1820,1823,1826,2096,2099,2579,2592,2594,2600,2616,2622,2867,2870,2902,2905,2907,2911,2923,2929,3311,3323,3329,3623,3634,3637,3716,3718,3722,3728,3739,3742,3744,3748,3751,3757,3763,3766,3768,3770],[813,814,815],"p",{},"Machine-to-machine authentication looks simple until you need to answer real\nquestions. How do you scope access, revoke a leaked key, rotate credentials,\nkeep raw secrets out of the database, and still give users a clean dashboard\nfor managing their integrations?",[813,817,818],{},"The IAM service solves that problem with a dedicated API token subsystem.\nPublic verification and authenticated management are two distinct surfaces with\ndifferent security requirements. The database never stores a raw secret. Only\nthe SHA-256 digest of each key is persisted. Privilege labels and optional IP restrictions\nlive at the row level, and the full model maps cleanly into Auth H3 Client for\nNuxt, Nitro, and plain H3 applications.",[820,821,822],"important",{},[813,823,824,825,829,830,833],{},"This article assumes you already have a running IAM service and a Nuxt or Nitro\napp configured with ",[826,827,828],"code",{},"@riavzon\u002Fauth-h3client",". If your app exposes\nmachine-to-machine routes protected with ",[826,831,832],{},"defineAuthenticatePublicApi",", do not\nplace those routes behind the bundled Nuxt auth middleware. That middleware is\nfor browser session flows, while API-key routes need a path bypass.",[835,836],"hr",{},[838,839,841],"h2",{"id":840},"what-the-subsystem-exposes","What the subsystem exposes",[813,843,844],{},"The API token subsystem has two distinct surfaces. Public verification is the\nmachine-to-machine entry point. Management routes are session-authenticated\nbrowser flows for creating, listing, rotating, revoking, and updating tokens.",[846,847,848,867],"table",{},[849,850,851],"thead",{},[852,853,854,858,861,864],"tr",{},[855,856,857],"th",{},"Surface",[855,859,860],{},"Method",[855,862,863],{},"Route",[855,865,866],{},"Purpose",[868,869,870,892,910,927,943,959,975,992],"tbody",{},[852,871,872,876,881,886],{},[873,874,875],"td",{},"Public verification",[873,877,878],{},[826,879,880],{},"GET",[873,882,883],{},[826,884,885],{},"\u002Fapi\u002Fpublic\u002Fverify",[873,887,888,889],{},"Verify a raw API token from ",[826,890,891],{},"X-API-KEY",[852,893,894,897,902,907],{},[873,895,896],{},"Token creation",[873,898,899],{},[826,900,901],{},"POST",[873,903,904],{},[826,905,906],{},"\u002Fapi\u002Fmanage\u002Fnew-token",[873,908,909],{},"Create a new API token",[852,911,912,915,919,924],{},[873,913,914],{},"Token inventory",[873,916,917],{},[826,918,880],{},[873,920,921],{},[826,922,923],{},"\u002Fapi\u002Fmanage\u002Flist-metadata",[873,925,926],{},"List the current user's valid tokens",[852,928,929,931,935,940],{},[873,930,469],{},[873,932,933],{},[826,934,901],{},[873,936,937],{},[826,938,939],{},"\u002Fapi\u002Fmanage\u002Frevoke",[873,941,942],{},"Invalidate a token",[852,944,945,947,951,956],{},[873,946,481],{},[873,948,949],{},[826,950,901],{},[873,952,953],{},[826,954,955],{},"\u002Fapi\u002Fmanage\u002Fmetadata",[873,957,958],{},"Return details for one token",[852,960,961,963,967,972],{},[873,962,473],{},[873,964,965],{},[826,966,901],{},[873,968,969],{},[826,970,971],{},"\u002Fapi\u002Fmanage\u002Frotate",[873,973,974],{},"Replace a token with a fresh raw key",[852,976,977,980,984,989],{},[873,978,979],{},"IP updates",[873,981,982],{},[826,983,901],{},[873,985,986],{},[826,987,988],{},"\u002Fapi\u002Fmanage\u002Fip-restriction-update",[873,990,991],{},"Change the stored IP allowlist",[852,993,994,997,1001,1006],{},[873,995,996],{},"Privilege updates",[873,998,999],{},[826,1000,901],{},[873,1002,1003],{},[826,1004,1005],{},"\u002Fapi\u002Fmanage\u002Fprivilege-update",[873,1007,1008],{},"Change the stored privilege label",[813,1010,1011,1012,1015,1016,1019,1020,1015,1023,1026,1027,1030,1031,1033,1034,1036],{},"Every token is scoped with one privilege label: ",[826,1013,1014],{},"custom",", ",[826,1017,1018],{},"demo",",\n",[826,1021,1022],{},"restricted",[826,1024,1025],{},"protected",", or ",[826,1028,1029],{},"full",". The verification route checks the exact\nlabel you request, not a hierarchy. If your route requires ",[826,1032,1018],{},", the token\nmust carry ",[826,1035,1018],{},".",[813,1038,1039,1040,1042,1043,1045,1046,1048,1049,1051,1052,1054,1055,1057],{},"The five levels have no built-in ordering. ",[826,1041,1018],{}," does not imply access to\n",[826,1044,1022],{}," routes, and ",[826,1047,1022],{}," does not include ",[826,1050,1025],{},". Each token\ncarries exactly one label and that label is matched literally. ",[826,1053,1014],{}," is a\ncatch-all for use cases that do not map to the four named levels. You decide\nwhat ",[826,1056,1014],{}," means in your own application.",[835,1059],{},[838,1061,1063],{"id":1062},"how-a-token-is-shaped-and-stored","How a token is shaped and stored",[813,1065,1066,1067,1070],{},"The raw token format is simple on the surface. Each key is created as\n",[826,1068,1069],{},"prefix_random_checksum",", where the checksum is the first eight hexadecimal\ncharacters of a SHA-256 digest of the random portion.",[1072,1073,1080],"pre",{"className":1074,"code":1076,"filename":1077,"language":1078,"meta":1079},[1075],"language-text","rpt_d2f460c847aca70d00766922991aa073210fc107de5b251669f9b94ffa9d30e7122549a9b2d94be78a0b801629036a5f0aea8d82a12cd565044c39aa6608a36a_af609e80\n","API token format","text","",[826,1081,1076],{"__ignoreMap":1079},[813,1083,1084,1085,1088],{},"That checksum lets the IAM service reject malformed keys quickly before doing a\ndatabase lookup. The raw key is only returned once, at creation or rotation\ntime. After that, the database stores only the SHA-256 digest in the\n",[826,1086,1087],{},"api_tokens.api_token"," column.",[813,1090,1091,1092,1095,1096,1015,1099,1102,1103,1106,1107,1109],{},"The subsystem also creates a separate ",[826,1093,1094],{},"public_identifier",". This value is not a\ncredential. It exists so management actions can target the correct row without\nrelying on the raw token after it has been issued. In the direct IAM API, most\nmanagement actions require ",[826,1097,1098],{},"tokenId",[826,1100,1101],{},"publicIdentifier",", and ",[826,1104,1105],{},"name"," together.\nAuth H3 Client deliberately hides ",[826,1108,1101],{}," from browser code and\nresolves it on the server.",[813,1111,1112],{},"The stored row carries operational metadata too. The IAM service records the\ntoken owner, privilege label, creation time, expiration time, last-use time,\nusage count, validity flag, and optional IP restriction list. That gives you a\nreal credential inventory rather than an opaque secret store.",[835,1114],{},[838,1116,1118],{"id":1117},"how-verification-works","How verification works",[813,1120,1121,1122,1125,1126,1128],{},"The public verification route is ",[826,1123,1124],{},"GET \u002Fapi\u002Fpublic\u002Fverify",". It reads the raw\ntoken from the ",[826,1127,891],{}," header, reads the required privilege from the query\nstring, and validates the request IP so IP-restricted tokens can be enforced.",[813,1130,1131,1132,1135,1136,1139,1140,1143,1144,1147],{},"Internally, verification follows a strict sequence. The IAM service validates\nthe checksum, hashes the raw key, looks up the hashed row where ",[826,1133,1134],{},"valid = 1",",\nchecks the exact ",[826,1137,1138],{},"privilege_type",", applies expiration rules, enforces any\nstored IP restrictions, and updates ",[826,1141,1142],{},"usage_count"," and ",[826,1145,1146],{},"last_used"," for\nsuccessful requests.",[813,1149,1150],{},"Failed verification attempts are throttled aggressively. Any request with a\nmissing key, a malformed privilege value, an unresolvable IP address, or an\ninvalid token feeds directly into the IAM verification limiters. The limiter\ncounts against the caller's IP, so repeated failures eventually trigger a\npermanent ban at the gateway level. Successful requests can also be\nrate-limited if you enable consumption limiting on the IAM side.",[813,1152,1153],{},"Call the route directly like this:",[1072,1155,1160],{"className":1156,"code":1157,"filename":1158,"language":1159,"meta":1079,"style":1079},"language-bash shiki shiki-themes light-plus light-plus dracula","curl \\\n  -H \"X-API-KEY: rpt_d2f460c847aca70d00766922991aa073210fc107de5b251669f9b94ffa9d30e7122549a9b2d94be78a0b801629036a5f0aea8d82a12cd565044c39aa6608a36a_af609e80\" \\\n  \"http:\u002F\u002Flocalhost:10000\u002Fapi\u002Fpublic\u002Fverify?privilege=demo\"\n","Terminal","bash",[826,1161,1162,1175,1195],{"__ignoreMap":1079},[1163,1164,1167,1171],"span",{"class":1165,"line":1166},"line",1,[1163,1168,1170],{"class":1169},"sHOzp","curl",[1163,1172,1174],{"class":1173},"st6lo"," \\\n",[1163,1176,1178,1182,1186,1190,1193],{"class":1165,"line":1177},2,[1163,1179,1181],{"class":1180},"sjR7W","  -H",[1163,1183,1185],{"class":1184},"sFkSl"," \"",[1163,1187,1189],{"class":1188},"sFB1V","X-API-KEY: rpt_d2f460c847aca70d00766922991aa073210fc107de5b251669f9b94ffa9d30e7122549a9b2d94be78a0b801629036a5f0aea8d82a12cd565044c39aa6608a36a_af609e80",[1163,1191,1192],{"class":1184},"\"",[1163,1194,1174],{"class":1173},[1163,1196,1198,1201,1204],{"class":1165,"line":1197},3,[1163,1199,1200],{"class":1184},"  \"",[1163,1202,1203],{"class":1188},"http:\u002F\u002Flocalhost:10000\u002Fapi\u002Fpublic\u002Fverify?privilege=demo",[1163,1205,1206],{"class":1184},"\"\n",[813,1208,1209,1210,1036],{},"On success, the IAM service returns a compact metadata object. This is the same\nshape Auth H3 Client later exposes on ",[826,1211,1212],{},"event.context.apiVerification",[1072,1214,1218],{"className":1215,"code":1216,"filename":1217,"language":5,"meta":1079,"style":1079},"language-json shiki shiki-themes light-plus light-plus dracula","{\n  \"ok\": true,\n  \"date\": \"2026-05-01T10:00:00.000Z\",\n  \"data\": {\n    \"name\": \"report-worker\",\n    \"tokenId\": 12,\n    \"userId\": 42,\n    \"createdAt\": \"2026-05-01T09:00:00.000Z\",\n    \"expiresAt\": \"2026-06-01T09:00:00.000Z\",\n    \"lastUsed\": \"2026-05-01T10:00:00.000Z\",\n    \"usageCount\": 8,\n    \"providedPrivilege\": \"demo\"\n  }\n}\n","Verification response",[826,1219,1220,1226,1246,1266,1281,1302,1319,1336,1357,1378,1398,1415,1433,1439],{"__ignoreMap":1079},[1163,1221,1222],{"class":1165,"line":1166},[1163,1223,1225],{"class":1224},"sDd4n","{\n",[1163,1227,1228,1231,1235,1237,1241,1244],{"class":1165,"line":1177},[1163,1229,1200],{"class":1230},"saJyd",[1163,1232,1234],{"class":1233},"s_W10","ok",[1163,1236,1192],{"class":1230},[1163,1238,1240],{"class":1239},"saOXh",":",[1163,1242,1243],{"class":1180}," true",[1163,1245,1019],{"class":1224},[1163,1247,1248,1250,1253,1255,1257,1259,1262,1264],{"class":1165,"line":1197},[1163,1249,1200],{"class":1230},[1163,1251,1252],{"class":1233},"date",[1163,1254,1192],{"class":1230},[1163,1256,1240],{"class":1239},[1163,1258,1185],{"class":1184},[1163,1260,1261],{"class":1188},"2026-05-01T10:00:00.000Z",[1163,1263,1192],{"class":1184},[1163,1265,1019],{"class":1224},[1163,1267,1269,1271,1274,1276,1278],{"class":1165,"line":1268},4,[1163,1270,1200],{"class":1230},[1163,1272,1273],{"class":1233},"data",[1163,1275,1192],{"class":1230},[1163,1277,1240],{"class":1239},[1163,1279,1280],{"class":1224}," {\n",[1163,1282,1284,1287,1289,1291,1293,1295,1298,1300],{"class":1165,"line":1283},5,[1163,1285,1286],{"class":1230},"    \"",[1163,1288,1105],{"class":1233},[1163,1290,1192],{"class":1230},[1163,1292,1240],{"class":1239},[1163,1294,1185],{"class":1184},[1163,1296,1297],{"class":1188},"report-worker",[1163,1299,1192],{"class":1184},[1163,1301,1019],{"class":1224},[1163,1303,1305,1307,1309,1311,1313,1317],{"class":1165,"line":1304},6,[1163,1306,1286],{"class":1230},[1163,1308,1098],{"class":1233},[1163,1310,1192],{"class":1230},[1163,1312,1240],{"class":1239},[1163,1314,1316],{"class":1315},"spgvN"," 12",[1163,1318,1019],{"class":1224},[1163,1320,1322,1324,1327,1329,1331,1334],{"class":1165,"line":1321},7,[1163,1323,1286],{"class":1230},[1163,1325,1326],{"class":1233},"userId",[1163,1328,1192],{"class":1230},[1163,1330,1240],{"class":1239},[1163,1332,1333],{"class":1315}," 42",[1163,1335,1019],{"class":1224},[1163,1337,1339,1341,1344,1346,1348,1350,1353,1355],{"class":1165,"line":1338},8,[1163,1340,1286],{"class":1230},[1163,1342,1343],{"class":1233},"createdAt",[1163,1345,1192],{"class":1230},[1163,1347,1240],{"class":1239},[1163,1349,1185],{"class":1184},[1163,1351,1352],{"class":1188},"2026-05-01T09:00:00.000Z",[1163,1354,1192],{"class":1184},[1163,1356,1019],{"class":1224},[1163,1358,1360,1362,1365,1367,1369,1371,1374,1376],{"class":1165,"line":1359},9,[1163,1361,1286],{"class":1230},[1163,1363,1364],{"class":1233},"expiresAt",[1163,1366,1192],{"class":1230},[1163,1368,1240],{"class":1239},[1163,1370,1185],{"class":1184},[1163,1372,1373],{"class":1188},"2026-06-01T09:00:00.000Z",[1163,1375,1192],{"class":1184},[1163,1377,1019],{"class":1224},[1163,1379,1381,1383,1386,1388,1390,1392,1394,1396],{"class":1165,"line":1380},10,[1163,1382,1286],{"class":1230},[1163,1384,1385],{"class":1233},"lastUsed",[1163,1387,1192],{"class":1230},[1163,1389,1240],{"class":1239},[1163,1391,1185],{"class":1184},[1163,1393,1261],{"class":1188},[1163,1395,1192],{"class":1184},[1163,1397,1019],{"class":1224},[1163,1399,1401,1403,1406,1408,1410,1413],{"class":1165,"line":1400},11,[1163,1402,1286],{"class":1230},[1163,1404,1405],{"class":1233},"usageCount",[1163,1407,1192],{"class":1230},[1163,1409,1240],{"class":1239},[1163,1411,1412],{"class":1315}," 8",[1163,1414,1019],{"class":1224},[1163,1416,1418,1420,1423,1425,1427,1429,1431],{"class":1165,"line":1417},12,[1163,1419,1286],{"class":1230},[1163,1421,1422],{"class":1233},"providedPrivilege",[1163,1424,1192],{"class":1230},[1163,1426,1240],{"class":1239},[1163,1428,1185],{"class":1184},[1163,1430,1018],{"class":1188},[1163,1432,1206],{"class":1184},[1163,1434,1436],{"class":1165,"line":1435},13,[1163,1437,1438],{"class":1224},"  }\n",[1163,1440,1442],{"class":1165,"line":1441},14,[1163,1443,1444],{"class":1224},"}\n",[835,1446],{},[838,1448,1450],{"id":1449},"how-management-works","How management works",[813,1452,1453,1454,1015,1457,1460,1461,1463],{},"Management routes are intentionally more demanding than public verification.\nThey sit behind ",[826,1455,1456],{},"requireAccessToken",[826,1458,1459],{},"requireRefreshToken",", fingerprint\ncollection, active MFA checks, JWT protection, and for ",[826,1462,901],{}," routes a JSON\ncontent-type check plus a 1 KB body limit.",[813,1465,1466],{},"That split is the right model for a real product. Verification is for services\ncalling your APIs. Management is for logged-in users who are creating and\nchanging credentials inside a dashboard.",[813,1468,1469],{},"Here is the direct IAM management map:",[846,1471,1472,1487],{},[849,1473,1474],{},[852,1475,1476,1479,1481,1484],{},[855,1477,1478],{},"Action",[855,1480,860],{},[855,1482,1483],{},"Input",[855,1485,1486],{},"Result",[868,1488,1489,1519,1536,1558,1580,1602,1626],{},[852,1490,1491,1496,1500,1516],{},[873,1492,1493],{},[826,1494,1495],{},"new-token",[873,1497,1498],{},[826,1499,901],{},[873,1501,1502,1015,1504,1015,1507,1015,1510,1015,1513],{},[826,1503,1105],{},[826,1505,1506],{},"prefix",[826,1508,1509],{},"expires?",[826,1511,1512],{},"ipv4?",[826,1514,1515],{},"privilege",[873,1517,1518],{},"New raw token and public identifier",[852,1520,1521,1526,1530,1533],{},[873,1522,1523],{},[826,1524,1525],{},"list-metadata",[873,1527,1528],{},[826,1529,880],{},[873,1531,1532],{},"None",[873,1534,1535],{},"All valid tokens for the authenticated user",[852,1537,1538,1543,1547,1555],{},[873,1539,1540],{},[826,1541,1542],{},"revoke",[873,1544,1545],{},[826,1546,901],{},[873,1548,1549,1015,1551,1015,1553],{},[826,1550,1098],{},[826,1552,1101],{},[826,1554,1105],{},[873,1556,1557],{},"Invalidates the token",[852,1559,1560,1565,1569,1577],{},[873,1561,1562],{},[826,1563,1564],{},"metadata",[873,1566,1567],{},[826,1568,901],{},[873,1570,1571,1015,1573,1015,1575],{},[826,1572,1098],{},[826,1574,1101],{},[826,1576,1105],{},[873,1578,1579],{},"Returns one token plus total counts",[852,1581,1582,1587,1591,1599],{},[873,1583,1584],{},[826,1585,1586],{},"rotate",[873,1588,1589],{},[826,1590,901],{},[873,1592,1593,1015,1595,1015,1597],{},[826,1594,1098],{},[826,1596,1101],{},[826,1598,1105],{},[873,1600,1601],{},"Returns a replacement raw token",[852,1603,1604,1609,1613,1623],{},[873,1605,1606],{},[826,1607,1608],{},"ip-restriction-update",[873,1610,1611],{},[826,1612,901],{},[873,1614,1615,1015,1617,1015,1619,1015,1621],{},[826,1616,1098],{},[826,1618,1101],{},[826,1620,1105],{},[826,1622,1512],{},[873,1624,1625],{},"Replaces the stored IP allowlist",[852,1627,1628,1633,1637,1648],{},[873,1629,1630],{},[826,1631,1632],{},"privilege-update",[873,1634,1635],{},[826,1636,901],{},[873,1638,1639,1015,1641,1015,1643,1015,1645],{},[826,1640,1098],{},[826,1642,1101],{},[826,1644,1105],{},[826,1646,1647],{},"newPrivilege",[873,1649,1650],{},"Replaces the stored privilege label",[813,1652,1653],{},"Rotation deserves special attention. The IAM service revokes the current token\nand creates a fresh raw token in one management flow. That means the caller can\nroll credentials forward without deleting the integration entirely. Creation and\nrotation are the only two moments when the raw secret leaves the server.",[1655,1656,1657],"note",{},[813,1658,1659,1660,1143,1663,1666,1667,1669],{},"The direct IAM create route returns both ",[826,1661,1662],{},"rawApiKey",[826,1664,1665],{},"rawPublicId",". Auth H3\nClient strips ",[826,1668,1665],{}," before exposing the creation result to your Nuxt\nhandler. That keeps management identity in the server layer instead of the\nbrowser.",[835,1671],{},[838,1673,1675],{"id":1674},"why-auth-h3-client-fits-this-subsystem-well","Why Auth H3 Client fits this subsystem well",[813,1677,1678,1679,1681,1682,1685,1686,1036],{},"Auth H3 Client does more than proxy requests. It gives the IAM token model the\nright shape for H3 and Nuxt applications. Public machine-to-machine routes use\n",[826,1680,832],{},". Authenticated dashboard routes use\n",[826,1683,1684],{},"defineApiManagementHandler",". Token inventory reads can use\n",[826,1687,1688],{},"getApiListsController",[813,1690,1691,1692,1694],{},"That split matters because the browser and service callers have different\nsecurity needs. Browser management routes need session auth, CSRF protection,\nand token identity mapping. Machine-to-machine verification needs a single\n",[826,1693,891],{}," header and a clean path to the IAM verification endpoint.",[813,1696,1697,1698,1700,1701,1143,1703,1705,1706,1708],{},"The wrappers also hide low-level IAM details from your application code. Your\nNuxt route only deals with ",[826,1699,1098],{}," for existing-token actions, while the\nserver wrapper resolves ",[826,1702,1101],{},[826,1704,1105],{}," through IAM\n",[826,1707,923],{}," before making the final management request.",[835,1710],{},[838,1712,1714],{"id":1713},"integrating-with-the-nuxt-module","Integrating with the Nuxt module",[813,1716,1717,1718,1721,1722,1724],{},"If your application only uses browser auth flows, the Nuxt module can run with\n",[826,1719,1720],{},"enableMiddleware: true"," and register the built-in middleware for every\nrequest. Mixed apps need a different setup. If you protect custom APIs with\n",[826,1723,832],{},", disable the bundled middleware and add your own\npath-aware middleware so browser auth routes still get bot detection and CSRF,\nwhile machine-to-machine routes bypass that chain.",[813,1726,1727],{},"Start by registering the module and disabling the bundled middleware.",[1072,1729,1734],{"className":1730,"code":1731,"filename":1732,"language":1733,"meta":1079,"style":1079},"language-ts shiki shiki-themes light-plus light-plus dracula","export default defineNuxtConfig({\n  modules: ['auth-h3client\u002Fmodule'],\n  authH3Client: {\n    enableMiddleware: false,\n    authStatusUrl: '\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus'\n  }\n})\n","nuxt.config.ts","ts",[826,1735,1736,1751,1774,1783,1795,1811,1815],{"__ignoreMap":1079},[1163,1737,1738,1742,1745,1748],{"class":1165,"line":1166},[1163,1739,1741],{"class":1740},"sZ328","export",[1163,1743,1744],{"class":1740}," default",[1163,1746,1747],{"class":1169}," defineNuxtConfig",[1163,1749,1750],{"class":1224},"({\n",[1163,1752,1753,1757,1760,1763,1766,1769,1771],{"class":1165,"line":1177},[1163,1754,1756],{"class":1755},"sjsA6","  modules",[1163,1758,1240],{"class":1759},"s34zl",[1163,1761,1762],{"class":1224}," [",[1163,1764,1765],{"class":1184},"'",[1163,1767,1768],{"class":1188},"auth-h3client\u002Fmodule",[1163,1770,1765],{"class":1184},[1163,1772,1773],{"class":1224},"],\n",[1163,1775,1776,1779,1781],{"class":1165,"line":1197},[1163,1777,1778],{"class":1755},"  authH3Client",[1163,1780,1240],{"class":1759},[1163,1782,1280],{"class":1224},[1163,1784,1785,1788,1790,1793],{"class":1165,"line":1268},[1163,1786,1787],{"class":1755},"    enableMiddleware",[1163,1789,1240],{"class":1759},[1163,1791,1792],{"class":1180}," false",[1163,1794,1019],{"class":1224},[1163,1796,1797,1800,1802,1805,1808],{"class":1165,"line":1283},[1163,1798,1799],{"class":1755},"    authStatusUrl",[1163,1801,1240],{"class":1759},[1163,1803,1804],{"class":1184}," '",[1163,1806,1807],{"class":1188},"\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus",[1163,1809,1810],{"class":1184},"'\n",[1163,1812,1813],{"class":1165,"line":1304},[1163,1814,1438],{"class":1224},[1163,1816,1817],{"class":1165,"line":1321},[1163,1818,1819],{"class":1224},"})\n",[813,1821,1822],{},"The module still gives you server auto-imports and client composables in this\nmode. It does not auto-register the bundled middleware, but it still registers\nthe auth status route and, when configured, the optional API token list route.",[813,1824,1825],{},"Configure the gateway in a Nitro plugin:",[1072,1827,1830],{"className":1730,"code":1828,"filename":1829,"language":1733,"meta":1079,"style":1079},"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    enableFireWallBans: false,\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",[826,1831,1832,1856,1876,1896,1916,1921,1946,1959,1968,1984,1995,2004,2026,2035,2062,2073,2079,2085,2091],{"__ignoreMap":1079},[1163,1833,1834,1837,1840,1843,1846,1849,1851,1854],{"class":1165,"line":1166},[1163,1835,1836],{"class":1740},"import",[1163,1838,1839],{"class":1224}," { ",[1163,1841,1842],{"class":1755},"defineNitroPlugin",[1163,1844,1845],{"class":1224}," } ",[1163,1847,1848],{"class":1740},"from",[1163,1850,1804],{"class":1184},[1163,1852,1853],{"class":1188},"nitropack\u002Fruntime",[1163,1855,1810],{"class":1184},[1163,1857,1858,1860,1862,1865,1867,1869,1871,1874],{"class":1165,"line":1177},[1163,1859,1836],{"class":1740},[1163,1861,1839],{"class":1224},[1163,1863,1864],{"class":1755},"useStorage",[1163,1866,1845],{"class":1224},[1163,1868,1848],{"class":1740},[1163,1870,1804],{"class":1184},[1163,1872,1873],{"class":1188},"nitropack\u002Fruntime\u002Fstorage",[1163,1875,1810],{"class":1184},[1163,1877,1878,1880,1882,1885,1887,1889,1891,1894],{"class":1165,"line":1197},[1163,1879,1836],{"class":1740},[1163,1881,1839],{"class":1224},[1163,1883,1884],{"class":1755},"configDefaults",[1163,1886,1845],{"class":1224},[1163,1888,1848],{"class":1740},[1163,1890,1804],{"class":1184},[1163,1892,1893],{"class":1188},"auth-h3client\u002Fserver\u002Ftemplates",[1163,1895,1810],{"class":1184},[1163,1897,1898,1900,1902,1905,1907,1909,1911,1914],{"class":1165,"line":1268},[1163,1899,1836],{"class":1740},[1163,1901,1839],{"class":1224},[1163,1903,1904],{"class":1755},"defineAuthConfiguration",[1163,1906,1845],{"class":1224},[1163,1908,1848],{"class":1740},[1163,1910,1804],{"class":1184},[1163,1912,1913],{"class":1188},"auth-h3client\u002Fv1",[1163,1915,1810],{"class":1184},[1163,1917,1918],{"class":1165,"line":1283},[1163,1919,1920],{"emptyLinePlaceholder":8},"\n",[1163,1922,1923,1925,1927,1930,1933,1937,1940,1944],{"class":1165,"line":1304},[1163,1924,1741],{"class":1740},[1163,1926,1744],{"class":1740},[1163,1928,1929],{"class":1169}," defineNitroPlugin",[1163,1931,1932],{"class":1224},"((",[1163,1934,1936],{"class":1935},"sygFZ","nitroApp",[1163,1938,1939],{"class":1224},") ",[1163,1941,1943],{"class":1942},"sl46w","=>",[1163,1945,1280],{"class":1224},[1163,1947,1948,1951,1954,1956],{"class":1165,"line":1321},[1163,1949,1950],{"class":1169},"  defineAuthConfiguration",[1163,1952,1953],{"class":1224},"(",[1163,1955,1936],{"class":1755},[1163,1957,1958],{"class":1224},", {\n",[1163,1960,1961,1964,1966],{"class":1165,"line":1338},[1163,1962,1963],{"class":1239},"    ...",[1163,1965,1884],{"class":1755},[1163,1967,1019],{"class":1224},[1163,1969,1970,1973,1975,1977,1980,1982],{"class":1165,"line":1359},[1163,1971,1972],{"class":1755},"    onSuccessRedirect",[1163,1974,1240],{"class":1759},[1163,1976,1804],{"class":1184},[1163,1978,1979],{"class":1188},"\u002Fdashboard",[1163,1981,1765],{"class":1184},[1163,1983,1019],{"class":1224},[1163,1985,1986,1989,1991,1993],{"class":1165,"line":1380},[1163,1987,1988],{"class":1755},"    enableFireWallBans",[1163,1990,1240],{"class":1759},[1163,1992,1792],{"class":1180},[1163,1994,1019],{"class":1224},[1163,1996,1997,2000,2002],{"class":1165,"line":1400},[1163,1998,1999],{"class":1755},"    uStorage",[1163,2001,1240],{"class":1759},[1163,2003,1280],{"class":1224},[1163,2005,2006,2009,2011,2014,2016,2018,2021,2023],{"class":1165,"line":1417},[1163,2007,2008],{"class":1755},"      storage",[1163,2010,1240],{"class":1759},[1163,2012,2013],{"class":1169}," useStorage",[1163,2015,1953],{"class":1224},[1163,2017,1765],{"class":1184},[1163,2019,2020],{"class":1188},"cache",[1163,2022,1765],{"class":1184},[1163,2024,2025],{"class":1224},"),\n",[1163,2027,2028,2031,2033],{"class":1165,"line":1435},[1163,2029,2030],{"class":1755},"      cacheOptions",[1163,2032,1240],{"class":1759},[1163,2034,1280],{"class":1224},[1163,2036,2037,2040,2042,2045,2048,2050,2052,2055,2057,2060],{"class":1165,"line":1441},[1163,2038,2039],{"class":1755},"        successTtl",[1163,2041,1240],{"class":1759},[1163,2043,2044],{"class":1315}," 60",[1163,2046,2047],{"class":1239}," *",[1163,2049,2044],{"class":1315},[1163,2051,2047],{"class":1239},[1163,2053,2054],{"class":1315}," 24",[1163,2056,2047],{"class":1239},[1163,2058,2059],{"class":1315}," 30",[1163,2061,1019],{"class":1224},[1163,2063,2065,2068,2070],{"class":1165,"line":2064},15,[1163,2066,2067],{"class":1755},"        rateLimitTtl",[1163,2069,1240],{"class":1759},[1163,2071,2072],{"class":1315}," 10\n",[1163,2074,2076],{"class":1165,"line":2075},16,[1163,2077,2078],{"class":1224},"      }\n",[1163,2080,2082],{"class":1165,"line":2081},17,[1163,2083,2084],{"class":1224},"    }\n",[1163,2086,2088],{"class":1165,"line":2087},18,[1163,2089,2090],{"class":1224},"  })\n",[1163,2092,2094],{"class":1165,"line":2093},19,[1163,2095,1819],{"class":1224},[813,2097,2098],{},"Next, register a browser middleware that mirrors the packaged middleware but\nskips your machine-to-machine prefix.",[1072,2100,2103],{"className":1730,"code":2101,"filename":2102,"language":1733,"meta":1079,"style":1079},"import {\n  defineEventHandler,\n  getHeader,\n  getRequestURL,\n  isMethod,\n  sendNoContent,\n} from 'auth-h3client\u002Fv1'\nimport {\n  botDetectorMiddleware,\n  generateCsrfCookie,\n  isIPValid,\n} from 'auth-h3client\u002Fv1'\n\nexport default defineEventHandler(async (event) => {\n  const { pathname } = getRequestURL(event)\n\n  if (\n    isMethod(event, 'HEAD') ||\n    pathname === '\u002Fapi\u002Fhealth' ||\n    pathname.startsWith('\u002Fapi\u002F_mdc') ||\n    pathname.startsWith('\u002F_nuxt') ||\n    pathname.startsWith('\u002Fapi\u002Fpublic\u002F')\n  ) {\n    if (isMethod(event, 'HEAD') || pathname === '\u002Fapi\u002Fhealth') {\n      sendNoContent(event)\n    }\n\n    return\n  }\n\n  const forwardedFor = getHeader(event, 'x-forwarded-for')\n  if (forwardedFor === '127.0.0.1' || forwardedFor === '::1') {\n    return\n  }\n\n  isIPValid(event)\n  await botDetectorMiddleware(event)\n  generateCsrfCookie(event)\n})\n","server\u002Fmiddleware\u002Fauth-browser.ts",[826,2104,2105,2111,2118,2125,2132,2139,2146,2159,2165,2172,2179,2186,2198,2202,2228,2254,2258,2266,2289,2307,2330,2352,2372,2378,2420,2432,2437,2442,2448,2453,2458,2487,2522,2527,2532,2537,2548,2563,2574],{"__ignoreMap":1079},[1163,2106,2107,2109],{"class":1165,"line":1166},[1163,2108,1836],{"class":1740},[1163,2110,1280],{"class":1224},[1163,2112,2113,2116],{"class":1165,"line":1177},[1163,2114,2115],{"class":1755},"  defineEventHandler",[1163,2117,1019],{"class":1224},[1163,2119,2120,2123],{"class":1165,"line":1197},[1163,2121,2122],{"class":1755},"  getHeader",[1163,2124,1019],{"class":1224},[1163,2126,2127,2130],{"class":1165,"line":1268},[1163,2128,2129],{"class":1755},"  getRequestURL",[1163,2131,1019],{"class":1224},[1163,2133,2134,2137],{"class":1165,"line":1283},[1163,2135,2136],{"class":1755},"  isMethod",[1163,2138,1019],{"class":1224},[1163,2140,2141,2144],{"class":1165,"line":1304},[1163,2142,2143],{"class":1755},"  sendNoContent",[1163,2145,1019],{"class":1224},[1163,2147,2148,2151,2153,2155,2157],{"class":1165,"line":1321},[1163,2149,2150],{"class":1224},"} ",[1163,2152,1848],{"class":1740},[1163,2154,1804],{"class":1184},[1163,2156,1913],{"class":1188},[1163,2158,1810],{"class":1184},[1163,2160,2161,2163],{"class":1165,"line":1338},[1163,2162,1836],{"class":1740},[1163,2164,1280],{"class":1224},[1163,2166,2167,2170],{"class":1165,"line":1359},[1163,2168,2169],{"class":1755},"  botDetectorMiddleware",[1163,2171,1019],{"class":1224},[1163,2173,2174,2177],{"class":1165,"line":1380},[1163,2175,2176],{"class":1755},"  generateCsrfCookie",[1163,2178,1019],{"class":1224},[1163,2180,2181,2184],{"class":1165,"line":1400},[1163,2182,2183],{"class":1755},"  isIPValid",[1163,2185,1019],{"class":1224},[1163,2187,2188,2190,2192,2194,2196],{"class":1165,"line":1417},[1163,2189,2150],{"class":1224},[1163,2191,1848],{"class":1740},[1163,2193,1804],{"class":1184},[1163,2195,1913],{"class":1188},[1163,2197,1810],{"class":1184},[1163,2199,2200],{"class":1165,"line":1435},[1163,2201,1920],{"emptyLinePlaceholder":8},[1163,2203,2204,2206,2208,2211,2213,2216,2219,2222,2224,2226],{"class":1165,"line":1441},[1163,2205,1741],{"class":1740},[1163,2207,1744],{"class":1740},[1163,2209,2210],{"class":1169}," defineEventHandler",[1163,2212,1953],{"class":1224},[1163,2214,2215],{"class":1942},"async",[1163,2217,2218],{"class":1224}," (",[1163,2220,2221],{"class":1935},"event",[1163,2223,1939],{"class":1224},[1163,2225,1943],{"class":1942},[1163,2227,1280],{"class":1224},[1163,2229,2230,2233,2235,2239,2241,2244,2247,2249,2251],{"class":1165,"line":2064},[1163,2231,2232],{"class":1942},"  const",[1163,2234,1839],{"class":1224},[1163,2236,2238],{"class":2237},"s3JHE","pathname",[1163,2240,1845],{"class":1224},[1163,2242,2243],{"class":1239},"=",[1163,2245,2246],{"class":1169}," getRequestURL",[1163,2248,1953],{"class":1224},[1163,2250,2221],{"class":1755},[1163,2252,2253],{"class":1224},")\n",[1163,2255,2256],{"class":1165,"line":2075},[1163,2257,1920],{"emptyLinePlaceholder":8},[1163,2259,2260,2263],{"class":1165,"line":2081},[1163,2261,2262],{"class":1740},"  if",[1163,2264,2265],{"class":1224}," (\n",[1163,2267,2268,2271,2273,2275,2277,2279,2282,2284,2286],{"class":1165,"line":2087},[1163,2269,2270],{"class":1169},"    isMethod",[1163,2272,1953],{"class":1224},[1163,2274,2221],{"class":1755},[1163,2276,1015],{"class":1224},[1163,2278,1765],{"class":1184},[1163,2280,2281],{"class":1188},"HEAD",[1163,2283,1765],{"class":1184},[1163,2285,1939],{"class":1224},[1163,2287,2288],{"class":1239},"||\n",[1163,2290,2291,2294,2297,2299,2302,2304],{"class":1165,"line":2093},[1163,2292,2293],{"class":1755},"    pathname",[1163,2295,2296],{"class":1239}," ===",[1163,2298,1804],{"class":1184},[1163,2300,2301],{"class":1188},"\u002Fapi\u002Fhealth",[1163,2303,1765],{"class":1184},[1163,2305,2306],{"class":1239}," ||\n",[1163,2308,2310,2312,2314,2317,2319,2321,2324,2326,2328],{"class":1165,"line":2309},20,[1163,2311,2293],{"class":1755},[1163,2313,1036],{"class":1224},[1163,2315,2316],{"class":1169},"startsWith",[1163,2318,1953],{"class":1224},[1163,2320,1765],{"class":1184},[1163,2322,2323],{"class":1188},"\u002Fapi\u002F_mdc",[1163,2325,1765],{"class":1184},[1163,2327,1939],{"class":1224},[1163,2329,2288],{"class":1239},[1163,2331,2333,2335,2337,2339,2341,2343,2346,2348,2350],{"class":1165,"line":2332},21,[1163,2334,2293],{"class":1755},[1163,2336,1036],{"class":1224},[1163,2338,2316],{"class":1169},[1163,2340,1953],{"class":1224},[1163,2342,1765],{"class":1184},[1163,2344,2345],{"class":1188},"\u002F_nuxt",[1163,2347,1765],{"class":1184},[1163,2349,1939],{"class":1224},[1163,2351,2288],{"class":1239},[1163,2353,2355,2357,2359,2361,2363,2365,2368,2370],{"class":1165,"line":2354},22,[1163,2356,2293],{"class":1755},[1163,2358,1036],{"class":1224},[1163,2360,2316],{"class":1169},[1163,2362,1953],{"class":1224},[1163,2364,1765],{"class":1184},[1163,2366,2367],{"class":1188},"\u002Fapi\u002Fpublic\u002F",[1163,2369,1765],{"class":1184},[1163,2371,2253],{"class":1224},[1163,2373,2375],{"class":1165,"line":2374},23,[1163,2376,2377],{"class":1224},"  ) {\n",[1163,2379,2381,2384,2386,2389,2391,2393,2395,2397,2399,2401,2403,2406,2409,2411,2413,2415,2417],{"class":1165,"line":2380},24,[1163,2382,2383],{"class":1740},"    if",[1163,2385,2218],{"class":1224},[1163,2387,2388],{"class":1169},"isMethod",[1163,2390,1953],{"class":1224},[1163,2392,2221],{"class":1755},[1163,2394,1015],{"class":1224},[1163,2396,1765],{"class":1184},[1163,2398,2281],{"class":1188},[1163,2400,1765],{"class":1184},[1163,2402,1939],{"class":1224},[1163,2404,2405],{"class":1239},"||",[1163,2407,2408],{"class":1755}," pathname",[1163,2410,2296],{"class":1239},[1163,2412,1804],{"class":1184},[1163,2414,2301],{"class":1188},[1163,2416,1765],{"class":1184},[1163,2418,2419],{"class":1224},") {\n",[1163,2421,2423,2426,2428,2430],{"class":1165,"line":2422},25,[1163,2424,2425],{"class":1169},"      sendNoContent",[1163,2427,1953],{"class":1224},[1163,2429,2221],{"class":1755},[1163,2431,2253],{"class":1224},[1163,2433,2435],{"class":1165,"line":2434},26,[1163,2436,2084],{"class":1224},[1163,2438,2440],{"class":1165,"line":2439},27,[1163,2441,1920],{"emptyLinePlaceholder":8},[1163,2443,2445],{"class":1165,"line":2444},28,[1163,2446,2447],{"class":1740},"    return\n",[1163,2449,2451],{"class":1165,"line":2450},29,[1163,2452,1438],{"class":1224},[1163,2454,2456],{"class":1165,"line":2455},30,[1163,2457,1920],{"emptyLinePlaceholder":8},[1163,2459,2461,2463,2466,2469,2472,2474,2476,2478,2480,2483,2485],{"class":1165,"line":2460},31,[1163,2462,2232],{"class":1942},[1163,2464,2465],{"class":2237}," forwardedFor",[1163,2467,2468],{"class":1239}," =",[1163,2470,2471],{"class":1169}," getHeader",[1163,2473,1953],{"class":1224},[1163,2475,2221],{"class":1755},[1163,2477,1015],{"class":1224},[1163,2479,1765],{"class":1184},[1163,2481,2482],{"class":1188},"x-forwarded-for",[1163,2484,1765],{"class":1184},[1163,2486,2253],{"class":1224},[1163,2488,2490,2492,2494,2497,2499,2501,2504,2506,2509,2511,2513,2515,2518,2520],{"class":1165,"line":2489},32,[1163,2491,2262],{"class":1740},[1163,2493,2218],{"class":1224},[1163,2495,2496],{"class":1755},"forwardedFor",[1163,2498,2296],{"class":1239},[1163,2500,1804],{"class":1184},[1163,2502,2503],{"class":1188},"127.0.0.1",[1163,2505,1765],{"class":1184},[1163,2507,2508],{"class":1239}," ||",[1163,2510,2465],{"class":1755},[1163,2512,2296],{"class":1239},[1163,2514,1804],{"class":1184},[1163,2516,2517],{"class":1188},"::1",[1163,2519,1765],{"class":1184},[1163,2521,2419],{"class":1224},[1163,2523,2525],{"class":1165,"line":2524},33,[1163,2526,2447],{"class":1740},[1163,2528,2530],{"class":1165,"line":2529},34,[1163,2531,1438],{"class":1224},[1163,2533,2535],{"class":1165,"line":2534},35,[1163,2536,1920],{"emptyLinePlaceholder":8},[1163,2538,2540,2542,2544,2546],{"class":1165,"line":2539},36,[1163,2541,2183],{"class":1169},[1163,2543,1953],{"class":1224},[1163,2545,2221],{"class":1755},[1163,2547,2253],{"class":1224},[1163,2549,2551,2554,2557,2559,2561],{"class":1165,"line":2550},37,[1163,2552,2553],{"class":1740},"  await",[1163,2555,2556],{"class":1169}," botDetectorMiddleware",[1163,2558,1953],{"class":1224},[1163,2560,2221],{"class":1755},[1163,2562,2253],{"class":1224},[1163,2564,2566,2568,2570,2572],{"class":1165,"line":2565},38,[1163,2567,2176],{"class":1169},[1163,2569,1953],{"class":1224},[1163,2571,2221],{"class":1755},[1163,2573,2253],{"class":1224},[1163,2575,2577],{"class":1165,"line":2576},39,[1163,2578,1819],{"class":1224},[2580,2581,2582],"tip",{},[813,2583,2584,2585,2587,2588,2591],{},"If your app does not expose machine-to-machine API-key routes, keep\n",[826,2586,1720],{}," and optionally use ",[826,2589,2590],{},"registerApiRoute"," on the module.\nThat is the simplest browser-only setup.",[835,2593],{},[838,2595,2597,2598],{"id":2596},"protecting-a-custom-api-with-x-api-key","Protecting a custom API with ",[826,2599,891],{},[813,2601,2602,2603,2605,2606,2608,2609,2612,2613,2615],{},"Once the gateway is configured, protecting a custom API route is small and\npredictable. ",[826,2604,832],{}," reads the incoming ",[826,2607,891],{},",\ncalls IAM ",[826,2610,2611],{},"\u002Fapi\u002Fpublic\u002Fverify?privilege=...",", and places the verification\nresult on ",[826,2614,1212],{}," before your handler runs.",[813,2617,2618,2619,2621],{},"Here is a custom reports endpoint that grants access to tokens with the exact\n",[826,2620,1018],{}," privilege label:",[1072,2623,2626],{"className":1730,"code":2624,"filename":2625,"language":1733,"meta":1079,"style":1079},"import { defineAuthenticatePublicApi } from 'auth-h3client\u002Fv1'\n\nexport default defineAuthenticatePublicApi(async (event) => {\n  const token = event.context.apiVerification\n\n  return {\n    ok: true,\n    consumer: token.name,\n    tokenId: token.tokenId,\n    userId: token.userId,\n    privilege: token.providedPrivilege,\n    report: {\n      generatedAt: new Date().toISOString(),\n      items: ['orders', 'revenue', 'retention']\n    }\n  }\n}, 'demo')\n","server\u002Fapi\u002Fpublic\u002Freports.get.ts",[826,2627,2628,2646,2650,2673,2695,2699,2706,2717,2732,2747,2762,2777,2786,2809,2846,2850,2854],{"__ignoreMap":1079},[1163,2629,2630,2632,2634,2636,2638,2640,2642,2644],{"class":1165,"line":1166},[1163,2631,1836],{"class":1740},[1163,2633,1839],{"class":1224},[1163,2635,832],{"class":1755},[1163,2637,1845],{"class":1224},[1163,2639,1848],{"class":1740},[1163,2641,1804],{"class":1184},[1163,2643,1913],{"class":1188},[1163,2645,1810],{"class":1184},[1163,2647,2648],{"class":1165,"line":1177},[1163,2649,1920],{"emptyLinePlaceholder":8},[1163,2651,2652,2654,2656,2659,2661,2663,2665,2667,2669,2671],{"class":1165,"line":1197},[1163,2653,1741],{"class":1740},[1163,2655,1744],{"class":1740},[1163,2657,2658],{"class":1169}," defineAuthenticatePublicApi",[1163,2660,1953],{"class":1224},[1163,2662,2215],{"class":1942},[1163,2664,2218],{"class":1224},[1163,2666,2221],{"class":1935},[1163,2668,1939],{"class":1224},[1163,2670,1943],{"class":1942},[1163,2672,1280],{"class":1224},[1163,2674,2675,2677,2680,2682,2685,2687,2690,2692],{"class":1165,"line":1268},[1163,2676,2232],{"class":1942},[1163,2678,2679],{"class":2237}," token",[1163,2681,2468],{"class":1239},[1163,2683,2684],{"class":1755}," event",[1163,2686,1036],{"class":1224},[1163,2688,2689],{"class":1755},"context",[1163,2691,1036],{"class":1224},[1163,2693,2694],{"class":1755},"apiVerification\n",[1163,2696,2697],{"class":1165,"line":1283},[1163,2698,1920],{"emptyLinePlaceholder":8},[1163,2700,2701,2704],{"class":1165,"line":1304},[1163,2702,2703],{"class":1740},"  return",[1163,2705,1280],{"class":1224},[1163,2707,2708,2711,2713,2715],{"class":1165,"line":1321},[1163,2709,2710],{"class":1755},"    ok",[1163,2712,1240],{"class":1759},[1163,2714,1243],{"class":1180},[1163,2716,1019],{"class":1224},[1163,2718,2719,2722,2724,2726,2728,2730],{"class":1165,"line":1338},[1163,2720,2721],{"class":1755},"    consumer",[1163,2723,1240],{"class":1759},[1163,2725,2679],{"class":1755},[1163,2727,1036],{"class":1224},[1163,2729,1105],{"class":1755},[1163,2731,1019],{"class":1224},[1163,2733,2734,2737,2739,2741,2743,2745],{"class":1165,"line":1359},[1163,2735,2736],{"class":1755},"    tokenId",[1163,2738,1240],{"class":1759},[1163,2740,2679],{"class":1755},[1163,2742,1036],{"class":1224},[1163,2744,1098],{"class":1755},[1163,2746,1019],{"class":1224},[1163,2748,2749,2752,2754,2756,2758,2760],{"class":1165,"line":1380},[1163,2750,2751],{"class":1755},"    userId",[1163,2753,1240],{"class":1759},[1163,2755,2679],{"class":1755},[1163,2757,1036],{"class":1224},[1163,2759,1326],{"class":1755},[1163,2761,1019],{"class":1224},[1163,2763,2764,2767,2769,2771,2773,2775],{"class":1165,"line":1400},[1163,2765,2766],{"class":1755},"    privilege",[1163,2768,1240],{"class":1759},[1163,2770,2679],{"class":1755},[1163,2772,1036],{"class":1224},[1163,2774,1422],{"class":1755},[1163,2776,1019],{"class":1224},[1163,2778,2779,2782,2784],{"class":1165,"line":1417},[1163,2780,2781],{"class":1755},"    report",[1163,2783,1240],{"class":1759},[1163,2785,1280],{"class":1224},[1163,2787,2788,2791,2793,2797,2800,2803,2806],{"class":1165,"line":1435},[1163,2789,2790],{"class":1755},"      generatedAt",[1163,2792,1240],{"class":1759},[1163,2794,2796],{"class":2795},"sakC6"," new",[1163,2798,2799],{"class":1169}," Date",[1163,2801,2802],{"class":1224},"().",[1163,2804,2805],{"class":1169},"toISOString",[1163,2807,2808],{"class":1224},"(),\n",[1163,2810,2811,2814,2816,2818,2820,2823,2825,2827,2829,2832,2834,2836,2838,2841,2843],{"class":1165,"line":1441},[1163,2812,2813],{"class":1755},"      items",[1163,2815,1240],{"class":1759},[1163,2817,1762],{"class":1224},[1163,2819,1765],{"class":1184},[1163,2821,2822],{"class":1188},"orders",[1163,2824,1765],{"class":1184},[1163,2826,1015],{"class":1224},[1163,2828,1765],{"class":1184},[1163,2830,2831],{"class":1188},"revenue",[1163,2833,1765],{"class":1184},[1163,2835,1015],{"class":1224},[1163,2837,1765],{"class":1184},[1163,2839,2840],{"class":1188},"retention",[1163,2842,1765],{"class":1184},[1163,2844,2845],{"class":1224},"]\n",[1163,2847,2848],{"class":1165,"line":2064},[1163,2849,2084],{"class":1224},[1163,2851,2852],{"class":1165,"line":2075},[1163,2853,1438],{"class":1224},[1163,2855,2856,2859,2861,2863,2865],{"class":1165,"line":2081},[1163,2857,2858],{"class":1224},"}, ",[1163,2860,1765],{"class":1184},[1163,2862,1018],{"class":1188},[1163,2864,1765],{"class":1184},[1163,2866,2253],{"class":1224},[813,2868,2869],{},"Call the route from another service like this:",[1072,2871,2873],{"className":1156,"code":2872,"filename":1158,"language":1159,"meta":1079,"style":1079},"curl \\\n  -H \"X-API-KEY: rpt_d2f460c847aca70d00766922991aa073210fc107de5b251669f9b94ffa9d30e7122549a9b2d94be78a0b801629036a5f0aea8d82a12cd565044c39aa6608a36a_af609e80\" \\\n  \"http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fpublic\u002Freports\"\n",[826,2874,2875,2881,2893],{"__ignoreMap":1079},[1163,2876,2877,2879],{"class":1165,"line":1166},[1163,2878,1170],{"class":1169},[1163,2880,1174],{"class":1173},[1163,2882,2883,2885,2887,2889,2891],{"class":1165,"line":1177},[1163,2884,1181],{"class":1180},[1163,2886,1185],{"class":1184},[1163,2888,1189],{"class":1188},[1163,2890,1192],{"class":1184},[1163,2892,1174],{"class":1173},[1163,2894,2895,2897,2900],{"class":1165,"line":1197},[1163,2896,1200],{"class":1184},[1163,2898,2899],{"class":1188},"http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fpublic\u002Freports",[1163,2901,1206],{"class":1184},[813,2903,2904],{},"This pattern is the cleanest way to grant access to a custom API. Your Nuxt\nserver owns the route contract and decides what the response shape looks like.\nThe IAM service owns credential validity. It checks the privilege label,\nenforces IP restrictions, updates the usage record, and applies abuse controls\nbefore your handler is ever reached.",[835,2906],{},[838,2908,2910],{"id":2909},"let-logged-in-users-create-and-rotate-tokens","Let logged-in users create and rotate tokens",[813,2912,2913,2914,2916,2917,2919,2920,2922],{},"The other half of the story is dashboard management. That is where\n",[826,2915,1684],{}," fits. The wrapper enforces session authentication\nand CSRF verification before it processes any action. It requires a ",[826,2918,901],{},"\nmethod and applies a 2 KB JSON body limit. Token identity resolution happens\non the server, so the browser only needs to submit a ",[826,2921,1098],{}," for any\nexisting-token action.",[813,2924,2925,2926,1240],{},"Create one route file and branch on ",[826,2927,2928],{},"event.context.params.action",[1072,2930,2933],{"className":1730,"code":2931,"filename":2932,"language":1733,"meta":1079,"style":1079},"import { defineApiManagementHandler } from 'auth-h3client\u002Fv1'\n\nexport default defineApiManagementHandler(async (event) => {\n  const action = event.context.params?.action\n\n  if (action === 'new-token') {\n    return { ok: true, data: event.context.newApiToken }\n  }\n\n  if (action === 'metadata') {\n    return { ok: true, data: event.context.extensiveMetadata }\n  }\n\n  if (action === 'rotate') {\n    return { ok: true, data: event.context.rotate }\n  }\n\n  if (action === 'revoke') {\n    return { ok: true, data: event.context.revoke }\n  }\n\n  return {\n    ok: true,\n    data: event.context.ipRestrictionUpdate ?? event.context.privilegeUpdate\n  }\n}, 'demo', 'protected')\n","server\u002Fapi\u002Fauth\u002Fapi-tokens\u002F[action].post.ts",[826,2934,2935,2953,2957,2980,3006,3010,3029,3062,3066,3070,3088,3119,3123,3127,3145,3175,3179,3183,3201,3231,3235,3239,3245,3255,3287,3291],{"__ignoreMap":1079},[1163,2936,2937,2939,2941,2943,2945,2947,2949,2951],{"class":1165,"line":1166},[1163,2938,1836],{"class":1740},[1163,2940,1839],{"class":1224},[1163,2942,1684],{"class":1755},[1163,2944,1845],{"class":1224},[1163,2946,1848],{"class":1740},[1163,2948,1804],{"class":1184},[1163,2950,1913],{"class":1188},[1163,2952,1810],{"class":1184},[1163,2954,2955],{"class":1165,"line":1177},[1163,2956,1920],{"emptyLinePlaceholder":8},[1163,2958,2959,2961,2963,2966,2968,2970,2972,2974,2976,2978],{"class":1165,"line":1197},[1163,2960,1741],{"class":1740},[1163,2962,1744],{"class":1740},[1163,2964,2965],{"class":1169}," defineApiManagementHandler",[1163,2967,1953],{"class":1224},[1163,2969,2215],{"class":1942},[1163,2971,2218],{"class":1224},[1163,2973,2221],{"class":1935},[1163,2975,1939],{"class":1224},[1163,2977,1943],{"class":1942},[1163,2979,1280],{"class":1224},[1163,2981,2982,2984,2987,2989,2991,2993,2995,2997,3000,3003],{"class":1165,"line":1268},[1163,2983,2232],{"class":1942},[1163,2985,2986],{"class":2237}," action",[1163,2988,2468],{"class":1239},[1163,2990,2684],{"class":1755},[1163,2992,1036],{"class":1224},[1163,2994,2689],{"class":1755},[1163,2996,1036],{"class":1224},[1163,2998,2999],{"class":1755},"params",[1163,3001,3002],{"class":1224},"?.",[1163,3004,3005],{"class":1755},"action\n",[1163,3007,3008],{"class":1165,"line":1283},[1163,3009,1920],{"emptyLinePlaceholder":8},[1163,3011,3012,3014,3016,3019,3021,3023,3025,3027],{"class":1165,"line":1304},[1163,3013,2262],{"class":1740},[1163,3015,2218],{"class":1224},[1163,3017,3018],{"class":1755},"action",[1163,3020,2296],{"class":1239},[1163,3022,1804],{"class":1184},[1163,3024,1495],{"class":1188},[1163,3026,1765],{"class":1184},[1163,3028,2419],{"class":1224},[1163,3030,3031,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3059],{"class":1165,"line":1321},[1163,3032,3033],{"class":1740},"    return",[1163,3035,1839],{"class":1224},[1163,3037,1234],{"class":1755},[1163,3039,1240],{"class":1759},[1163,3041,1243],{"class":1180},[1163,3043,1015],{"class":1224},[1163,3045,1273],{"class":1755},[1163,3047,1240],{"class":1759},[1163,3049,2684],{"class":1755},[1163,3051,1036],{"class":1224},[1163,3053,2689],{"class":1755},[1163,3055,1036],{"class":1224},[1163,3057,3058],{"class":1755},"newApiToken",[1163,3060,3061],{"class":1224}," }\n",[1163,3063,3064],{"class":1165,"line":1338},[1163,3065,1438],{"class":1224},[1163,3067,3068],{"class":1165,"line":1359},[1163,3069,1920],{"emptyLinePlaceholder":8},[1163,3071,3072,3074,3076,3078,3080,3082,3084,3086],{"class":1165,"line":1380},[1163,3073,2262],{"class":1740},[1163,3075,2218],{"class":1224},[1163,3077,3018],{"class":1755},[1163,3079,2296],{"class":1239},[1163,3081,1804],{"class":1184},[1163,3083,1564],{"class":1188},[1163,3085,1765],{"class":1184},[1163,3087,2419],{"class":1224},[1163,3089,3090,3092,3094,3096,3098,3100,3102,3104,3106,3108,3110,3112,3114,3117],{"class":1165,"line":1400},[1163,3091,3033],{"class":1740},[1163,3093,1839],{"class":1224},[1163,3095,1234],{"class":1755},[1163,3097,1240],{"class":1759},[1163,3099,1243],{"class":1180},[1163,3101,1015],{"class":1224},[1163,3103,1273],{"class":1755},[1163,3105,1240],{"class":1759},[1163,3107,2684],{"class":1755},[1163,3109,1036],{"class":1224},[1163,3111,2689],{"class":1755},[1163,3113,1036],{"class":1224},[1163,3115,3116],{"class":1755},"extensiveMetadata",[1163,3118,3061],{"class":1224},[1163,3120,3121],{"class":1165,"line":1417},[1163,3122,1438],{"class":1224},[1163,3124,3125],{"class":1165,"line":1435},[1163,3126,1920],{"emptyLinePlaceholder":8},[1163,3128,3129,3131,3133,3135,3137,3139,3141,3143],{"class":1165,"line":1441},[1163,3130,2262],{"class":1740},[1163,3132,2218],{"class":1224},[1163,3134,3018],{"class":1755},[1163,3136,2296],{"class":1239},[1163,3138,1804],{"class":1184},[1163,3140,1586],{"class":1188},[1163,3142,1765],{"class":1184},[1163,3144,2419],{"class":1224},[1163,3146,3147,3149,3151,3153,3155,3157,3159,3161,3163,3165,3167,3169,3171,3173],{"class":1165,"line":2064},[1163,3148,3033],{"class":1740},[1163,3150,1839],{"class":1224},[1163,3152,1234],{"class":1755},[1163,3154,1240],{"class":1759},[1163,3156,1243],{"class":1180},[1163,3158,1015],{"class":1224},[1163,3160,1273],{"class":1755},[1163,3162,1240],{"class":1759},[1163,3164,2684],{"class":1755},[1163,3166,1036],{"class":1224},[1163,3168,2689],{"class":1755},[1163,3170,1036],{"class":1224},[1163,3172,1586],{"class":1755},[1163,3174,3061],{"class":1224},[1163,3176,3177],{"class":1165,"line":2075},[1163,3178,1438],{"class":1224},[1163,3180,3181],{"class":1165,"line":2081},[1163,3182,1920],{"emptyLinePlaceholder":8},[1163,3184,3185,3187,3189,3191,3193,3195,3197,3199],{"class":1165,"line":2087},[1163,3186,2262],{"class":1740},[1163,3188,2218],{"class":1224},[1163,3190,3018],{"class":1755},[1163,3192,2296],{"class":1239},[1163,3194,1804],{"class":1184},[1163,3196,1542],{"class":1188},[1163,3198,1765],{"class":1184},[1163,3200,2419],{"class":1224},[1163,3202,3203,3205,3207,3209,3211,3213,3215,3217,3219,3221,3223,3225,3227,3229],{"class":1165,"line":2093},[1163,3204,3033],{"class":1740},[1163,3206,1839],{"class":1224},[1163,3208,1234],{"class":1755},[1163,3210,1240],{"class":1759},[1163,3212,1243],{"class":1180},[1163,3214,1015],{"class":1224},[1163,3216,1273],{"class":1755},[1163,3218,1240],{"class":1759},[1163,3220,2684],{"class":1755},[1163,3222,1036],{"class":1224},[1163,3224,2689],{"class":1755},[1163,3226,1036],{"class":1224},[1163,3228,1542],{"class":1755},[1163,3230,3061],{"class":1224},[1163,3232,3233],{"class":1165,"line":2309},[1163,3234,1438],{"class":1224},[1163,3236,3237],{"class":1165,"line":2332},[1163,3238,1920],{"emptyLinePlaceholder":8},[1163,3240,3241,3243],{"class":1165,"line":2354},[1163,3242,2703],{"class":1740},[1163,3244,1280],{"class":1224},[1163,3246,3247,3249,3251,3253],{"class":1165,"line":2374},[1163,3248,2710],{"class":1755},[1163,3250,1240],{"class":1759},[1163,3252,1243],{"class":1180},[1163,3254,1019],{"class":1224},[1163,3256,3257,3260,3262,3264,3266,3268,3270,3273,3276,3278,3280,3282,3284],{"class":1165,"line":2380},[1163,3258,3259],{"class":1755},"    data",[1163,3261,1240],{"class":1759},[1163,3263,2684],{"class":1755},[1163,3265,1036],{"class":1224},[1163,3267,2689],{"class":1755},[1163,3269,1036],{"class":1224},[1163,3271,3272],{"class":1755},"ipRestrictionUpdate",[1163,3274,3275],{"class":1239}," ??",[1163,3277,2684],{"class":1755},[1163,3279,1036],{"class":1224},[1163,3281,2689],{"class":1755},[1163,3283,1036],{"class":1224},[1163,3285,3286],{"class":1755},"privilegeUpdate\n",[1163,3288,3289],{"class":1165,"line":2422},[1163,3290,1438],{"class":1224},[1163,3292,3293,3295,3297,3299,3301,3303,3305,3307,3309],{"class":1165,"line":2434},[1163,3294,2858],{"class":1224},[1163,3296,1765],{"class":1184},[1163,3298,1018],{"class":1188},[1163,3300,1765],{"class":1184},[1163,3302,1015],{"class":1224},[1163,3304,1765],{"class":1184},[1163,3306,1025],{"class":1188},[1163,3308,1765],{"class":1184},[1163,3310,2253],{"class":1224},[813,3312,3313,3314,3316,3317,3319,3320,3322],{},"In this example, newly created tokens are always issued with the ",[826,3315,1018],{},"\nprivilege. The optional third argument allows ",[826,3318,1632],{}," to move a\ntoken to ",[826,3321,1025],{},". If you omit that third argument, the wrapper rejects the\nprivilege update action.",[813,3324,3325,3326,3328],{},"From the browser, call that route with ",[826,3327,172],{},". The helper injects the\nCSRF header on the client and forwards cookies correctly during SSR.",[1072,3330,3333],{"className":1730,"code":3331,"filename":3332,"language":1733,"meta":1079,"style":1079},"import { executeRequest } from 'auth-h3client\u002Fclient'\n\nexport async function createDemoToken() {\n  return await executeRequest\u003C{\n    rawApiKey?: string\n    expiresAt?: string | null\n  }>('\u002Fapi\u002Fauth\u002Fapi-tokens\u002Fnew-token', 'POST', {\n    name: 'report-worker',\n    prefix: 'rpt',\n    expires: 1000 * 60 * 60 * 24 * 30,\n    ipv4: ['203.0.113.10']\n  })\n}\n\nexport async function rotateToken(tokenId: number) {\n  return await executeRequest\u003C{\n    msg: string\n    newRawToken?: string\n    newExpiry?: string | null\n  }>('\u002Fapi\u002Fauth\u002Fapi-tokens\u002Frotate', 'POST', {\n    tokenId\n  })\n}\n","app\u002Fcomposables\u002FuseApiTokens.ts",[826,3334,3335,3354,3358,3374,3387,3399,3415,3437,3452,3468,3496,3514,3518,3522,3526,3548,3558,3567,3576,3589,3610,3615,3619],{"__ignoreMap":1079},[1163,3336,3337,3339,3341,3343,3345,3347,3349,3352],{"class":1165,"line":1166},[1163,3338,1836],{"class":1740},[1163,3340,1839],{"class":1224},[1163,3342,172],{"class":1755},[1163,3344,1845],{"class":1224},[1163,3346,1848],{"class":1740},[1163,3348,1804],{"class":1184},[1163,3350,3351],{"class":1188},"auth-h3client\u002Fclient",[1163,3353,1810],{"class":1184},[1163,3355,3356],{"class":1165,"line":1177},[1163,3357,1920],{"emptyLinePlaceholder":8},[1163,3359,3360,3362,3365,3368,3371],{"class":1165,"line":1197},[1163,3361,1741],{"class":1740},[1163,3363,3364],{"class":1942}," async",[1163,3366,3367],{"class":1942}," function",[1163,3369,3370],{"class":1169}," createDemoToken",[1163,3372,3373],{"class":1224},"() {\n",[1163,3375,3376,3378,3381,3384],{"class":1165,"line":1268},[1163,3377,2703],{"class":1740},[1163,3379,3380],{"class":1740}," await",[1163,3382,3383],{"class":1169}," executeRequest",[1163,3385,3386],{"class":1224},"\u003C{\n",[1163,3388,3389,3392,3395],{"class":1165,"line":1283},[1163,3390,3391],{"class":1755},"    rawApiKey",[1163,3393,3394],{"class":1239},"?:",[1163,3396,3398],{"class":3397},"sFs1U"," string\n",[1163,3400,3401,3404,3406,3409,3412],{"class":1165,"line":1304},[1163,3402,3403],{"class":1755},"    expiresAt",[1163,3405,3394],{"class":1239},[1163,3407,3408],{"class":3397}," string",[1163,3410,3411],{"class":1239}," |",[1163,3413,3414],{"class":3397}," null\n",[1163,3416,3417,3420,3422,3425,3427,3429,3431,3433,3435],{"class":1165,"line":1321},[1163,3418,3419],{"class":1224},"  }>(",[1163,3421,1765],{"class":1184},[1163,3423,3424],{"class":1188},"\u002Fapi\u002Fauth\u002Fapi-tokens\u002Fnew-token",[1163,3426,1765],{"class":1184},[1163,3428,1015],{"class":1224},[1163,3430,1765],{"class":1184},[1163,3432,901],{"class":1188},[1163,3434,1765],{"class":1184},[1163,3436,1958],{"class":1224},[1163,3438,3439,3442,3444,3446,3448,3450],{"class":1165,"line":1338},[1163,3440,3441],{"class":1755},"    name",[1163,3443,1240],{"class":1759},[1163,3445,1804],{"class":1184},[1163,3447,1297],{"class":1188},[1163,3449,1765],{"class":1184},[1163,3451,1019],{"class":1224},[1163,3453,3454,3457,3459,3461,3464,3466],{"class":1165,"line":1359},[1163,3455,3456],{"class":1755},"    prefix",[1163,3458,1240],{"class":1759},[1163,3460,1804],{"class":1184},[1163,3462,3463],{"class":1188},"rpt",[1163,3465,1765],{"class":1184},[1163,3467,1019],{"class":1224},[1163,3469,3470,3473,3475,3478,3480,3482,3484,3486,3488,3490,3492,3494],{"class":1165,"line":1380},[1163,3471,3472],{"class":1755},"    expires",[1163,3474,1240],{"class":1759},[1163,3476,3477],{"class":1315}," 1000",[1163,3479,2047],{"class":1239},[1163,3481,2044],{"class":1315},[1163,3483,2047],{"class":1239},[1163,3485,2044],{"class":1315},[1163,3487,2047],{"class":1239},[1163,3489,2054],{"class":1315},[1163,3491,2047],{"class":1239},[1163,3493,2059],{"class":1315},[1163,3495,1019],{"class":1224},[1163,3497,3498,3501,3503,3505,3507,3510,3512],{"class":1165,"line":1400},[1163,3499,3500],{"class":1755},"    ipv4",[1163,3502,1240],{"class":1759},[1163,3504,1762],{"class":1224},[1163,3506,1765],{"class":1184},[1163,3508,3509],{"class":1188},"203.0.113.10",[1163,3511,1765],{"class":1184},[1163,3513,2845],{"class":1224},[1163,3515,3516],{"class":1165,"line":1417},[1163,3517,2090],{"class":1224},[1163,3519,3520],{"class":1165,"line":1435},[1163,3521,1444],{"class":1224},[1163,3523,3524],{"class":1165,"line":1441},[1163,3525,1920],{"emptyLinePlaceholder":8},[1163,3527,3528,3530,3532,3534,3537,3539,3541,3543,3546],{"class":1165,"line":2064},[1163,3529,1741],{"class":1740},[1163,3531,3364],{"class":1942},[1163,3533,3367],{"class":1942},[1163,3535,3536],{"class":1169}," rotateToken",[1163,3538,1953],{"class":1224},[1163,3540,1098],{"class":1935},[1163,3542,1240],{"class":1239},[1163,3544,3545],{"class":3397}," number",[1163,3547,2419],{"class":1224},[1163,3549,3550,3552,3554,3556],{"class":1165,"line":2075},[1163,3551,2703],{"class":1740},[1163,3553,3380],{"class":1740},[1163,3555,3383],{"class":1169},[1163,3557,3386],{"class":1224},[1163,3559,3560,3563,3565],{"class":1165,"line":2081},[1163,3561,3562],{"class":1755},"    msg",[1163,3564,1240],{"class":1239},[1163,3566,3398],{"class":3397},[1163,3568,3569,3572,3574],{"class":1165,"line":2087},[1163,3570,3571],{"class":1755},"    newRawToken",[1163,3573,3394],{"class":1239},[1163,3575,3398],{"class":3397},[1163,3577,3578,3581,3583,3585,3587],{"class":1165,"line":2093},[1163,3579,3580],{"class":1755},"    newExpiry",[1163,3582,3394],{"class":1239},[1163,3584,3408],{"class":3397},[1163,3586,3411],{"class":1239},[1163,3588,3414],{"class":3397},[1163,3590,3591,3593,3595,3598,3600,3602,3604,3606,3608],{"class":1165,"line":2309},[1163,3592,3419],{"class":1224},[1163,3594,1765],{"class":1184},[1163,3596,3597],{"class":1188},"\u002Fapi\u002Fauth\u002Fapi-tokens\u002Frotate",[1163,3599,1765],{"class":1184},[1163,3601,1015],{"class":1224},[1163,3603,1765],{"class":1184},[1163,3605,901],{"class":1188},[1163,3607,1765],{"class":1184},[1163,3609,1958],{"class":1224},[1163,3611,3612],{"class":1165,"line":2332},[1163,3613,3614],{"class":1755},"    tokenId\n",[1163,3616,3617],{"class":1165,"line":2354},[1163,3618,2090],{"class":1224},[1163,3620,3621],{"class":1165,"line":2374},[1163,3622,1444],{"class":1224},[813,3624,3625,3626,3628,3629,1143,3631,3633],{},"Notice what the browser does not send for rotate. It only sends ",[826,3627,1098],{},". The\nwrapper fetches the authenticated token inventory, resolves the matching\n",[826,3630,1101],{},[826,3632,1105],{},", and only then calls the IAM management endpoint.\nThat is one of the main reasons to use Auth H3 Client instead of calling the\nIAM management API directly from the browser.",[813,3635,3636],{},"The wrapper also gives you typed action results on the event context:",[846,3638,3639,3648],{},[849,3640,3641],{},[852,3642,3643,3645],{},[855,3644,1478],{},[855,3646,3647],{},"Event context field",[868,3649,3650,3661,3672,3683,3694,3705],{},[852,3651,3652,3656],{},[873,3653,3654],{},[826,3655,1495],{},[873,3657,3658],{},[826,3659,3660],{},"event.context.newApiToken",[852,3662,3663,3667],{},[873,3664,3665],{},[826,3666,1564],{},[873,3668,3669],{},[826,3670,3671],{},"event.context.extensiveMetadata",[852,3673,3674,3678],{},[873,3675,3676],{},[826,3677,1586],{},[873,3679,3680],{},[826,3681,3682],{},"event.context.rotate",[852,3684,3685,3689],{},[873,3686,3687],{},[826,3688,1542],{},[873,3690,3691],{},[826,3692,3693],{},"event.context.revoke",[852,3695,3696,3700],{},[873,3697,3698],{},[826,3699,1608],{},[873,3701,3702],{},[826,3703,3704],{},"event.context.ipRestrictionUpdate",[852,3706,3707,3711],{},[873,3708,3709],{},[826,3710,1632],{},[873,3712,3713],{},[826,3714,3715],{},"event.context.privilegeUpdate",[835,3717],{},[838,3719,3721],{"id":3720},"a-complete-flow-for-granting-access-to-a-custom-api","A complete flow for granting access to a custom API",[813,3723,3724,3725,3727],{},"With the pieces above, the end-to-end flow is straightforward. A logged-in user\ncreates a token from your dashboard. Your app stores only the raw token shown\nonce to the user. The external service then calls your Nuxt route with\n",[826,3726,891],{},", and the gateway verifies it against the IAM service before your\nhandler runs.",[813,3729,3730,3732,3733,3735,3736,3738],{},[826,3731,1688],{}," gives the browser a clean inventory view for active\ntokens. It proxies to IAM ",[826,3734,923],{}," and strips\n",[826,3737,1094],{}," before the response reaches the browser. That means the\nfrontend can render names, creation dates, expiry times, usage counts, and IP\nrestrictions without learning the internal management identifier.",[813,3740,3741],{},"This split gives you three strong properties at the same time. The custom API\nstays simple. The IAM service remains the only place that decides whether a key\nis valid. The browser never needs to hold server-side token identity data for\nmanagement actions.",[835,3743],{},[838,3745,3747],{"id":3746},"summary","Summary",[813,3749,3750],{},"Each\nkey is validated by checksum before a database lookup happens. The database\nholds only hashed values and never the raw secret. Privilege matching is exact,\nand IP restrictions are enforced at the verification layer before your handler\nsees the request. Every successful call updates the token's usage record, giving\nyou a real credential inventory rather than an opaque secret store. Rotation and\nrevocation are first-class operations built into the same management surface\nthat creates tokens.",[813,3752,3753,3754,3756],{},"Auth H3 Client is the layer that makes that subsystem practical in Nuxt and\nNitro. Machine-to-machine verification gets a dedicated wrapper that calls IAM\nand places results on the event context. Browser management routes get a\nseparate wrapper that handles session auth and CSRF checks, then resolves token\nidentity on the server so the browser never holds internal IAM references. The\ninventory controller strips ",[826,3755,1094],{}," from list responses so the\nfrontend can render names, dates, expiry times, and usage counts without\nlearning the server-side management identifier.",[813,3758,3759,3760,3762],{},"If you are building a mixed app with both browser auth and API-key protected\ncustom APIs, the right pattern is clear. Keep browser middleware on browser\nroutes. Bypass that middleware for ",[826,3761,832],{}," routes. Let\nthe IAM service own credential validity and token lifecycle decisions.",[3764,3765],"read-more",{"to":446},[3764,3767],{"to":92},[3764,3769],{"to":219},[3771,3772,3773],"style",{},"html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .st6lo, html code.shiki .st6lo{--shiki-light:#EE0000;--shiki-default:#EE0000;--shiki-dark:#FF79C6}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}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 .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 .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}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 .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 .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .sakC6, html code.shiki .sakC6{--shiki-light:#0000FF;--shiki-light-font-weight:inherit;--shiki-default:#0000FF;--shiki-default-font-weight:inherit;--shiki-dark:#FF79C6;--shiki-dark-font-weight:bold}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}",{"title":1079,"searchDepth":1177,"depth":1177,"links":3775},[3776,3777,3778,3779,3780,3781,3782,3784,3785,3786],{"id":840,"depth":1177,"text":841},{"id":1062,"depth":1177,"text":1063},{"id":1117,"depth":1177,"text":1118},{"id":1449,"depth":1177,"text":1450},{"id":1674,"depth":1177,"text":1675},{"id":1713,"depth":1177,"text":1714},{"id":2596,"depth":1177,"text":3783},"Protecting a custom API with X-API-KEY",{"id":2909,"depth":1177,"text":2910},{"id":3720,"depth":1177,"text":3721},{"id":3746,"depth":1177,"text":3747},"2026-05-01","A detailed guide to the IAM API token subsystem, from verification and management to protecting custom APIs with Auth H3 Client.","md",null,"https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1558494949-ef010cbdcc31?w=1200&q=80",{},"---\ntitle: \"IAM API Tokens with Auth H3 Client: Secure M2M Access in Nuxt and Nitro\"\ndescription: \"A detailed guide to the IAM API token subsystem, from verification and management to protecting custom APIs with Auth H3 Client.\"\ntags:\n  - Security\n  - API Tokens\n  - Nuxt\nimage: \"https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1558494949-ef010cbdcc31?w=1200&q=80\"\nauthor: \"Sergio\"\nauthorImg: \"https:\u002F\u002Fgithub.com\u002FSergo706.png\"\nauthorGithub: \"https:\u002F\u002Fgithub.com\u002FSergo706\"\nauthorGithubUserName: \"Sergo706\"\nfeatured: false\ndate: 2026-05-01T10:00:00.000Z\nreadingTime: \"14 min read\"\n---\n\nMachine-to-machine authentication looks simple until you need to answer real\nquestions. How do you scope access, revoke a leaked key, rotate credentials,\nkeep raw secrets out of the database, and still give users a clean dashboard\nfor managing their integrations?\n\nThe IAM service solves that problem with a dedicated API token subsystem.\nPublic verification and authenticated management are two distinct surfaces with\ndifferent security requirements. The database never stores a raw secret. Only\nthe SHA-256 digest of each key is persisted. Privilege labels and optional IP restrictions\nlive at the row level, and the full model maps cleanly into Auth H3 Client for\nNuxt, Nitro, and plain H3 applications.\n\n::important\nThis article assumes you already have a running IAM service and a Nuxt or Nitro\napp configured with `@riavzon\u002Fauth-h3client`. If your app exposes\nmachine-to-machine routes protected with `defineAuthenticatePublicApi`, do not\nplace those routes behind the bundled Nuxt auth middleware. That middleware is\nfor browser session flows, while API-key routes need a path bypass.\n::\n\n---\n\n## What the subsystem exposes\n\nThe API token subsystem has two distinct surfaces. Public verification is the\nmachine-to-machine entry point. Management routes are session-authenticated\nbrowser flows for creating, listing, rotating, revoking, and updating tokens.\n\n| Surface | Method | Route | Purpose |\n|---|---|---|---|\n| Public verification | `GET` | `\u002Fapi\u002Fpublic\u002Fverify` | Verify a raw API token from `X-API-KEY` |\n| Token creation | `POST` | `\u002Fapi\u002Fmanage\u002Fnew-token` | Create a new API token |\n| Token inventory | `GET` | `\u002Fapi\u002Fmanage\u002Flist-metadata` | List the current user's valid tokens |\n| Revocation | `POST` | `\u002Fapi\u002Fmanage\u002Frevoke` | Invalidate a token |\n| Metadata | `POST` | `\u002Fapi\u002Fmanage\u002Fmetadata` | Return details for one token |\n| Rotation | `POST` | `\u002Fapi\u002Fmanage\u002Frotate` | Replace a token with a fresh raw key |\n| IP updates | `POST` | `\u002Fapi\u002Fmanage\u002Fip-restriction-update` | Change the stored IP allowlist |\n| Privilege updates | `POST` | `\u002Fapi\u002Fmanage\u002Fprivilege-update` | Change the stored privilege label |\n\nEvery token is scoped with one privilege label: `custom`, `demo`,\n`restricted`, `protected`, or `full`. The verification route checks the exact\nlabel you request, not a hierarchy. If your route requires `demo`, the token\nmust carry `demo`.\n\nThe five levels have no built-in ordering. `demo` does not imply access to\n`restricted` routes, and `restricted` does not include `protected`. Each token\ncarries exactly one label and that label is matched literally. `custom` is a\ncatch-all for use cases that do not map to the four named levels. You decide\nwhat `custom` means in your own application.\n\n---\n\n## How a token is shaped and stored\n\nThe raw token format is simple on the surface. Each key is created as\n`prefix_random_checksum`, where the checksum is the first eight hexadecimal\ncharacters of a SHA-256 digest of the random portion.\n\n```text [API token format]\nrpt_d2f460c847aca70d00766922991aa073210fc107de5b251669f9b94ffa9d30e7122549a9b2d94be78a0b801629036a5f0aea8d82a12cd565044c39aa6608a36a_af609e80\n```\n\nThat checksum lets the IAM service reject malformed keys quickly before doing a\ndatabase lookup. The raw key is only returned once, at creation or rotation\ntime. After that, the database stores only the SHA-256 digest in the\n`api_tokens.api_token` column.\n\nThe subsystem also creates a separate `public_identifier`. This value is not a\ncredential. It exists so management actions can target the correct row without\nrelying on the raw token after it has been issued. In the direct IAM API, most\nmanagement actions require `tokenId`, `publicIdentifier`, and `name` together.\nAuth H3 Client deliberately hides `publicIdentifier` from browser code and\nresolves it on the server.\n\nThe stored row carries operational metadata too. The IAM service records the\ntoken owner, privilege label, creation time, expiration time, last-use time,\nusage count, validity flag, and optional IP restriction list. That gives you a\nreal credential inventory rather than an opaque secret store.\n\n---\n\n## How verification works\n\nThe public verification route is `GET \u002Fapi\u002Fpublic\u002Fverify`. It reads the raw\ntoken from the `X-API-KEY` header, reads the required privilege from the query\nstring, and validates the request IP so IP-restricted tokens can be enforced.\n\nInternally, verification follows a strict sequence. The IAM service validates\nthe checksum, hashes the raw key, looks up the hashed row where `valid = 1`,\nchecks the exact `privilege_type`, applies expiration rules, enforces any\nstored IP restrictions, and updates `usage_count` and `last_used` for\nsuccessful requests.\n\nFailed verification attempts are throttled aggressively. Any request with a\nmissing key, a malformed privilege value, an unresolvable IP address, or an\ninvalid token feeds directly into the IAM verification limiters. The limiter\ncounts against the caller's IP, so repeated failures eventually trigger a\npermanent ban at the gateway level. Successful requests can also be\nrate-limited if you enable consumption limiting on the IAM side.\n\nCall the route directly like this:\n\n```bash [Terminal]\ncurl \\\n  -H \"X-API-KEY: rpt_d2f460c847aca70d00766922991aa073210fc107de5b251669f9b94ffa9d30e7122549a9b2d94be78a0b801629036a5f0aea8d82a12cd565044c39aa6608a36a_af609e80\" \\\n  \"http:\u002F\u002Flocalhost:10000\u002Fapi\u002Fpublic\u002Fverify?privilege=demo\"\n```\n\nOn success, the IAM service returns a compact metadata object. This is the same\nshape Auth H3 Client later exposes on `event.context.apiVerification`.\n\n```json [Verification response]\n{\n  \"ok\": true,\n  \"date\": \"2026-05-01T10:00:00.000Z\",\n  \"data\": {\n    \"name\": \"report-worker\",\n    \"tokenId\": 12,\n    \"userId\": 42,\n    \"createdAt\": \"2026-05-01T09:00:00.000Z\",\n    \"expiresAt\": \"2026-06-01T09:00:00.000Z\",\n    \"lastUsed\": \"2026-05-01T10:00:00.000Z\",\n    \"usageCount\": 8,\n    \"providedPrivilege\": \"demo\"\n  }\n}\n```\n\n---\n\n## How management works\n\nManagement routes are intentionally more demanding than public verification.\nThey sit behind `requireAccessToken`, `requireRefreshToken`, fingerprint\ncollection, active MFA checks, JWT protection, and for `POST` routes a JSON\ncontent-type check plus a 1 KB body limit.\n\nThat split is the right model for a real product. Verification is for services\ncalling your APIs. Management is for logged-in users who are creating and\nchanging credentials inside a dashboard.\n\nHere is the direct IAM management map:\n\n| Action | Method | Input | Result |\n|---|---|---|---|\n| `new-token` | `POST` | `name`, `prefix`, `expires?`, `ipv4?`, `privilege` | New raw token and public identifier |\n| `list-metadata` | `GET` | None | All valid tokens for the authenticated user |\n| `revoke` | `POST` | `tokenId`, `publicIdentifier`, `name` | Invalidates the token |\n| `metadata` | `POST` | `tokenId`, `publicIdentifier`, `name` | Returns one token plus total counts |\n| `rotate` | `POST` | `tokenId`, `publicIdentifier`, `name` | Returns a replacement raw token |\n| `ip-restriction-update` | `POST` | `tokenId`, `publicIdentifier`, `name`, `ipv4?` | Replaces the stored IP allowlist |\n| `privilege-update` | `POST` | `tokenId`, `publicIdentifier`, `name`, `newPrivilege` | Replaces the stored privilege label |\n\nRotation deserves special attention. The IAM service revokes the current token\nand creates a fresh raw token in one management flow. That means the caller can\nroll credentials forward without deleting the integration entirely. Creation and\nrotation are the only two moments when the raw secret leaves the server.\n\n::note\nThe direct IAM create route returns both `rawApiKey` and `rawPublicId`. Auth H3\nClient strips `rawPublicId` before exposing the creation result to your Nuxt\nhandler. That keeps management identity in the server layer instead of the\nbrowser.\n::\n\n---\n\n## Why Auth H3 Client fits this subsystem well\n\nAuth H3 Client does more than proxy requests. It gives the IAM token model the\nright shape for H3 and Nuxt applications. Public machine-to-machine routes use\n`defineAuthenticatePublicApi`. Authenticated dashboard routes use\n`defineApiManagementHandler`. Token inventory reads can use\n`getApiListsController`.\n\nThat split matters because the browser and service callers have different\nsecurity needs. Browser management routes need session auth, CSRF protection,\nand token identity mapping. Machine-to-machine verification needs a single\n`X-API-KEY` header and a clean path to the IAM verification endpoint.\n\nThe wrappers also hide low-level IAM details from your application code. Your\nNuxt route only deals with `tokenId` for existing-token actions, while the\nserver wrapper resolves `publicIdentifier` and `name` through IAM\n`\u002Fapi\u002Fmanage\u002Flist-metadata` before making the final management request.\n\n---\n\n## Integrating with the Nuxt module\n\nIf your application only uses browser auth flows, the Nuxt module can run with\n`enableMiddleware: true` and register the built-in middleware for every\nrequest. Mixed apps need a different setup. If you protect custom APIs with\n`defineAuthenticatePublicApi`, disable the bundled middleware and add your own\npath-aware middleware so browser auth routes still get bot detection and CSRF,\nwhile machine-to-machine routes bypass that chain.\n\nStart by registering the module and disabling the bundled middleware.\n\n```ts [nuxt.config.ts]\nexport default defineNuxtConfig({\n  modules: ['auth-h3client\u002Fmodule'],\n  authH3Client: {\n    enableMiddleware: false,\n    authStatusUrl: '\u002Fapi\u002Fauth\u002Fusers\u002FauthStatus'\n  }\n})\n```\n\nThe module still gives you server auto-imports and client composables in this\nmode. It does not auto-register the bundled middleware, but it still registers\nthe auth status route and, when configured, the optional API token list route.\n\nConfigure the gateway in a Nitro plugin:\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    enableFireWallBans: false,\n    uStorage: {\n      storage: useStorage('cache'),\n      cacheOptions: {\n        successTtl: 60 * 60 * 24 * 30,\n        rateLimitTtl: 10\n      }\n    }\n  })\n})\n```\n\nNext, register a browser middleware that mirrors the packaged middleware but\nskips your machine-to-machine prefix.\n\n```ts [server\u002Fmiddleware\u002Fauth-browser.ts]\nimport {\n  defineEventHandler,\n  getHeader,\n  getRequestURL,\n  isMethod,\n  sendNoContent,\n} from 'auth-h3client\u002Fv1'\nimport {\n  botDetectorMiddleware,\n  generateCsrfCookie,\n  isIPValid,\n} from 'auth-h3client\u002Fv1'\n\nexport default defineEventHandler(async (event) => {\n  const { pathname } = getRequestURL(event)\n\n  if (\n    isMethod(event, 'HEAD') ||\n    pathname === '\u002Fapi\u002Fhealth' ||\n    pathname.startsWith('\u002Fapi\u002F_mdc') ||\n    pathname.startsWith('\u002F_nuxt') ||\n    pathname.startsWith('\u002Fapi\u002Fpublic\u002F')\n  ) {\n    if (isMethod(event, 'HEAD') || pathname === '\u002Fapi\u002Fhealth') {\n      sendNoContent(event)\n    }\n\n    return\n  }\n\n  const forwardedFor = getHeader(event, 'x-forwarded-for')\n  if (forwardedFor === '127.0.0.1' || forwardedFor === '::1') {\n    return\n  }\n\n  isIPValid(event)\n  await botDetectorMiddleware(event)\n  generateCsrfCookie(event)\n})\n```\n\n::tip\nIf your app does not expose machine-to-machine API-key routes, keep\n`enableMiddleware: true` and optionally use `registerApiRoute` on the module.\nThat is the simplest browser-only setup.\n::\n\n---\n\n## Protecting a custom API with `X-API-KEY`\n\nOnce the gateway is configured, protecting a custom API route is small and\npredictable. `defineAuthenticatePublicApi` reads the incoming `X-API-KEY`,\ncalls IAM `\u002Fapi\u002Fpublic\u002Fverify?privilege=...`, and places the verification\nresult on `event.context.apiVerification` before your handler runs.\n\nHere is a custom reports endpoint that grants access to tokens with the exact\n`demo` privilege label:\n\n```ts [server\u002Fapi\u002Fpublic\u002Freports.get.ts]\nimport { defineAuthenticatePublicApi } from 'auth-h3client\u002Fv1'\n\nexport default defineAuthenticatePublicApi(async (event) => {\n  const token = event.context.apiVerification\n\n  return {\n    ok: true,\n    consumer: token.name,\n    tokenId: token.tokenId,\n    userId: token.userId,\n    privilege: token.providedPrivilege,\n    report: {\n      generatedAt: new Date().toISOString(),\n      items: ['orders', 'revenue', 'retention']\n    }\n  }\n}, 'demo')\n```\n\nCall the route from another service like this:\n\n```bash [Terminal]\ncurl \\\n  -H \"X-API-KEY: rpt_d2f460c847aca70d00766922991aa073210fc107de5b251669f9b94ffa9d30e7122549a9b2d94be78a0b801629036a5f0aea8d82a12cd565044c39aa6608a36a_af609e80\" \\\n  \"http:\u002F\u002Flocalhost:3000\u002Fapi\u002Fpublic\u002Freports\"\n```\n\nThis pattern is the cleanest way to grant access to a custom API. Your Nuxt\nserver owns the route contract and decides what the response shape looks like.\nThe IAM service owns credential validity. It checks the privilege label,\nenforces IP restrictions, updates the usage record, and applies abuse controls\nbefore your handler is ever reached.\n\n---\n\n## Let logged-in users create and rotate tokens\n\nThe other half of the story is dashboard management. That is where\n`defineApiManagementHandler` fits. The wrapper enforces session authentication\nand CSRF verification before it processes any action. It requires a `POST`\nmethod and applies a 2 KB JSON body limit. Token identity resolution happens\non the server, so the browser only needs to submit a `tokenId` for any\nexisting-token action.\n\nCreate one route file and branch on `event.context.params.action`:\n\n```ts [server\u002Fapi\u002Fauth\u002Fapi-tokens\u002F[action].post.ts]\nimport { defineApiManagementHandler } from 'auth-h3client\u002Fv1'\n\nexport default defineApiManagementHandler(async (event) => {\n  const action = event.context.params?.action\n\n  if (action === 'new-token') {\n    return { ok: true, data: event.context.newApiToken }\n  }\n\n  if (action === 'metadata') {\n    return { ok: true, data: event.context.extensiveMetadata }\n  }\n\n  if (action === 'rotate') {\n    return { ok: true, data: event.context.rotate }\n  }\n\n  if (action === 'revoke') {\n    return { ok: true, data: event.context.revoke }\n  }\n\n  return {\n    ok: true,\n    data: event.context.ipRestrictionUpdate ?? event.context.privilegeUpdate\n  }\n}, 'demo', 'protected')\n```\n\nIn this example, newly created tokens are always issued with the `demo`\nprivilege. The optional third argument allows `privilege-update` to move a\ntoken to `protected`. If you omit that third argument, the wrapper rejects the\nprivilege update action.\n\nFrom the browser, call that route with `executeRequest`. The helper injects the\nCSRF header on the client and forwards cookies correctly during SSR.\n\n```ts [app\u002Fcomposables\u002FuseApiTokens.ts]\nimport { executeRequest } from 'auth-h3client\u002Fclient'\n\nexport async function createDemoToken() {\n  return await executeRequest\u003C{\n    rawApiKey?: string\n    expiresAt?: string | null\n  }>('\u002Fapi\u002Fauth\u002Fapi-tokens\u002Fnew-token', 'POST', {\n    name: 'report-worker',\n    prefix: 'rpt',\n    expires: 1000 * 60 * 60 * 24 * 30,\n    ipv4: ['203.0.113.10']\n  })\n}\n\nexport async function rotateToken(tokenId: number) {\n  return await executeRequest\u003C{\n    msg: string\n    newRawToken?: string\n    newExpiry?: string | null\n  }>('\u002Fapi\u002Fauth\u002Fapi-tokens\u002Frotate', 'POST', {\n    tokenId\n  })\n}\n```\n\nNotice what the browser does not send for rotate. It only sends `tokenId`. The\nwrapper fetches the authenticated token inventory, resolves the matching\n`publicIdentifier` and `name`, and only then calls the IAM management endpoint.\nThat is one of the main reasons to use Auth H3 Client instead of calling the\nIAM management API directly from the browser.\n\nThe wrapper also gives you typed action results on the event context:\n\n| Action | Event context field |\n|---|---|\n| `new-token` | `event.context.newApiToken` |\n| `metadata` | `event.context.extensiveMetadata` |\n| `rotate` | `event.context.rotate` |\n| `revoke` | `event.context.revoke` |\n| `ip-restriction-update` | `event.context.ipRestrictionUpdate` |\n| `privilege-update` | `event.context.privilegeUpdate` |\n\n---\n\n## A complete flow for granting access to a custom API\n\nWith the pieces above, the end-to-end flow is straightforward. A logged-in user\ncreates a token from your dashboard. Your app stores only the raw token shown\nonce to the user. The external service then calls your Nuxt route with\n`X-API-KEY`, and the gateway verifies it against the IAM service before your\nhandler runs.\n\n`getApiListsController` gives the browser a clean inventory view for active\ntokens. It proxies to IAM `\u002Fapi\u002Fmanage\u002Flist-metadata` and strips\n`public_identifier` before the response reaches the browser. That means the\nfrontend can render names, creation dates, expiry times, usage counts, and IP\nrestrictions without learning the internal management identifier.\n\nThis split gives you three strong properties at the same time. The custom API\nstays simple. The IAM service remains the only place that decides whether a key\nis valid. The browser never needs to hold server-side token identity data for\nmanagement actions.\n\n---\n\n## Summary\n\nEach\nkey is validated by checksum before a database lookup happens. The database\nholds only hashed values and never the raw secret. Privilege matching is exact,\nand IP restrictions are enforced at the verification layer before your handler\nsees the request. Every successful call updates the token's usage record, giving\nyou a real credential inventory rather than an opaque secret store. Rotation and\nrevocation are first-class operations built into the same management surface\nthat creates tokens.\n\nAuth H3 Client is the layer that makes that subsystem practical in Nuxt and\nNitro. Machine-to-machine verification gets a dedicated wrapper that calls IAM\nand places results on the event context. Browser management routes get a\nseparate wrapper that handles session auth and CSRF checks, then resolves token\nidentity on the server so the browser never holds internal IAM references. The\ninventory controller strips `public_identifier` from list responses so the\nfrontend can render names, dates, expiry times, and usage counts without\nlearning the server-side management identifier.\n\nIf you are building a mixed app with both browser auth and API-key protected\ncustom APIs, the right pattern is clear. Keep browser middleware on browser\nroutes. Bypass that middleware for `defineAuthenticatePublicApi` routes. Let\nthe IAM service own credential validity and token lifecycle decisions.\n\n::read-more{to=\"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\"}\n::\n\n::read-more{to=\"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt\"}\n::\n\n::read-more{to=\"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware\"}\n::","14 min read",{"title":69,"description":3788},[38,445,3797],"Nuxt","xUyiAnoFz2Pou6JciwM8wXFg6eZEmb_ukv_sIvGjdic",{"id":804,"title":69,"author":805,"authorGithub":806,"authorGithubUserName":807,"authorImg":808,"body":3800,"date":3787,"description":3788,"extension":3789,"featured":53,"icon":3790,"image":3791,"meta":6253,"navigation":8,"path":70,"rawbody":3793,"readingTime":3794,"seo":6254,"stem":71,"tags":6255,"__hash__":3798},{"type":810,"value":3801,"toc":6241},[3802,3804,3806,3814,3816,3818,3820,3950,3966,3980,3982,3984,3988,3993,3997,4009,4011,4013,4015,4021,4031,4033,4035,4065,4069,4259,4261,4263,4271,4273,4275,4433,4435,4445,4447,4449,4457,4461,4471,4473,4475,4481,4483,4551,4553,4555,4775,4777,5185,5193,5195,5199,5209,5213,5431,5433,5463,5465,5467,5469,5477,5481,5847,5855,5859,6119,6127,6129,6201,6203,6205,6209,6217,6219,6221,6223,6225,6229,6233,6235,6237,6239],[813,3803,815],{},[813,3805,818],{},[820,3807,3808],{},[813,3809,824,3810,829,3812,833],{},[826,3811,828],{},[826,3813,832],{},[835,3815],{},[838,3817,841],{"id":840},[813,3819,844],{},[846,3821,3822,3834],{},[849,3823,3824],{},[852,3825,3826,3828,3830,3832],{},[855,3827,857],{},[855,3829,860],{},[855,3831,863],{},[855,3833,866],{},[868,3835,3836,3852,3866,3880,3894,3908,3922,3936],{},[852,3837,3838,3840,3844,3848],{},[873,3839,875],{},[873,3841,3842],{},[826,3843,880],{},[873,3845,3846],{},[826,3847,885],{},[873,3849,888,3850],{},[826,3851,891],{},[852,3853,3854,3856,3860,3864],{},[873,3855,896],{},[873,3857,3858],{},[826,3859,901],{},[873,3861,3862],{},[826,3863,906],{},[873,3865,909],{},[852,3867,3868,3870,3874,3878],{},[873,3869,914],{},[873,3871,3872],{},[826,3873,880],{},[873,3875,3876],{},[826,3877,923],{},[873,3879,926],{},[852,3881,3882,3884,3888,3892],{},[873,3883,469],{},[873,3885,3886],{},[826,3887,901],{},[873,3889,3890],{},[826,3891,939],{},[873,3893,942],{},[852,3895,3896,3898,3902,3906],{},[873,3897,481],{},[873,3899,3900],{},[826,3901,901],{},[873,3903,3904],{},[826,3905,955],{},[873,3907,958],{},[852,3909,3910,3912,3916,3920],{},[873,3911,473],{},[873,3913,3914],{},[826,3915,901],{},[873,3917,3918],{},[826,3919,971],{},[873,3921,974],{},[852,3923,3924,3926,3930,3934],{},[873,3925,979],{},[873,3927,3928],{},[826,3929,901],{},[873,3931,3932],{},[826,3933,988],{},[873,3935,991],{},[852,3937,3938,3940,3944,3948],{},[873,3939,996],{},[873,3941,3942],{},[826,3943,901],{},[873,3945,3946],{},[826,3947,1005],{},[873,3949,1008],{},[813,3951,1011,3952,1015,3954,1019,3956,1015,3958,1026,3960,1030,3962,1033,3964,1036],{},[826,3953,1014],{},[826,3955,1018],{},[826,3957,1022],{},[826,3959,1025],{},[826,3961,1029],{},[826,3963,1018],{},[826,3965,1018],{},[813,3967,1039,3968,1042,3970,1045,3972,1048,3974,1051,3976,1054,3978,1057],{},[826,3969,1018],{},[826,3971,1022],{},[826,3973,1022],{},[826,3975,1025],{},[826,3977,1014],{},[826,3979,1014],{},[835,3981],{},[838,3983,1063],{"id":1062},[813,3985,1066,3986,1070],{},[826,3987,1069],{},[1072,3989,3991],{"className":3990,"code":1076,"filename":1077,"language":1078,"meta":1079},[1075],[826,3992,1076],{"__ignoreMap":1079},[813,3994,1084,3995,1088],{},[826,3996,1087],{},[813,3998,1091,3999,1095,4001,1015,4003,1102,4005,1106,4007,1109],{},[826,4000,1094],{},[826,4002,1098],{},[826,4004,1101],{},[826,4006,1105],{},[826,4008,1101],{},[813,4010,1112],{},[835,4012],{},[838,4014,1118],{"id":1117},[813,4016,1121,4017,1125,4019,1128],{},[826,4018,1124],{},[826,4020,891],{},[813,4022,1131,4023,1135,4025,1139,4027,1143,4029,1147],{},[826,4024,1134],{},[826,4026,1138],{},[826,4028,1142],{},[826,4030,1146],{},[813,4032,1150],{},[813,4034,1153],{},[1072,4036,4037],{"className":1156,"code":1157,"filename":1158,"language":1159,"meta":1079,"style":1079},[826,4038,4039,4045,4057],{"__ignoreMap":1079},[1163,4040,4041,4043],{"class":1165,"line":1166},[1163,4042,1170],{"class":1169},[1163,4044,1174],{"class":1173},[1163,4046,4047,4049,4051,4053,4055],{"class":1165,"line":1177},[1163,4048,1181],{"class":1180},[1163,4050,1185],{"class":1184},[1163,4052,1189],{"class":1188},[1163,4054,1192],{"class":1184},[1163,4056,1174],{"class":1173},[1163,4058,4059,4061,4063],{"class":1165,"line":1197},[1163,4060,1200],{"class":1184},[1163,4062,1203],{"class":1188},[1163,4064,1206],{"class":1184},[813,4066,1209,4067,1036],{},[826,4068,1212],{},[1072,4070,4071],{"className":1215,"code":1216,"filename":1217,"language":5,"meta":1079,"style":1079},[826,4072,4073,4077,4091,4109,4121,4139,4153,4167,4185,4203,4221,4235,4251,4255],{"__ignoreMap":1079},[1163,4074,4075],{"class":1165,"line":1166},[1163,4076,1225],{"class":1224},[1163,4078,4079,4081,4083,4085,4087,4089],{"class":1165,"line":1177},[1163,4080,1200],{"class":1230},[1163,4082,1234],{"class":1233},[1163,4084,1192],{"class":1230},[1163,4086,1240],{"class":1239},[1163,4088,1243],{"class":1180},[1163,4090,1019],{"class":1224},[1163,4092,4093,4095,4097,4099,4101,4103,4105,4107],{"class":1165,"line":1197},[1163,4094,1200],{"class":1230},[1163,4096,1252],{"class":1233},[1163,4098,1192],{"class":1230},[1163,4100,1240],{"class":1239},[1163,4102,1185],{"class":1184},[1163,4104,1261],{"class":1188},[1163,4106,1192],{"class":1184},[1163,4108,1019],{"class":1224},[1163,4110,4111,4113,4115,4117,4119],{"class":1165,"line":1268},[1163,4112,1200],{"class":1230},[1163,4114,1273],{"class":1233},[1163,4116,1192],{"class":1230},[1163,4118,1240],{"class":1239},[1163,4120,1280],{"class":1224},[1163,4122,4123,4125,4127,4129,4131,4133,4135,4137],{"class":1165,"line":1283},[1163,4124,1286],{"class":1230},[1163,4126,1105],{"class":1233},[1163,4128,1192],{"class":1230},[1163,4130,1240],{"class":1239},[1163,4132,1185],{"class":1184},[1163,4134,1297],{"class":1188},[1163,4136,1192],{"class":1184},[1163,4138,1019],{"class":1224},[1163,4140,4141,4143,4145,4147,4149,4151],{"class":1165,"line":1304},[1163,4142,1286],{"class":1230},[1163,4144,1098],{"class":1233},[1163,4146,1192],{"class":1230},[1163,4148,1240],{"class":1239},[1163,4150,1316],{"class":1315},[1163,4152,1019],{"class":1224},[1163,4154,4155,4157,4159,4161,4163,4165],{"class":1165,"line":1321},[1163,4156,1286],{"class":1230},[1163,4158,1326],{"class":1233},[1163,4160,1192],{"class":1230},[1163,4162,1240],{"class":1239},[1163,4164,1333],{"class":1315},[1163,4166,1019],{"class":1224},[1163,4168,4169,4171,4173,4175,4177,4179,4181,4183],{"class":1165,"line":1338},[1163,4170,1286],{"class":1230},[1163,4172,1343],{"class":1233},[1163,4174,1192],{"class":1230},[1163,4176,1240],{"class":1239},[1163,4178,1185],{"class":1184},[1163,4180,1352],{"class":1188},[1163,4182,1192],{"class":1184},[1163,4184,1019],{"class":1224},[1163,4186,4187,4189,4191,4193,4195,4197,4199,4201],{"class":1165,"line":1359},[1163,4188,1286],{"class":1230},[1163,4190,1364],{"class":1233},[1163,4192,1192],{"class":1230},[1163,4194,1240],{"class":1239},[1163,4196,1185],{"class":1184},[1163,4198,1373],{"class":1188},[1163,4200,1192],{"class":1184},[1163,4202,1019],{"class":1224},[1163,4204,4205,4207,4209,4211,4213,4215,4217,4219],{"class":1165,"line":1380},[1163,4206,1286],{"class":1230},[1163,4208,1385],{"class":1233},[1163,4210,1192],{"class":1230},[1163,4212,1240],{"class":1239},[1163,4214,1185],{"class":1184},[1163,4216,1261],{"class":1188},[1163,4218,1192],{"class":1184},[1163,4220,1019],{"class":1224},[1163,4222,4223,4225,4227,4229,4231,4233],{"class":1165,"line":1400},[1163,4224,1286],{"class":1230},[1163,4226,1405],{"class":1233},[1163,4228,1192],{"class":1230},[1163,4230,1240],{"class":1239},[1163,4232,1412],{"class":1315},[1163,4234,1019],{"class":1224},[1163,4236,4237,4239,4241,4243,4245,4247,4249],{"class":1165,"line":1417},[1163,4238,1286],{"class":1230},[1163,4240,1422],{"class":1233},[1163,4242,1192],{"class":1230},[1163,4244,1240],{"class":1239},[1163,4246,1185],{"class":1184},[1163,4248,1018],{"class":1188},[1163,4250,1206],{"class":1184},[1163,4252,4253],{"class":1165,"line":1435},[1163,4254,1438],{"class":1224},[1163,4256,4257],{"class":1165,"line":1441},[1163,4258,1444],{"class":1224},[835,4260],{},[838,4262,1450],{"id":1449},[813,4264,1453,4265,1015,4267,1460,4269,1463],{},[826,4266,1456],{},[826,4268,1459],{},[826,4270,901],{},[813,4272,1466],{},[813,4274,1469],{},[846,4276,4277,4289],{},[849,4278,4279],{},[852,4280,4281,4283,4285,4287],{},[855,4282,1478],{},[855,4284,860],{},[855,4286,1483],{},[855,4288,1486],{},[868,4290,4291,4315,4329,4349,4369,4389,4411],{},[852,4292,4293,4297,4301,4313],{},[873,4294,4295],{},[826,4296,1495],{},[873,4298,4299],{},[826,4300,901],{},[873,4302,4303,1015,4305,1015,4307,1015,4309,1015,4311],{},[826,4304,1105],{},[826,4306,1506],{},[826,4308,1509],{},[826,4310,1512],{},[826,4312,1515],{},[873,4314,1518],{},[852,4316,4317,4321,4325,4327],{},[873,4318,4319],{},[826,4320,1525],{},[873,4322,4323],{},[826,4324,880],{},[873,4326,1532],{},[873,4328,1535],{},[852,4330,4331,4335,4339,4347],{},[873,4332,4333],{},[826,4334,1542],{},[873,4336,4337],{},[826,4338,901],{},[873,4340,4341,1015,4343,1015,4345],{},[826,4342,1098],{},[826,4344,1101],{},[826,4346,1105],{},[873,4348,1557],{},[852,4350,4351,4355,4359,4367],{},[873,4352,4353],{},[826,4354,1564],{},[873,4356,4357],{},[826,4358,901],{},[873,4360,4361,1015,4363,1015,4365],{},[826,4362,1098],{},[826,4364,1101],{},[826,4366,1105],{},[873,4368,1579],{},[852,4370,4371,4375,4379,4387],{},[873,4372,4373],{},[826,4374,1586],{},[873,4376,4377],{},[826,4378,901],{},[873,4380,4381,1015,4383,1015,4385],{},[826,4382,1098],{},[826,4384,1101],{},[826,4386,1105],{},[873,4388,1601],{},[852,4390,4391,4395,4399,4409],{},[873,4392,4393],{},[826,4394,1608],{},[873,4396,4397],{},[826,4398,901],{},[873,4400,4401,1015,4403,1015,4405,1015,4407],{},[826,4402,1098],{},[826,4404,1101],{},[826,4406,1105],{},[826,4408,1512],{},[873,4410,1625],{},[852,4412,4413,4417,4421,4431],{},[873,4414,4415],{},[826,4416,1632],{},[873,4418,4419],{},[826,4420,901],{},[873,4422,4423,1015,4425,1015,4427,1015,4429],{},[826,4424,1098],{},[826,4426,1101],{},[826,4428,1105],{},[826,4430,1647],{},[873,4432,1650],{},[813,4434,1653],{},[1655,4436,4437],{},[813,4438,1659,4439,1143,4441,1666,4443,1669],{},[826,4440,1662],{},[826,4442,1665],{},[826,4444,1665],{},[835,4446],{},[838,4448,1675],{"id":1674},[813,4450,1678,4451,1681,4453,1685,4455,1036],{},[826,4452,832],{},[826,4454,1684],{},[826,4456,1688],{},[813,4458,1691,4459,1694],{},[826,4460,891],{},[813,4462,1697,4463,1700,4465,1143,4467,1705,4469,1708],{},[826,4464,1098],{},[826,4466,1101],{},[826,4468,1105],{},[826,4470,923],{},[835,4472],{},[838,4474,1714],{"id":1713},[813,4476,1717,4477,1721,4479,1724],{},[826,4478,1720],{},[826,4480,832],{},[813,4482,1727],{},[1072,4484,4485],{"className":1730,"code":1731,"filename":1732,"language":1733,"meta":1079,"style":1079},[826,4486,4487,4497,4513,4521,4531,4543,4547],{"__ignoreMap":1079},[1163,4488,4489,4491,4493,4495],{"class":1165,"line":1166},[1163,4490,1741],{"class":1740},[1163,4492,1744],{"class":1740},[1163,4494,1747],{"class":1169},[1163,4496,1750],{"class":1224},[1163,4498,4499,4501,4503,4505,4507,4509,4511],{"class":1165,"line":1177},[1163,4500,1756],{"class":1755},[1163,4502,1240],{"class":1759},[1163,4504,1762],{"class":1224},[1163,4506,1765],{"class":1184},[1163,4508,1768],{"class":1188},[1163,4510,1765],{"class":1184},[1163,4512,1773],{"class":1224},[1163,4514,4515,4517,4519],{"class":1165,"line":1197},[1163,4516,1778],{"class":1755},[1163,4518,1240],{"class":1759},[1163,4520,1280],{"class":1224},[1163,4522,4523,4525,4527,4529],{"class":1165,"line":1268},[1163,4524,1787],{"class":1755},[1163,4526,1240],{"class":1759},[1163,4528,1792],{"class":1180},[1163,4530,1019],{"class":1224},[1163,4532,4533,4535,4537,4539,4541],{"class":1165,"line":1283},[1163,4534,1799],{"class":1755},[1163,4536,1240],{"class":1759},[1163,4538,1804],{"class":1184},[1163,4540,1807],{"class":1188},[1163,4542,1810],{"class":1184},[1163,4544,4545],{"class":1165,"line":1304},[1163,4546,1438],{"class":1224},[1163,4548,4549],{"class":1165,"line":1321},[1163,4550,1819],{"class":1224},[813,4552,1822],{},[813,4554,1825],{},[1072,4556,4557],{"className":1730,"code":1828,"filename":1829,"language":1733,"meta":1079,"style":1079},[826,4558,4559,4577,4595,4613,4631,4635,4653,4663,4671,4685,4695,4703,4721,4729,4751,4759,4763,4767,4771],{"__ignoreMap":1079},[1163,4560,4561,4563,4565,4567,4569,4571,4573,4575],{"class":1165,"line":1166},[1163,4562,1836],{"class":1740},[1163,4564,1839],{"class":1224},[1163,4566,1842],{"class":1755},[1163,4568,1845],{"class":1224},[1163,4570,1848],{"class":1740},[1163,4572,1804],{"class":1184},[1163,4574,1853],{"class":1188},[1163,4576,1810],{"class":1184},[1163,4578,4579,4581,4583,4585,4587,4589,4591,4593],{"class":1165,"line":1177},[1163,4580,1836],{"class":1740},[1163,4582,1839],{"class":1224},[1163,4584,1864],{"class":1755},[1163,4586,1845],{"class":1224},[1163,4588,1848],{"class":1740},[1163,4590,1804],{"class":1184},[1163,4592,1873],{"class":1188},[1163,4594,1810],{"class":1184},[1163,4596,4597,4599,4601,4603,4605,4607,4609,4611],{"class":1165,"line":1197},[1163,4598,1836],{"class":1740},[1163,4600,1839],{"class":1224},[1163,4602,1884],{"class":1755},[1163,4604,1845],{"class":1224},[1163,4606,1848],{"class":1740},[1163,4608,1804],{"class":1184},[1163,4610,1893],{"class":1188},[1163,4612,1810],{"class":1184},[1163,4614,4615,4617,4619,4621,4623,4625,4627,4629],{"class":1165,"line":1268},[1163,4616,1836],{"class":1740},[1163,4618,1839],{"class":1224},[1163,4620,1904],{"class":1755},[1163,4622,1845],{"class":1224},[1163,4624,1848],{"class":1740},[1163,4626,1804],{"class":1184},[1163,4628,1913],{"class":1188},[1163,4630,1810],{"class":1184},[1163,4632,4633],{"class":1165,"line":1283},[1163,4634,1920],{"emptyLinePlaceholder":8},[1163,4636,4637,4639,4641,4643,4645,4647,4649,4651],{"class":1165,"line":1304},[1163,4638,1741],{"class":1740},[1163,4640,1744],{"class":1740},[1163,4642,1929],{"class":1169},[1163,4644,1932],{"class":1224},[1163,4646,1936],{"class":1935},[1163,4648,1939],{"class":1224},[1163,4650,1943],{"class":1942},[1163,4652,1280],{"class":1224},[1163,4654,4655,4657,4659,4661],{"class":1165,"line":1321},[1163,4656,1950],{"class":1169},[1163,4658,1953],{"class":1224},[1163,4660,1936],{"class":1755},[1163,4662,1958],{"class":1224},[1163,4664,4665,4667,4669],{"class":1165,"line":1338},[1163,4666,1963],{"class":1239},[1163,4668,1884],{"class":1755},[1163,4670,1019],{"class":1224},[1163,4672,4673,4675,4677,4679,4681,4683],{"class":1165,"line":1359},[1163,4674,1972],{"class":1755},[1163,4676,1240],{"class":1759},[1163,4678,1804],{"class":1184},[1163,4680,1979],{"class":1188},[1163,4682,1765],{"class":1184},[1163,4684,1019],{"class":1224},[1163,4686,4687,4689,4691,4693],{"class":1165,"line":1380},[1163,4688,1988],{"class":1755},[1163,4690,1240],{"class":1759},[1163,4692,1792],{"class":1180},[1163,4694,1019],{"class":1224},[1163,4696,4697,4699,4701],{"class":1165,"line":1400},[1163,4698,1999],{"class":1755},[1163,4700,1240],{"class":1759},[1163,4702,1280],{"class":1224},[1163,4704,4705,4707,4709,4711,4713,4715,4717,4719],{"class":1165,"line":1417},[1163,4706,2008],{"class":1755},[1163,4708,1240],{"class":1759},[1163,4710,2013],{"class":1169},[1163,4712,1953],{"class":1224},[1163,4714,1765],{"class":1184},[1163,4716,2020],{"class":1188},[1163,4718,1765],{"class":1184},[1163,4720,2025],{"class":1224},[1163,4722,4723,4725,4727],{"class":1165,"line":1435},[1163,4724,2030],{"class":1755},[1163,4726,1240],{"class":1759},[1163,4728,1280],{"class":1224},[1163,4730,4731,4733,4735,4737,4739,4741,4743,4745,4747,4749],{"class":1165,"line":1441},[1163,4732,2039],{"class":1755},[1163,4734,1240],{"class":1759},[1163,4736,2044],{"class":1315},[1163,4738,2047],{"class":1239},[1163,4740,2044],{"class":1315},[1163,4742,2047],{"class":1239},[1163,4744,2054],{"class":1315},[1163,4746,2047],{"class":1239},[1163,4748,2059],{"class":1315},[1163,4750,1019],{"class":1224},[1163,4752,4753,4755,4757],{"class":1165,"line":2064},[1163,4754,2067],{"class":1755},[1163,4756,1240],{"class":1759},[1163,4758,2072],{"class":1315},[1163,4760,4761],{"class":1165,"line":2075},[1163,4762,2078],{"class":1224},[1163,4764,4765],{"class":1165,"line":2081},[1163,4766,2084],{"class":1224},[1163,4768,4769],{"class":1165,"line":2087},[1163,4770,2090],{"class":1224},[1163,4772,4773],{"class":1165,"line":2093},[1163,4774,1819],{"class":1224},[813,4776,2098],{},[1072,4778,4779],{"className":1730,"code":2101,"filename":2102,"language":1733,"meta":1079,"style":1079},[826,4780,4781,4787,4793,4799,4805,4811,4817,4829,4835,4841,4847,4853,4865,4869,4891,4911,4915,4921,4941,4955,4975,4995,5013,5017,5053,5063,5067,5071,5075,5079,5083,5107,5137,5141,5145,5149,5159,5171,5181],{"__ignoreMap":1079},[1163,4782,4783,4785],{"class":1165,"line":1166},[1163,4784,1836],{"class":1740},[1163,4786,1280],{"class":1224},[1163,4788,4789,4791],{"class":1165,"line":1177},[1163,4790,2115],{"class":1755},[1163,4792,1019],{"class":1224},[1163,4794,4795,4797],{"class":1165,"line":1197},[1163,4796,2122],{"class":1755},[1163,4798,1019],{"class":1224},[1163,4800,4801,4803],{"class":1165,"line":1268},[1163,4802,2129],{"class":1755},[1163,4804,1019],{"class":1224},[1163,4806,4807,4809],{"class":1165,"line":1283},[1163,4808,2136],{"class":1755},[1163,4810,1019],{"class":1224},[1163,4812,4813,4815],{"class":1165,"line":1304},[1163,4814,2143],{"class":1755},[1163,4816,1019],{"class":1224},[1163,4818,4819,4821,4823,4825,4827],{"class":1165,"line":1321},[1163,4820,2150],{"class":1224},[1163,4822,1848],{"class":1740},[1163,4824,1804],{"class":1184},[1163,4826,1913],{"class":1188},[1163,4828,1810],{"class":1184},[1163,4830,4831,4833],{"class":1165,"line":1338},[1163,4832,1836],{"class":1740},[1163,4834,1280],{"class":1224},[1163,4836,4837,4839],{"class":1165,"line":1359},[1163,4838,2169],{"class":1755},[1163,4840,1019],{"class":1224},[1163,4842,4843,4845],{"class":1165,"line":1380},[1163,4844,2176],{"class":1755},[1163,4846,1019],{"class":1224},[1163,4848,4849,4851],{"class":1165,"line":1400},[1163,4850,2183],{"class":1755},[1163,4852,1019],{"class":1224},[1163,4854,4855,4857,4859,4861,4863],{"class":1165,"line":1417},[1163,4856,2150],{"class":1224},[1163,4858,1848],{"class":1740},[1163,4860,1804],{"class":1184},[1163,4862,1913],{"class":1188},[1163,4864,1810],{"class":1184},[1163,4866,4867],{"class":1165,"line":1435},[1163,4868,1920],{"emptyLinePlaceholder":8},[1163,4870,4871,4873,4875,4877,4879,4881,4883,4885,4887,4889],{"class":1165,"line":1441},[1163,4872,1741],{"class":1740},[1163,4874,1744],{"class":1740},[1163,4876,2210],{"class":1169},[1163,4878,1953],{"class":1224},[1163,4880,2215],{"class":1942},[1163,4882,2218],{"class":1224},[1163,4884,2221],{"class":1935},[1163,4886,1939],{"class":1224},[1163,4888,1943],{"class":1942},[1163,4890,1280],{"class":1224},[1163,4892,4893,4895,4897,4899,4901,4903,4905,4907,4909],{"class":1165,"line":2064},[1163,4894,2232],{"class":1942},[1163,4896,1839],{"class":1224},[1163,4898,2238],{"class":2237},[1163,4900,1845],{"class":1224},[1163,4902,2243],{"class":1239},[1163,4904,2246],{"class":1169},[1163,4906,1953],{"class":1224},[1163,4908,2221],{"class":1755},[1163,4910,2253],{"class":1224},[1163,4912,4913],{"class":1165,"line":2075},[1163,4914,1920],{"emptyLinePlaceholder":8},[1163,4916,4917,4919],{"class":1165,"line":2081},[1163,4918,2262],{"class":1740},[1163,4920,2265],{"class":1224},[1163,4922,4923,4925,4927,4929,4931,4933,4935,4937,4939],{"class":1165,"line":2087},[1163,4924,2270],{"class":1169},[1163,4926,1953],{"class":1224},[1163,4928,2221],{"class":1755},[1163,4930,1015],{"class":1224},[1163,4932,1765],{"class":1184},[1163,4934,2281],{"class":1188},[1163,4936,1765],{"class":1184},[1163,4938,1939],{"class":1224},[1163,4940,2288],{"class":1239},[1163,4942,4943,4945,4947,4949,4951,4953],{"class":1165,"line":2093},[1163,4944,2293],{"class":1755},[1163,4946,2296],{"class":1239},[1163,4948,1804],{"class":1184},[1163,4950,2301],{"class":1188},[1163,4952,1765],{"class":1184},[1163,4954,2306],{"class":1239},[1163,4956,4957,4959,4961,4963,4965,4967,4969,4971,4973],{"class":1165,"line":2309},[1163,4958,2293],{"class":1755},[1163,4960,1036],{"class":1224},[1163,4962,2316],{"class":1169},[1163,4964,1953],{"class":1224},[1163,4966,1765],{"class":1184},[1163,4968,2323],{"class":1188},[1163,4970,1765],{"class":1184},[1163,4972,1939],{"class":1224},[1163,4974,2288],{"class":1239},[1163,4976,4977,4979,4981,4983,4985,4987,4989,4991,4993],{"class":1165,"line":2332},[1163,4978,2293],{"class":1755},[1163,4980,1036],{"class":1224},[1163,4982,2316],{"class":1169},[1163,4984,1953],{"class":1224},[1163,4986,1765],{"class":1184},[1163,4988,2345],{"class":1188},[1163,4990,1765],{"class":1184},[1163,4992,1939],{"class":1224},[1163,4994,2288],{"class":1239},[1163,4996,4997,4999,5001,5003,5005,5007,5009,5011],{"class":1165,"line":2354},[1163,4998,2293],{"class":1755},[1163,5000,1036],{"class":1224},[1163,5002,2316],{"class":1169},[1163,5004,1953],{"class":1224},[1163,5006,1765],{"class":1184},[1163,5008,2367],{"class":1188},[1163,5010,1765],{"class":1184},[1163,5012,2253],{"class":1224},[1163,5014,5015],{"class":1165,"line":2374},[1163,5016,2377],{"class":1224},[1163,5018,5019,5021,5023,5025,5027,5029,5031,5033,5035,5037,5039,5041,5043,5045,5047,5049,5051],{"class":1165,"line":2380},[1163,5020,2383],{"class":1740},[1163,5022,2218],{"class":1224},[1163,5024,2388],{"class":1169},[1163,5026,1953],{"class":1224},[1163,5028,2221],{"class":1755},[1163,5030,1015],{"class":1224},[1163,5032,1765],{"class":1184},[1163,5034,2281],{"class":1188},[1163,5036,1765],{"class":1184},[1163,5038,1939],{"class":1224},[1163,5040,2405],{"class":1239},[1163,5042,2408],{"class":1755},[1163,5044,2296],{"class":1239},[1163,5046,1804],{"class":1184},[1163,5048,2301],{"class":1188},[1163,5050,1765],{"class":1184},[1163,5052,2419],{"class":1224},[1163,5054,5055,5057,5059,5061],{"class":1165,"line":2422},[1163,5056,2425],{"class":1169},[1163,5058,1953],{"class":1224},[1163,5060,2221],{"class":1755},[1163,5062,2253],{"class":1224},[1163,5064,5065],{"class":1165,"line":2434},[1163,5066,2084],{"class":1224},[1163,5068,5069],{"class":1165,"line":2439},[1163,5070,1920],{"emptyLinePlaceholder":8},[1163,5072,5073],{"class":1165,"line":2444},[1163,5074,2447],{"class":1740},[1163,5076,5077],{"class":1165,"line":2450},[1163,5078,1438],{"class":1224},[1163,5080,5081],{"class":1165,"line":2455},[1163,5082,1920],{"emptyLinePlaceholder":8},[1163,5084,5085,5087,5089,5091,5093,5095,5097,5099,5101,5103,5105],{"class":1165,"line":2460},[1163,5086,2232],{"class":1942},[1163,5088,2465],{"class":2237},[1163,5090,2468],{"class":1239},[1163,5092,2471],{"class":1169},[1163,5094,1953],{"class":1224},[1163,5096,2221],{"class":1755},[1163,5098,1015],{"class":1224},[1163,5100,1765],{"class":1184},[1163,5102,2482],{"class":1188},[1163,5104,1765],{"class":1184},[1163,5106,2253],{"class":1224},[1163,5108,5109,5111,5113,5115,5117,5119,5121,5123,5125,5127,5129,5131,5133,5135],{"class":1165,"line":2489},[1163,5110,2262],{"class":1740},[1163,5112,2218],{"class":1224},[1163,5114,2496],{"class":1755},[1163,5116,2296],{"class":1239},[1163,5118,1804],{"class":1184},[1163,5120,2503],{"class":1188},[1163,5122,1765],{"class":1184},[1163,5124,2508],{"class":1239},[1163,5126,2465],{"class":1755},[1163,5128,2296],{"class":1239},[1163,5130,1804],{"class":1184},[1163,5132,2517],{"class":1188},[1163,5134,1765],{"class":1184},[1163,5136,2419],{"class":1224},[1163,5138,5139],{"class":1165,"line":2524},[1163,5140,2447],{"class":1740},[1163,5142,5143],{"class":1165,"line":2529},[1163,5144,1438],{"class":1224},[1163,5146,5147],{"class":1165,"line":2534},[1163,5148,1920],{"emptyLinePlaceholder":8},[1163,5150,5151,5153,5155,5157],{"class":1165,"line":2539},[1163,5152,2183],{"class":1169},[1163,5154,1953],{"class":1224},[1163,5156,2221],{"class":1755},[1163,5158,2253],{"class":1224},[1163,5160,5161,5163,5165,5167,5169],{"class":1165,"line":2550},[1163,5162,2553],{"class":1740},[1163,5164,2556],{"class":1169},[1163,5166,1953],{"class":1224},[1163,5168,2221],{"class":1755},[1163,5170,2253],{"class":1224},[1163,5172,5173,5175,5177,5179],{"class":1165,"line":2565},[1163,5174,2176],{"class":1169},[1163,5176,1953],{"class":1224},[1163,5178,2221],{"class":1755},[1163,5180,2253],{"class":1224},[1163,5182,5183],{"class":1165,"line":2576},[1163,5184,1819],{"class":1224},[2580,5186,5187],{},[813,5188,2584,5189,2587,5191,2591],{},[826,5190,1720],{},[826,5192,2590],{},[835,5194],{},[838,5196,2597,5197],{"id":2596},[826,5198,891],{},[813,5200,2602,5201,2605,5203,2608,5205,2612,5207,2615],{},[826,5202,832],{},[826,5204,891],{},[826,5206,2611],{},[826,5208,1212],{},[813,5210,2618,5211,2621],{},[826,5212,1018],{},[1072,5214,5215],{"className":1730,"code":2624,"filename":2625,"language":1733,"meta":1079,"style":1079},[826,5216,5217,5235,5239,5261,5279,5283,5289,5299,5313,5327,5341,5355,5363,5379,5411,5415,5419],{"__ignoreMap":1079},[1163,5218,5219,5221,5223,5225,5227,5229,5231,5233],{"class":1165,"line":1166},[1163,5220,1836],{"class":1740},[1163,5222,1839],{"class":1224},[1163,5224,832],{"class":1755},[1163,5226,1845],{"class":1224},[1163,5228,1848],{"class":1740},[1163,5230,1804],{"class":1184},[1163,5232,1913],{"class":1188},[1163,5234,1810],{"class":1184},[1163,5236,5237],{"class":1165,"line":1177},[1163,5238,1920],{"emptyLinePlaceholder":8},[1163,5240,5241,5243,5245,5247,5249,5251,5253,5255,5257,5259],{"class":1165,"line":1197},[1163,5242,1741],{"class":1740},[1163,5244,1744],{"class":1740},[1163,5246,2658],{"class":1169},[1163,5248,1953],{"class":1224},[1163,5250,2215],{"class":1942},[1163,5252,2218],{"class":1224},[1163,5254,2221],{"class":1935},[1163,5256,1939],{"class":1224},[1163,5258,1943],{"class":1942},[1163,5260,1280],{"class":1224},[1163,5262,5263,5265,5267,5269,5271,5273,5275,5277],{"class":1165,"line":1268},[1163,5264,2232],{"class":1942},[1163,5266,2679],{"class":2237},[1163,5268,2468],{"class":1239},[1163,5270,2684],{"class":1755},[1163,5272,1036],{"class":1224},[1163,5274,2689],{"class":1755},[1163,5276,1036],{"class":1224},[1163,5278,2694],{"class":1755},[1163,5280,5281],{"class":1165,"line":1283},[1163,5282,1920],{"emptyLinePlaceholder":8},[1163,5284,5285,5287],{"class":1165,"line":1304},[1163,5286,2703],{"class":1740},[1163,5288,1280],{"class":1224},[1163,5290,5291,5293,5295,5297],{"class":1165,"line":1321},[1163,5292,2710],{"class":1755},[1163,5294,1240],{"class":1759},[1163,5296,1243],{"class":1180},[1163,5298,1019],{"class":1224},[1163,5300,5301,5303,5305,5307,5309,5311],{"class":1165,"line":1338},[1163,5302,2721],{"class":1755},[1163,5304,1240],{"class":1759},[1163,5306,2679],{"class":1755},[1163,5308,1036],{"class":1224},[1163,5310,1105],{"class":1755},[1163,5312,1019],{"class":1224},[1163,5314,5315,5317,5319,5321,5323,5325],{"class":1165,"line":1359},[1163,5316,2736],{"class":1755},[1163,5318,1240],{"class":1759},[1163,5320,2679],{"class":1755},[1163,5322,1036],{"class":1224},[1163,5324,1098],{"class":1755},[1163,5326,1019],{"class":1224},[1163,5328,5329,5331,5333,5335,5337,5339],{"class":1165,"line":1380},[1163,5330,2751],{"class":1755},[1163,5332,1240],{"class":1759},[1163,5334,2679],{"class":1755},[1163,5336,1036],{"class":1224},[1163,5338,1326],{"class":1755},[1163,5340,1019],{"class":1224},[1163,5342,5343,5345,5347,5349,5351,5353],{"class":1165,"line":1400},[1163,5344,2766],{"class":1755},[1163,5346,1240],{"class":1759},[1163,5348,2679],{"class":1755},[1163,5350,1036],{"class":1224},[1163,5352,1422],{"class":1755},[1163,5354,1019],{"class":1224},[1163,5356,5357,5359,5361],{"class":1165,"line":1417},[1163,5358,2781],{"class":1755},[1163,5360,1240],{"class":1759},[1163,5362,1280],{"class":1224},[1163,5364,5365,5367,5369,5371,5373,5375,5377],{"class":1165,"line":1435},[1163,5366,2790],{"class":1755},[1163,5368,1240],{"class":1759},[1163,5370,2796],{"class":2795},[1163,5372,2799],{"class":1169},[1163,5374,2802],{"class":1224},[1163,5376,2805],{"class":1169},[1163,5378,2808],{"class":1224},[1163,5380,5381,5383,5385,5387,5389,5391,5393,5395,5397,5399,5401,5403,5405,5407,5409],{"class":1165,"line":1441},[1163,5382,2813],{"class":1755},[1163,5384,1240],{"class":1759},[1163,5386,1762],{"class":1224},[1163,5388,1765],{"class":1184},[1163,5390,2822],{"class":1188},[1163,5392,1765],{"class":1184},[1163,5394,1015],{"class":1224},[1163,5396,1765],{"class":1184},[1163,5398,2831],{"class":1188},[1163,5400,1765],{"class":1184},[1163,5402,1015],{"class":1224},[1163,5404,1765],{"class":1184},[1163,5406,2840],{"class":1188},[1163,5408,1765],{"class":1184},[1163,5410,2845],{"class":1224},[1163,5412,5413],{"class":1165,"line":2064},[1163,5414,2084],{"class":1224},[1163,5416,5417],{"class":1165,"line":2075},[1163,5418,1438],{"class":1224},[1163,5420,5421,5423,5425,5427,5429],{"class":1165,"line":2081},[1163,5422,2858],{"class":1224},[1163,5424,1765],{"class":1184},[1163,5426,1018],{"class":1188},[1163,5428,1765],{"class":1184},[1163,5430,2253],{"class":1224},[813,5432,2869],{},[1072,5434,5435],{"className":1156,"code":2872,"filename":1158,"language":1159,"meta":1079,"style":1079},[826,5436,5437,5443,5455],{"__ignoreMap":1079},[1163,5438,5439,5441],{"class":1165,"line":1166},[1163,5440,1170],{"class":1169},[1163,5442,1174],{"class":1173},[1163,5444,5445,5447,5449,5451,5453],{"class":1165,"line":1177},[1163,5446,1181],{"class":1180},[1163,5448,1185],{"class":1184},[1163,5450,1189],{"class":1188},[1163,5452,1192],{"class":1184},[1163,5454,1174],{"class":1173},[1163,5456,5457,5459,5461],{"class":1165,"line":1197},[1163,5458,1200],{"class":1184},[1163,5460,2899],{"class":1188},[1163,5462,1206],{"class":1184},[813,5464,2904],{},[835,5466],{},[838,5468,2910],{"id":2909},[813,5470,2913,5471,2916,5473,2919,5475,2922],{},[826,5472,1684],{},[826,5474,901],{},[826,5476,1098],{},[813,5478,2925,5479,1240],{},[826,5480,2928],{},[1072,5482,5483],{"className":1730,"code":2931,"filename":2932,"language":1733,"meta":1079,"style":1079},[826,5484,5485,5503,5507,5529,5551,5555,5573,5603,5607,5611,5629,5659,5663,5667,5685,5715,5719,5723,5741,5771,5775,5779,5785,5795,5823,5827],{"__ignoreMap":1079},[1163,5486,5487,5489,5491,5493,5495,5497,5499,5501],{"class":1165,"line":1166},[1163,5488,1836],{"class":1740},[1163,5490,1839],{"class":1224},[1163,5492,1684],{"class":1755},[1163,5494,1845],{"class":1224},[1163,5496,1848],{"class":1740},[1163,5498,1804],{"class":1184},[1163,5500,1913],{"class":1188},[1163,5502,1810],{"class":1184},[1163,5504,5505],{"class":1165,"line":1177},[1163,5506,1920],{"emptyLinePlaceholder":8},[1163,5508,5509,5511,5513,5515,5517,5519,5521,5523,5525,5527],{"class":1165,"line":1197},[1163,5510,1741],{"class":1740},[1163,5512,1744],{"class":1740},[1163,5514,2965],{"class":1169},[1163,5516,1953],{"class":1224},[1163,5518,2215],{"class":1942},[1163,5520,2218],{"class":1224},[1163,5522,2221],{"class":1935},[1163,5524,1939],{"class":1224},[1163,5526,1943],{"class":1942},[1163,5528,1280],{"class":1224},[1163,5530,5531,5533,5535,5537,5539,5541,5543,5545,5547,5549],{"class":1165,"line":1268},[1163,5532,2232],{"class":1942},[1163,5534,2986],{"class":2237},[1163,5536,2468],{"class":1239},[1163,5538,2684],{"class":1755},[1163,5540,1036],{"class":1224},[1163,5542,2689],{"class":1755},[1163,5544,1036],{"class":1224},[1163,5546,2999],{"class":1755},[1163,5548,3002],{"class":1224},[1163,5550,3005],{"class":1755},[1163,5552,5553],{"class":1165,"line":1283},[1163,5554,1920],{"emptyLinePlaceholder":8},[1163,5556,5557,5559,5561,5563,5565,5567,5569,5571],{"class":1165,"line":1304},[1163,5558,2262],{"class":1740},[1163,5560,2218],{"class":1224},[1163,5562,3018],{"class":1755},[1163,5564,2296],{"class":1239},[1163,5566,1804],{"class":1184},[1163,5568,1495],{"class":1188},[1163,5570,1765],{"class":1184},[1163,5572,2419],{"class":1224},[1163,5574,5575,5577,5579,5581,5583,5585,5587,5589,5591,5593,5595,5597,5599,5601],{"class":1165,"line":1321},[1163,5576,3033],{"class":1740},[1163,5578,1839],{"class":1224},[1163,5580,1234],{"class":1755},[1163,5582,1240],{"class":1759},[1163,5584,1243],{"class":1180},[1163,5586,1015],{"class":1224},[1163,5588,1273],{"class":1755},[1163,5590,1240],{"class":1759},[1163,5592,2684],{"class":1755},[1163,5594,1036],{"class":1224},[1163,5596,2689],{"class":1755},[1163,5598,1036],{"class":1224},[1163,5600,3058],{"class":1755},[1163,5602,3061],{"class":1224},[1163,5604,5605],{"class":1165,"line":1338},[1163,5606,1438],{"class":1224},[1163,5608,5609],{"class":1165,"line":1359},[1163,5610,1920],{"emptyLinePlaceholder":8},[1163,5612,5613,5615,5617,5619,5621,5623,5625,5627],{"class":1165,"line":1380},[1163,5614,2262],{"class":1740},[1163,5616,2218],{"class":1224},[1163,5618,3018],{"class":1755},[1163,5620,2296],{"class":1239},[1163,5622,1804],{"class":1184},[1163,5624,1564],{"class":1188},[1163,5626,1765],{"class":1184},[1163,5628,2419],{"class":1224},[1163,5630,5631,5633,5635,5637,5639,5641,5643,5645,5647,5649,5651,5653,5655,5657],{"class":1165,"line":1400},[1163,5632,3033],{"class":1740},[1163,5634,1839],{"class":1224},[1163,5636,1234],{"class":1755},[1163,5638,1240],{"class":1759},[1163,5640,1243],{"class":1180},[1163,5642,1015],{"class":1224},[1163,5644,1273],{"class":1755},[1163,5646,1240],{"class":1759},[1163,5648,2684],{"class":1755},[1163,5650,1036],{"class":1224},[1163,5652,2689],{"class":1755},[1163,5654,1036],{"class":1224},[1163,5656,3116],{"class":1755},[1163,5658,3061],{"class":1224},[1163,5660,5661],{"class":1165,"line":1417},[1163,5662,1438],{"class":1224},[1163,5664,5665],{"class":1165,"line":1435},[1163,5666,1920],{"emptyLinePlaceholder":8},[1163,5668,5669,5671,5673,5675,5677,5679,5681,5683],{"class":1165,"line":1441},[1163,5670,2262],{"class":1740},[1163,5672,2218],{"class":1224},[1163,5674,3018],{"class":1755},[1163,5676,2296],{"class":1239},[1163,5678,1804],{"class":1184},[1163,5680,1586],{"class":1188},[1163,5682,1765],{"class":1184},[1163,5684,2419],{"class":1224},[1163,5686,5687,5689,5691,5693,5695,5697,5699,5701,5703,5705,5707,5709,5711,5713],{"class":1165,"line":2064},[1163,5688,3033],{"class":1740},[1163,5690,1839],{"class":1224},[1163,5692,1234],{"class":1755},[1163,5694,1240],{"class":1759},[1163,5696,1243],{"class":1180},[1163,5698,1015],{"class":1224},[1163,5700,1273],{"class":1755},[1163,5702,1240],{"class":1759},[1163,5704,2684],{"class":1755},[1163,5706,1036],{"class":1224},[1163,5708,2689],{"class":1755},[1163,5710,1036],{"class":1224},[1163,5712,1586],{"class":1755},[1163,5714,3061],{"class":1224},[1163,5716,5717],{"class":1165,"line":2075},[1163,5718,1438],{"class":1224},[1163,5720,5721],{"class":1165,"line":2081},[1163,5722,1920],{"emptyLinePlaceholder":8},[1163,5724,5725,5727,5729,5731,5733,5735,5737,5739],{"class":1165,"line":2087},[1163,5726,2262],{"class":1740},[1163,5728,2218],{"class":1224},[1163,5730,3018],{"class":1755},[1163,5732,2296],{"class":1239},[1163,5734,1804],{"class":1184},[1163,5736,1542],{"class":1188},[1163,5738,1765],{"class":1184},[1163,5740,2419],{"class":1224},[1163,5742,5743,5745,5747,5749,5751,5753,5755,5757,5759,5761,5763,5765,5767,5769],{"class":1165,"line":2093},[1163,5744,3033],{"class":1740},[1163,5746,1839],{"class":1224},[1163,5748,1234],{"class":1755},[1163,5750,1240],{"class":1759},[1163,5752,1243],{"class":1180},[1163,5754,1015],{"class":1224},[1163,5756,1273],{"class":1755},[1163,5758,1240],{"class":1759},[1163,5760,2684],{"class":1755},[1163,5762,1036],{"class":1224},[1163,5764,2689],{"class":1755},[1163,5766,1036],{"class":1224},[1163,5768,1542],{"class":1755},[1163,5770,3061],{"class":1224},[1163,5772,5773],{"class":1165,"line":2309},[1163,5774,1438],{"class":1224},[1163,5776,5777],{"class":1165,"line":2332},[1163,5778,1920],{"emptyLinePlaceholder":8},[1163,5780,5781,5783],{"class":1165,"line":2354},[1163,5782,2703],{"class":1740},[1163,5784,1280],{"class":1224},[1163,5786,5787,5789,5791,5793],{"class":1165,"line":2374},[1163,5788,2710],{"class":1755},[1163,5790,1240],{"class":1759},[1163,5792,1243],{"class":1180},[1163,5794,1019],{"class":1224},[1163,5796,5797,5799,5801,5803,5805,5807,5809,5811,5813,5815,5817,5819,5821],{"class":1165,"line":2380},[1163,5798,3259],{"class":1755},[1163,5800,1240],{"class":1759},[1163,5802,2684],{"class":1755},[1163,5804,1036],{"class":1224},[1163,5806,2689],{"class":1755},[1163,5808,1036],{"class":1224},[1163,5810,3272],{"class":1755},[1163,5812,3275],{"class":1239},[1163,5814,2684],{"class":1755},[1163,5816,1036],{"class":1224},[1163,5818,2689],{"class":1755},[1163,5820,1036],{"class":1224},[1163,5822,3286],{"class":1755},[1163,5824,5825],{"class":1165,"line":2422},[1163,5826,1438],{"class":1224},[1163,5828,5829,5831,5833,5835,5837,5839,5841,5843,5845],{"class":1165,"line":2434},[1163,5830,2858],{"class":1224},[1163,5832,1765],{"class":1184},[1163,5834,1018],{"class":1188},[1163,5836,1765],{"class":1184},[1163,5838,1015],{"class":1224},[1163,5840,1765],{"class":1184},[1163,5842,1025],{"class":1188},[1163,5844,1765],{"class":1184},[1163,5846,2253],{"class":1224},[813,5848,3313,5849,3316,5851,3319,5853,3322],{},[826,5850,1018],{},[826,5852,1632],{},[826,5854,1025],{},[813,5856,3325,5857,3328],{},[826,5858,172],{},[1072,5860,5861],{"className":1730,"code":3331,"filename":3332,"language":1733,"meta":1079,"style":1079},[826,5862,5863,5881,5885,5897,5907,5915,5927,5947,5961,5975,6001,6017,6021,6025,6029,6049,6059,6067,6075,6087,6107,6111,6115],{"__ignoreMap":1079},[1163,5864,5865,5867,5869,5871,5873,5875,5877,5879],{"class":1165,"line":1166},[1163,5866,1836],{"class":1740},[1163,5868,1839],{"class":1224},[1163,5870,172],{"class":1755},[1163,5872,1845],{"class":1224},[1163,5874,1848],{"class":1740},[1163,5876,1804],{"class":1184},[1163,5878,3351],{"class":1188},[1163,5880,1810],{"class":1184},[1163,5882,5883],{"class":1165,"line":1177},[1163,5884,1920],{"emptyLinePlaceholder":8},[1163,5886,5887,5889,5891,5893,5895],{"class":1165,"line":1197},[1163,5888,1741],{"class":1740},[1163,5890,3364],{"class":1942},[1163,5892,3367],{"class":1942},[1163,5894,3370],{"class":1169},[1163,5896,3373],{"class":1224},[1163,5898,5899,5901,5903,5905],{"class":1165,"line":1268},[1163,5900,2703],{"class":1740},[1163,5902,3380],{"class":1740},[1163,5904,3383],{"class":1169},[1163,5906,3386],{"class":1224},[1163,5908,5909,5911,5913],{"class":1165,"line":1283},[1163,5910,3391],{"class":1755},[1163,5912,3394],{"class":1239},[1163,5914,3398],{"class":3397},[1163,5916,5917,5919,5921,5923,5925],{"class":1165,"line":1304},[1163,5918,3403],{"class":1755},[1163,5920,3394],{"class":1239},[1163,5922,3408],{"class":3397},[1163,5924,3411],{"class":1239},[1163,5926,3414],{"class":3397},[1163,5928,5929,5931,5933,5935,5937,5939,5941,5943,5945],{"class":1165,"line":1321},[1163,5930,3419],{"class":1224},[1163,5932,1765],{"class":1184},[1163,5934,3424],{"class":1188},[1163,5936,1765],{"class":1184},[1163,5938,1015],{"class":1224},[1163,5940,1765],{"class":1184},[1163,5942,901],{"class":1188},[1163,5944,1765],{"class":1184},[1163,5946,1958],{"class":1224},[1163,5948,5949,5951,5953,5955,5957,5959],{"class":1165,"line":1338},[1163,5950,3441],{"class":1755},[1163,5952,1240],{"class":1759},[1163,5954,1804],{"class":1184},[1163,5956,1297],{"class":1188},[1163,5958,1765],{"class":1184},[1163,5960,1019],{"class":1224},[1163,5962,5963,5965,5967,5969,5971,5973],{"class":1165,"line":1359},[1163,5964,3456],{"class":1755},[1163,5966,1240],{"class":1759},[1163,5968,1804],{"class":1184},[1163,5970,3463],{"class":1188},[1163,5972,1765],{"class":1184},[1163,5974,1019],{"class":1224},[1163,5976,5977,5979,5981,5983,5985,5987,5989,5991,5993,5995,5997,5999],{"class":1165,"line":1380},[1163,5978,3472],{"class":1755},[1163,5980,1240],{"class":1759},[1163,5982,3477],{"class":1315},[1163,5984,2047],{"class":1239},[1163,5986,2044],{"class":1315},[1163,5988,2047],{"class":1239},[1163,5990,2044],{"class":1315},[1163,5992,2047],{"class":1239},[1163,5994,2054],{"class":1315},[1163,5996,2047],{"class":1239},[1163,5998,2059],{"class":1315},[1163,6000,1019],{"class":1224},[1163,6002,6003,6005,6007,6009,6011,6013,6015],{"class":1165,"line":1400},[1163,6004,3500],{"class":1755},[1163,6006,1240],{"class":1759},[1163,6008,1762],{"class":1224},[1163,6010,1765],{"class":1184},[1163,6012,3509],{"class":1188},[1163,6014,1765],{"class":1184},[1163,6016,2845],{"class":1224},[1163,6018,6019],{"class":1165,"line":1417},[1163,6020,2090],{"class":1224},[1163,6022,6023],{"class":1165,"line":1435},[1163,6024,1444],{"class":1224},[1163,6026,6027],{"class":1165,"line":1441},[1163,6028,1920],{"emptyLinePlaceholder":8},[1163,6030,6031,6033,6035,6037,6039,6041,6043,6045,6047],{"class":1165,"line":2064},[1163,6032,1741],{"class":1740},[1163,6034,3364],{"class":1942},[1163,6036,3367],{"class":1942},[1163,6038,3536],{"class":1169},[1163,6040,1953],{"class":1224},[1163,6042,1098],{"class":1935},[1163,6044,1240],{"class":1239},[1163,6046,3545],{"class":3397},[1163,6048,2419],{"class":1224},[1163,6050,6051,6053,6055,6057],{"class":1165,"line":2075},[1163,6052,2703],{"class":1740},[1163,6054,3380],{"class":1740},[1163,6056,3383],{"class":1169},[1163,6058,3386],{"class":1224},[1163,6060,6061,6063,6065],{"class":1165,"line":2081},[1163,6062,3562],{"class":1755},[1163,6064,1240],{"class":1239},[1163,6066,3398],{"class":3397},[1163,6068,6069,6071,6073],{"class":1165,"line":2087},[1163,6070,3571],{"class":1755},[1163,6072,3394],{"class":1239},[1163,6074,3398],{"class":3397},[1163,6076,6077,6079,6081,6083,6085],{"class":1165,"line":2093},[1163,6078,3580],{"class":1755},[1163,6080,3394],{"class":1239},[1163,6082,3408],{"class":3397},[1163,6084,3411],{"class":1239},[1163,6086,3414],{"class":3397},[1163,6088,6089,6091,6093,6095,6097,6099,6101,6103,6105],{"class":1165,"line":2309},[1163,6090,3419],{"class":1224},[1163,6092,1765],{"class":1184},[1163,6094,3597],{"class":1188},[1163,6096,1765],{"class":1184},[1163,6098,1015],{"class":1224},[1163,6100,1765],{"class":1184},[1163,6102,901],{"class":1188},[1163,6104,1765],{"class":1184},[1163,6106,1958],{"class":1224},[1163,6108,6109],{"class":1165,"line":2332},[1163,6110,3614],{"class":1755},[1163,6112,6113],{"class":1165,"line":2354},[1163,6114,2090],{"class":1224},[1163,6116,6117],{"class":1165,"line":2374},[1163,6118,1444],{"class":1224},[813,6120,3625,6121,3628,6123,1143,6125,3633],{},[826,6122,1098],{},[826,6124,1101],{},[826,6126,1105],{},[813,6128,3636],{},[846,6130,6131,6139],{},[849,6132,6133],{},[852,6134,6135,6137],{},[855,6136,1478],{},[855,6138,3647],{},[868,6140,6141,6151,6161,6171,6181,6191],{},[852,6142,6143,6147],{},[873,6144,6145],{},[826,6146,1495],{},[873,6148,6149],{},[826,6150,3660],{},[852,6152,6153,6157],{},[873,6154,6155],{},[826,6156,1564],{},[873,6158,6159],{},[826,6160,3671],{},[852,6162,6163,6167],{},[873,6164,6165],{},[826,6166,1586],{},[873,6168,6169],{},[826,6170,3682],{},[852,6172,6173,6177],{},[873,6174,6175],{},[826,6176,1542],{},[873,6178,6179],{},[826,6180,3693],{},[852,6182,6183,6187],{},[873,6184,6185],{},[826,6186,1608],{},[873,6188,6189],{},[826,6190,3704],{},[852,6192,6193,6197],{},[873,6194,6195],{},[826,6196,1632],{},[873,6198,6199],{},[826,6200,3715],{},[835,6202],{},[838,6204,3721],{"id":3720},[813,6206,3724,6207,3727],{},[826,6208,891],{},[813,6210,6211,3732,6213,3735,6215,3738],{},[826,6212,1688],{},[826,6214,923],{},[826,6216,1094],{},[813,6218,3741],{},[835,6220],{},[838,6222,3747],{"id":3746},[813,6224,3750],{},[813,6226,3753,6227,3756],{},[826,6228,1094],{},[813,6230,3759,6231,3762],{},[826,6232,832],{},[3764,6234],{"to":446},[3764,6236],{"to":92},[3764,6238],{"to":219},[3771,6240,3773],{},{"title":1079,"searchDepth":1177,"depth":1177,"links":6242},[6243,6244,6245,6246,6247,6248,6249,6250,6251,6252],{"id":840,"depth":1177,"text":841},{"id":1062,"depth":1177,"text":1063},{"id":1117,"depth":1177,"text":1118},{"id":1449,"depth":1177,"text":1450},{"id":1674,"depth":1177,"text":1675},{"id":1713,"depth":1177,"text":1714},{"id":2596,"depth":1177,"text":3783},{"id":2909,"depth":1177,"text":2910},{"id":3720,"depth":1177,"text":3721},{"id":3746,"depth":1177,"text":3747},{},{"title":69,"description":3788},[38,445,3797],1780436274119]