[{"data":1,"prerenderedAt":9},["ShallowReactive",2],{"code:bash:ic80t9":3,"code:txt:10cdhlo":4,"code:bash:1mlzjls":5,"code:go:3k2n0d":6,"code:rust:t7yrf6":7,"code:ts:1ytg3lo":8},"\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\"># DO NOT DO THIS IN PRODUCTION!\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">curl\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -fsSL\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -H\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Authorization: Bearer ${KEY}\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string)\">  -o\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> \u002Fvar\u002Flib\u002Fipscope\u002Fipscope-complete.mmdb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">  \"https:\u002F\u002Fapi.ipscope.io\u002Fv1\u002Fmmdb\u002Freleases\u002Flatest\u002Fdownload?format=mmdb\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>BEFORE RENAME:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  Directory Entry: \"ipscope-complete.mmdb\"  --->  [ Inode #40112 (141 MB, Old Snapshot) ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>                                                        ^\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>                                                        | (Active mmap VMA)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>                                                  [ Live Go\u002FRust\u002FNGINX Workers ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>STEP 1: Stage &#x26; Verify New File on the SAME Filesystem Mount:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  Directory Entry: \".stage.ipscope.9a8f12\"  --->  [ Inode #88304 (142 MB, New Snapshot) ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>STEP 2: Atomic rename(\".stage.ipscope.9a8f12\", \"ipscope-complete.mmdb\"):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  Directory Entry: \"ipscope-complete.mmdb\"  --->  [ Inode #88304 (142 MB, New Snapshot) ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  Meanwhile, Inode #40112 (Old Snapshot) has link_count = 0 on disk,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  but its kernel reference count > 0 because live workers still hold the old mmap!\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>  Inode #40112 remains 100% intact in the OS page cache until the last worker calls munmap().\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">#!\u002Fusr\u002Fbin\u002Fenv bash\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">set\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -euo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> pipefail\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">DB_DIR\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"${IPSCOPE_DB_DIR\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:-\u002F\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">var\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">lib\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">\u002F\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">ipscope}\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">DB_FILENAME\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"${IPSCOPE_DB_FILENAME\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:-\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">ipscope-complete.mmdb}\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">TARGET\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"${DB_DIR}\u002F${DB_FILENAME}\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">ETAG_FILE\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"${DB_DIR}\u002F.${DB_FILENAME}.etag\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">API_BASE\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"${IPSCOPE_API_BASE\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:-\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">https\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u002F\u002F\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">api.ipscope.io}\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">-z\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"${IPSCOPE_DOWNLOAD_KEY\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:-\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">}\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ]; \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  echo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"ERROR: IPSCOPE_DOWNLOAD_KEY environment variable is not set\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> >&#x26;2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  exit\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">mkdir\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -p\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$DB_DIR\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\"># Create temporary staging inode in the SAME directory as TARGET\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">STAGE\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">mktemp\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"${DB_DIR}\u002F.stage.${DB_FILENAME}.XXXXXX\")\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">ETAG_TMP\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">mktemp\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"${DB_DIR}\u002F.etag.${DB_FILENAME}.XXXXXX\")\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">cleanup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">()\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  rm\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -f\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$STAGE\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$ETAG_TMP\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">trap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> cleanup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> EXIT\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">CURL_ETAG_ARGS\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">-f\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$ETAG_FILE\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ] \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">&#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">-f\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$TARGET\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ]; \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  CURL_ETAG_ARGS\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\">--etag-compare\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$ETAG_FILE\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\"># 1. Download artifact with conditional ETag support\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">HTTP_STATUS\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">curl\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -sS\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -L\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -w\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"%{http_code}\" \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string)\">  --retry\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> --retry-delay\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 2\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> --max-time\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 300\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string)\">  -H\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Authorization: Bearer ${IPSCOPE_DOWNLOAD_KEY}\" \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">  \"${CURL_ETAG_ARGS[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">@\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">]}\" \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string)\">  --etag-save\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$ETAG_TMP\" \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string)\">  -o\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$STAGE\" \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">  \"${API_BASE}\u002Fv1\u002Fmmdb\u002Freleases\u002Flatest\u002Fdownload?format=mmdb\")\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$HTTP_STATUS\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"304\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ]; \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  echo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"[ipscope-sync] Local ${DB_FILENAME} is already up to date (HTTP 304).\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  exit\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$HTTP_STATUS\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> !=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"200\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ]; \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  echo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"ERROR: Download failed with HTTP status ${HTTP_STATUS}\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> >&#x26;2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  exit\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\"># 2. Fetch and verify cryptographic SHA-256 digest\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">EXPECTED_SHA256\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">curl\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -fsSL\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string)\">  --retry\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> --max-time\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 30\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string)\">  -H\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"Authorization: Bearer ${IPSCOPE_DOWNLOAD_KEY}\" \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">  \"${API_BASE}\u002Fv1\u002Fmmdb\u002Freleases\u002Flatest\u002Fchecksums?format=text\" \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  |\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> awk\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> '\u002F\\.mmdb$\u002F {print $1; exit}')\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">-z\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$EXPECTED_SHA256\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ]; \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  echo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"ERROR: Could not parse .mmdb SHA-256 from checksums endpoint\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> >&#x26;2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  exit\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> command\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -v\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> sha256sum\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> >\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\">\u002Fdev\u002Fnull\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> 2>&#x26;1\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">; \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  ACTUAL_SHA256\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">sha256sum\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$STAGE\" \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">|\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> awk\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> '{print $1}')\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">else\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  ACTUAL_SHA256\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">shasum\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -a\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 256\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$STAGE\" \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">|\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> awk\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> '{print $1}')\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> [ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"$ACTUAL_SHA256\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> !=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$EXPECTED_SHA256\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ]; \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">then\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  echo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"ERROR: SHA-256 mismatch! expected=${EXPECTED_SHA256} actual=${ACTUAL_SHA256}\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> >&#x26;2\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">  exit\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">fi\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\"># 3. Flush staging inode pages to disk, set permissions, and perform atomic POSIX rename(2)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">chmod\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0644\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$STAGE\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">sync\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$STAGE\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">mv\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -f\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$STAGE\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$TARGET\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">mv\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string)\"> -f\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$ETAG_TMP\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"$ETAG_FILE\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">echo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"[ipscope-sync] Atomically promoted new ${DB_FILENAME} (sha256=${ACTUAL_SHA256}).\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">package\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> ipdb\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"fmt\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"net\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"os\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"sync\u002Fatomic\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"syscall\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"time\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"github.com\u002Foschwald\u002Fmaxminddb-golang\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">type\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> readerSnapshot\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> struct\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\treader \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">maxminddb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Reader\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tinode  \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">uint64\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">type\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> AtomicMMDB\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> struct\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tpath    \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">string\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tcurrent \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">atomic\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Pointer\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">readerSnapshot\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">func\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> fileInode\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(path \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">uint64\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">error\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tinfo, err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> os.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Stat\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(path)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, err\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> stat, ok \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> info.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Sys\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">().(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">syscall\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Stat_t\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">); ok {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> stat.Ino, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">nil\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> uint64\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(info.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ModTime\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">().\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">UnixNano\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()), \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">nil\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">func\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> NewAtomicMMDB\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(path \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">AtomicMMDB\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">error\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tino, err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> fileInode\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(path)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, fmt.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Errorf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"stat mmdb: \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%w\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, err)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tr, err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> maxminddb.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Open\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(path)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, fmt.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Errorf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"open mmdb: \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%w\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, err)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">\t\u002F\u002F Canary sanity check before accepting reader\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tvar\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> probe \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">map\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">]\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">any\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> r.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Lookup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(net.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ParseIP\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"1.1.1.1\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">), \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">probe); err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t_ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> r.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Close\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, fmt.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Errorf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"canary lookup failed: \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%w\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, err)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tm \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> &#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">AtomicMMDB\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">{path: path}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tm.current.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Store\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">readerSnapshot\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">{reader: r, inode: ino})\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> m, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">nil\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">\u002F\u002F ReloadIfInodeChanged checks whether the target path points to a new inode.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">\u002F\u002F If so, it opens the new mmap, validates a canary IP, atomically swaps the pointer,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">\u002F\u002F and drains the old mmap after a 10-second grace period.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">func\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (m \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">AtomicMMDB\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ReloadIfInodeChanged\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">() (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">bool\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">error\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tnewInode, err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> fileInode\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(m.path)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, err\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tcur \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> m.current.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Load\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> cur \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> cur.inode \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">==\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> newInode {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-comment)\"> \u002F\u002F Same inode, nothing to reload\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tnextReader, err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> maxminddb.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Open\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(m.path)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, fmt.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Errorf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"open new mmdb inode: \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%w\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, err)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">\t\u002F\u002F Canary lookup on new reader before exposing it to live traffic\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tvar\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> canary \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">map\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">]\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">any\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> nextReader.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Lookup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(net.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ParseIP\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"1.1.1.1\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">), \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">canary); err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t_ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> nextReader.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Close\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> false\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, fmt.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Errorf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"new mmdb failed canary check: \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%w\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, err)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tprev \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> m.current.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Swap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">readerSnapshot\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\treader: nextReader,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\tinode:  newInode,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t})\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> prev \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> &#x26;&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> prev.reader \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\tgo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> func\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(old \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">maxminddb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">\t\t\t\u002F\u002F Allow all in-flight sub-microsecond lookups on the old pointer to complete\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\ttime.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Sleep\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">10\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> *\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> time.Second)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\t_ \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> old.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Close\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t}(prev.reader)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> true\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">nil\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">\u002F\u002F Lookup executes on the hot path with zero locks and zero allocations.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">func\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (m \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">AtomicMMDB\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Lookup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ip \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">net\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">IP\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, result \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">any\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">error\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> m.current.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Load\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">().reader.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Lookup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ip, result)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> arc_swap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">ArcSwap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> maxminddb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> memmap2\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Mmap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> serde\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">de\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">DeserializeOwned\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> std\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">net\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">IpAddr\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> std\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">{\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">PathBuf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">};\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">use\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> std\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">sync\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Arc\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">pub\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> struct\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> HotReloadMmdb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> PathBuf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> ArcSwap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Mmap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>>,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">impl\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> HotReloadMmdb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    pub\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> fn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> open\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> impl\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> AsRef\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Result\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;Self, maxminddb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">MaxMindDBError\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> path_buf \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">as_ref\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">to_path_buf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> initial \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">open_mmap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">path_buf)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">        Ok\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(Self {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">            path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> path_buf,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">            reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> ArcSwap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">from_pointee\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(initial),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        })\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">    \u002F\u002F\u002F Atomically swaps in a freshly memory-mapped `.mmdb` reader.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">    \u002F\u002F\u002F Any thread currently executing `lookup()` holds an `Arc` guard to the old\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">    \u002F\u002F\u002F `Reader&#x3C;Mmap>`, so the old `Mmap` is unmapped automatically the instant\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">    \u002F\u002F\u002F the last in-flight lookup guard drops!\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    pub\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> fn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> reload\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">self) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Result\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;(), maxminddb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">MaxMindDBError\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> next_reader \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">open_mmap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">self\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">path)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">        \u002F\u002F Validate canary lookup before swapping\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> canary_ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> IpAddr\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"1.1.1.1\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">parse\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">unwrap\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> _\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Option\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;serde_json\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Value\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">> \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> next_reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">lookup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(canary_ip)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        self\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">store\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(Arc\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(next_reader));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">        Ok\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(())\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    #[inline]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    pub\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> fn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> lookup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> DeserializeOwned\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        &#x26;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">self,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> IpAddr\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    ) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Result\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Option\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>, maxminddb\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">MaxMindDBError\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> guard \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> self\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">load\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        guard\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">lookup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">::\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>(ip)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> maxmind\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> { \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">type\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> Reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> type\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> Response } \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">from\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> 'maxmind'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">export\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> class\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> HotReloadMmdbReader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Response\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  private\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  private\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> readonly\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> dbPath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  private\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> constructor\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(dbPath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> initialReader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">    this\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.dbPath \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> dbPath;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">    this\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.reader \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> initialReader;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  public\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> static\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> open\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Response\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>(dbPath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Promise\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">HotReloadMmdbReader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> initial\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> await\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> maxmind\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.open\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>(dbPath);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    return\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> HotReloadMmdbReader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>(dbPath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> initial);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  public\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> reload\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Promise\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">void\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nextReader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> await\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> maxmind\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.open\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">this\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.dbPath);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">    \u002F\u002F Validate canary lookup before replacing live reference\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">    nextReader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.get\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">'1.1.1.1'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">    this\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.reader \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> nextReader;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  public\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> lookup\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> T\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> |\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> null\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    return\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> this\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">reader\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.get\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ip);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",1793226491957]