PageSourceSearch

https://iotauth.github.io/assets/js/b5c5fee4.66bc6daa.js

js iotauth.github.io collected 2026-10-03 09:21:33 UTC 18,963 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkiotauth_github_io=self.webpackChunkiotauth_github_io||[]).push([[888],{9664(e,s,i){i.r(s),i.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>a,frontMatter:()=>d,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"capabilities-map","title":"Entity Capabilities","description":"Overview","source":"@site/docs/capabilities-map.md","sourceDirName":".","slug":"/capabilities-map","permalink":"/docs/capabilities-map","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"capabilities-map","title":"Entity Capabilities","sidebar_label":"Entity Capabilities"},"sidebar":"docs","previous":{"title":"Python Guide","permalink":"/docs/python-guide"},"next":{"title":"C API Reference","permalink":"/docs/c-api-reference"}}');var n=i(4848),c=i(8453);const d={id:"capabilities-map",title:"Entity Capabilities",sidebar_label:"Entity Capabilities"},t="Entity Capabilities",l={},o=[{value:"Overview",id:"overview",level:2},{value:"Main secure communication capabilities",id:"main-secure-communication-capabilities",level:2},{value:"Repository example configuration tooling",id:"repository-example-configuration-tooling",level:2},{value:"Advanced capability support",id:"advanced-capability-support",level:2},{value:"Practical guidance",id:"practical-guidance",level:2}];function h(e){const s={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,c.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.header,{children:(0,n.jsx)(s.h1,{id:"entity-capabilities",children:"Entity Capabilities"})}),"\n",(0,n.jsx)(s.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsx)(s.p,{children:"This page compares SST capabilities across the entity APIs so you can choose the right implementation path and translate concepts between C, C++, Node.js, and Python."}),"\n",(0,n.jsx)(s.p,{children:"SST exposes the same core ideas through different entity APIs, but the language support and design paradigms vary across platforms. Use this map to choose the right API surface and to translate concepts between C, C++, Node.js, and Python."}),"\n",(0,n.jsx)(s.h2,{id:"main-secure-communication-capabilities",children:"Main secure communication capabilities"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Responsibility"}),(0,n.jsx)(s.th,{children:"C API"}),(0,n.jsx)(s.th,{children:"C++ API"}),(0,n.jsx)(s.th,{children:"Node.js API"}),(0,n.jsx)(s.th,{children:"Python API"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Load entity config"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"c-api-reference#init_sst",children:(0,n.jsx)(s.code,{children:"init_SST()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"cpp-api-reference#construction",children:(0,n.jsx)(s.code,{children:"SST_API(config_path)"})})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.a,{href:"nodejs-api-reference#constructor",children:(0,n.jsx)(s.code,{children:"new SecureCommClient(config)"})}),", ",(0,n.jsx)(s.a,{href:"nodejs-api-reference#constructor-1",children:(0,n.jsx)(s.code,{children:"new SecureCommServer(config)"})})]}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"python-api-reference#iotauthcontextfrom_config",children:(0,n.jsx)(s.code,{children:"IoTAuthContext.from_config(config)"})})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Initialize runtime state"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"init_SST()"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"SST_API(config_path)"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"initialize()"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"IoTAuthContext.from_config()"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Request session keys"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"c-api-reference#get_session_key",children:(0,n.jsx)(s.code,{children:"get_session_key()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"cpp-api-reference#request-session-keys",children:(0,n.jsx)(s.code,{children:"SST_API::get_session_key()"})})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"getSessionKeysForCaching(n)"})," or implicit via ",(0,n.jsx)(s.code,{children:"provideInput('serverHostPort', ...)"})]}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"python-api-reference#iotauthcontextrequest_session_keys",children:(0,n.jsx)(s.code,{children:"ctx.request_session_keys()"})})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Client secure handshake"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"c-api-reference#secure_connect_to_server",children:(0,n.jsx)(s.code,{children:"secure_connect_to_server()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"cpp-api-reference#establish-a-secure-session",children:(0,n.jsx)(s.code,{children:"SST_API::secure_connect_to_server()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"provideInput('serverHostPort', {host, port})"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"python-api-reference#connect",children:(0,n.jsx)(s.code,{children:"SecureClient.connect()"})})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Server secure handshake"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"c-api-reference#server_secure_comm_setup",children:(0,n.jsx)(s.code,{children:"server_secure_comm_setup()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"cpp-api-reference#establish-a-secure-session",children:(0,n.jsx)(s.code,{children:"SST_API::server_secure_comm_setup()"})})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"initialize()"})," plus ",(0,n.jsx)(s.code,{children:"setOutputHandler('received', ...)"})]}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"python-api-reference#serve_once",children:(0,n.jsx)(s.code,{children:"SecureServer.serve_once()"})})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Send encrypted data"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"c-api-reference#send_secure_message",children:(0,n.jsx)(s.code,{children:"send_secure_message()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"cpp-api-reference#send-and-receive",children:(0,n.jsx)(s.code,{children:"SST_Session::send_secure_message()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"provideInput('toSend', Buffer)"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"python-api-reference#send",children:(0,n.jsx)(s.code,{children:"channel.send(payload)"})})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Receive decrypted data"}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"c-api-reference#read_secure_message",children:(0,n.jsx)(s.code,{children:"read_secure_message()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"cpp-api-reference#send-and-receive",children:(0,n.jsx)(s.code,{children:"SST_Session::read_secure_message()"})})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"setOutputHandler('received', handler)"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"python-api-reference#recv",children:(0,n.jsx)(s.code,{children:"channel.recv()"})})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Threaded receive loop"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"receive_thread_read_one_each()"})," with ",(0,n.jsx)(s.code,{children:"pthread_create"})]}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"SST_Session::receive_loop()"})," in an application-owned thread"]}),(0,n.jsx)(s.td,{children:"Not needed \u2014 Node.js is event-driven"}),(0,n.jsxs)(s.td,{children:["Synchronous ",(0,n.jsx)(s.code,{children:"channel.recv()"}),"; application-managed threads if needed"]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Encrypt/decrypt buffers without socket"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.a,{href:"c-api-reference#encrypt_buf_with_session_key",children:(0,n.jsx)(s.code,{children:"encrypt_buf_with_session_key()"})}),", ",(0,n.jsx)(s.code,{children:"_without_malloc"})," variants"]}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.a,{href:"cpp-api-reference#encrypt-or-decrypt-a-buffer",children:(0,n.jsx)(s.code,{children:"SST_API::encrypt/decrypt_buf_with_session_key()"})})}),(0,n.jsx)(s.td,{children:"No direct equivalent"}),(0,n.jsxs)(s.td,{children:[(0,n.jsxs)(s.a,{href:"python-api-reference#buffer-cryptography",children:[(0,n.jsx)(s.code,{children:"symmetric_encrypt_authenticate()"})," / ",(0,n.jsx)(s.code,{children:"symmetric_decrypt_authenticate()"})]})," in ",(0,n.jsx)(s.code,{children:"iotauth.crypto"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Cache session keys"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"session_key_list_t"})," + ",(0,n.jsx)(s.code,{children:"get_session_key()"})]}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"SessionKeyList"})}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"getSessionKeysForCaching()"})," / ",(0,n.jsx)(s.code,{children:"getSessionKeysForFutureClients()"})]}),(0,n.jsxs)(s.td,{children:["Internal ",(0,n.jsx)(s.code,{children:"SessionKeyCache"})," inside ",(0,n.jsx)(s.code,{children:"IoTAuthContext"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Persist session keys to disk"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.a,{href:"c-api-reference#save_session_key_list",children:(0,n.jsx)(s.code,{children:"save_session_key_list()"})}),", ",(0,n.jsx)(s.code,{children:"_with_password"})," variants"]}),(0,n.jsx)(s.td,{children:"No public save/load API"}),(0,n.jsx)(s.td,{children:"Not documented"}),(0,n.jsx)(s.td,{children:"Not documented / runtime-oriented"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Free runtime resources"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"close()"})," socket, then ",(0,n.jsx)(s.code,{children:"free_session_ctx()"}),", ",(0,n.jsx)(s.code,{children:"free_session_key_list_t()"}),", ",(0,n.jsx)(s.code,{children:"free_SST_ctx_t()"})]}),(0,n.jsx)(s.td,{children:"RAII; shut down sessions and join receiver threads before destruction"}),(0,n.jsxs)(s.td,{children:["JavaScript garbage collection; close connections via ",(0,n.jsx)(s.code,{children:"provideInput"})]}),(0,n.jsxs)(s.td,{children:["Context managers (",(0,n.jsx)(s.code,{children:"with SecureClient(ctx):"}),", ",(0,n.jsx)(s.code,{children:"channel.close()"}),")"]})]})]})]}),"\n",(0,n.jsx)(s.h2,{id:"repository-example-configuration-tooling",children:"Repository example configuration tooling"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Responsibility"}),(0,n.jsx)(s.th,{children:"Source"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Define example Auths and entities"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:".graph"})," file"]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Generate example credentials"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"examples/credentialGenerator.js"})," via ",(0,n.jsx)(s.code,{children:"generateAll.sh"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Generate example Auth properties"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"examples/authConfigGenerator.js"})," via ",(0,n.jsx)(s.code,{children:"generateAll.sh"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Generate example Auth databases"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"examples/authDBGenerator.js"})," via ",(0,n.jsx)(s.code,{children:"generateAll.sh"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Generate Node.js example configs"}),(0,n.jsxs)(s.td,{children:[(0,n.jsx)(s.code,{children:"examples/entityConfigGenerator.js"})," via ",(0,n.jsx)(s.code,{children:"generateAll.sh"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Provide Python example configs"}),(0,n.jsx)(s.td,{children:"No dedicated generator. Use the checked-in Python properties fixtures, adapt a C properties fixture, or use a generated Node JSON config."})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Provide C/C++ example configs"}),(0,n.jsx)(s.td,{children:"Checked-in properties fixtures under the C example directories; C++ examples reuse them."})]})]})]}),"\n",(0,n.jsx)(s.h2,{id:"advanced-capability-support",children:"Advanced capability support"}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Capability"}),(0,n.jsx)(s.th,{children:"C"}),(0,n.jsx)(s.th,{children:"C++"}),(0,n.jsx)(s.th,{children:"Node.js"}),(0,n.jsx)(s.th,{children:"Python"})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Direct secure client/server communication"}),(0,n.jsx)(s.td,{children:"Yes"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"SST_API"}),", ",(0,n.jsx)(s.code,{children:"SST_Session"}),")"]}),(0,n.jsx)(s.td,{children:"Yes"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"SecureClient"}),", ",(0,n.jsx)(s.code,{children:"SecureServer"}),")"]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Publisher/subscriber accessors"}),(0,n.jsx)(s.td,{children:"Not a primary path"}),(0,n.jsx)(s.td,{children:"No direct equivalent"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"SecurePublisher"}),", ",(0,n.jsx)(s.code,{children:"SecureSubscriber"}),")"]}),(0,n.jsx)(s.td,{children:"No direct equivalent"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Delegation and privilege operations"}),(0,n.jsx)(s.td,{children:"Not a primary path"}),(0,n.jsx)(s.td,{children:"No direct equivalent"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"performPrivilege"}),", ",(0,n.jsx)(s.code,{children:"getSessionKeyIdForGrantAccess"}),")"]}),(0,n.jsx)(s.td,{children:"Not currently documented"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Migration to backup Auth"}),(0,n.jsx)(s.td,{children:"Not a primary path"}),(0,n.jsx)(s.td,{children:"No direct equivalent"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"migrateToTrustedAuth"}),", ",(0,n.jsx)(s.code,{children:"migrationEnabled"})," parameter)"]}),(0,n.jsx)(s.td,{children:"Not currently documented"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Per-resource session key requests"}),(0,n.jsx)(s.td,{children:"Not a primary path"}),(0,n.jsx)(s.td,{children:"No dedicated accessor"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"provideInputResource"}),")"]}),(0,n.jsx)(s.td,{children:"Not currently documented"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Block-based file encryption"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"examples/file_block_encrypt_example/"}),")"]}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"cpp/examples/file_block_encrypt_example/"}),")"]}),(0,n.jsx)(s.td,{children:"No direct equivalent"}),(0,n.jsx)(s.td,{children:"No direct equivalent"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"IPFS file encryption/upload/download"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"src/ipfs.h"}),", ",(0,n.jsx)(s.code,{children:"examples/ipfs_examples/"}),")"]}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"sst::ipfs"}),", ",(0,n.jsx)(s.code,{children:"cpp/examples/ipfs_examples/"}),")"]}),(0,n.jsx)(s.td,{children:"No direct equivalent"}),(0,n.jsxs)(s.td,{children:["Secure File System Manager in ",(0,n.jsx)(s.code,{children:"examples/file_sharing/"}),"; no IPFS client helpers in the package"]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Session key persistence to disk"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"save_session_key_list"}),", ",(0,n.jsx)(s.code,{children:"load_session_key_list"}),")"]}),(0,n.jsx)(s.td,{children:"No public save/load API"}),(0,n.jsx)(s.td,{children:"Not documented"}),(0,n.jsx)(s.td,{children:"Not documented"})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Password-protected key storage"}),(0,n.jsxs)(s.td,{children:["Yes (",(0,n.jsx)(s.code,{children:"save/load_session_key_list_with_password"}),")"]}),(0,n.jsx)(s.td,{children:"No public save/load API"}),(0,n.jsx)(s.td,{children:"Not documented"}),(0,n.jsx)(s.td,{children:"Not documented"})]})]})]}),"\n",(0,n.
1jsx)(s.h2,{id:"practical-guidance",children:"Practical guidance"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Use ",(0,n.jsx)(s.strong,{children:"C"})," when building embedded or native entities, when you need explicit socket and memory control, or when you need file and IPFS encryption capabilities. Source: ",(0,n.jsx)(s.a,{href:"https://github.com/iotauth/sst-c-api",children:"sst-c-api"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Use ",(0,n.jsx)(s.strong,{children:"C++"})," for native C++17 entities with automatic resource cleanup, session classes, and IPFS helpers. See the ",(0,n.jsx)(s.a,{href:"cpp-guide",children:"C++ Guide"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Use ",(0,n.jsx)(s.strong,{children:"Node.js"})," when building gateways, scripts, demonstrations, or services where event callbacks are natural; or when you need publish/subscribe, delegation, or automatic Auth migration. Source: ",(0,n.jsx)(s.code,{children:"entity/node/"})," in ",(0,n.jsx)(s.a,{href:"https://github.com/iotauth/iotauth",children:"iotauth/iotauth"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Use ",(0,n.jsx)(s.strong,{children:"Python"})," when building servers, clients, scripts, or services using modern object-oriented Python wrappers (",(0,n.jsx)(s.code,{children:"SecureClient"}),", ",(0,n.jsx)(s.code,{children:"SecureServer"}),", and ",(0,n.jsx)(s.code,{children:"IoTAuthContext"}),"), or for File System Manager workflows. Source: ",(0,n.jsx)(s.code,{children:"entity/python/"})," in ",(0,n.jsx)(s.a,{href:"https://github.com/iotauth/iotauth",children:"iotauth/iotauth"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["For the repository examples, use the ",(0,n.jsx)(s.code,{children:".graph"})," file and ",(0,n.jsx)(s.code,{children:"generateAll.sh"})," to generate credentials, Auth configuration, Auth databases, and Node entity configs."]}),"\n",(0,n.jsx)(s.li,{children:"For the repository Python examples, choose a checked-in or adapted properties config or a generated Node JSON config, then verify its credential paths."}),"\n"]})]})}function a(e={}){const{wrapper:s}={...(0,c.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8453(e,s,i){i.d(s,{R:()=>d,x:()=>t});var r=i(6540);const n={},c=r.createContext(n);function d(e){const s=r.useContext(c);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:d(e.components),r.createElement(c.Provider,{value:s},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.