This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git
The following commit(s) were added to refs/heads/gh-pages by this push:
new b6497782 deploy: dc349284a4204c1a56af47fb3177ace6f9e899a0
b6497782 is described below
commit b6497782f2da4756868069d7a11e0528c51f1604
Author: liurenjie1024 <[email protected]>
AuthorDate: Mon Sep 29 11:01:53 2025 +0000
deploy: dc349284a4204c1a56af47fb3177ace6f9e899a0
---
api/src/iceberg_catalog_rest/client.rs.html | 208 ++++++++++++++--------------
1 file changed, 102 insertions(+), 106 deletions(-)
diff --git a/api/src/iceberg_catalog_rest/client.rs.html
b/api/src/iceberg_catalog_rest/client.rs.html
index 06a2e308..b96158db 100644
--- a/api/src/iceberg_catalog_rest/client.rs.html
+++ b/api/src/iceberg_catalog_rest/client.rs.html
@@ -193,111 +193,107 @@
<a href=#193 id=193 data-nosnippet>193</a> <span
class="prelude-val">Ok</span>(())
<a href=#194 id=194 data-nosnippet>194</a> }
<a href=#195 id=195 data-nosnippet>195</a>
-<a href=#196 id=196 data-nosnippet>196</a> <span class="doccomment">///
Authenticate the request by filling token.
+<a href=#196 id=196 data-nosnippet>196</a> <span class="doccomment">///
Authenticates the request by adding a bearer token to the authorization header.
<a href=#197 id=197 data-nosnippet>197</a> ///
-<a href=#198 id=198 data-nosnippet>198</a> /// - If neither token nor
credential is provided, this method will do nothing.
-<a href=#199 id=199 data-nosnippet>199</a> /// - If only credential is
provided, this method will try to fetch token from the server.
-<a href=#200 id=200 data-nosnippet>200</a> /// - If token is provided, this
method will use the token directly.
-<a href=#201 id=201 data-nosnippet>201</a> ///
-<a href=#202 id=202 data-nosnippet>202</a> /// # TODO
+<a href=#198 id=198 data-nosnippet>198</a> /// This method supports three
authentication modes:
+<a href=#199 id=199 data-nosnippet>199</a> ///
+<a href=#200 id=200 data-nosnippet>200</a> /// 1. **No authentication** -
Skip authentication when both `credential` and `token` are missing.
+<a href=#201 id=201 data-nosnippet>201</a> /// 2. **Token authentication**
- Use the provided `token` directly for authentication.
+<a href=#202 id=202 data-nosnippet>202</a> /// 3. **OAuth authentication**
- Exchange `credential` for a token, cache it, then use it for authentication.
<a href=#203 id=203 data-nosnippet>203</a> ///
-<a href=#204 id=204 data-nosnippet>204</a> /// Support refreshing token
while needed.
-<a href=#205 id=205 data-nosnippet>205</a> </span><span class="kw">async fn
</span>authenticate(<span class="kw-2">&</span><span
class="self">self</span>, req: <span class="kw-2">&mut </span>Request)
-> <span class="prelude-ty">Result</span><()> {
-<a href=#206 id=206 data-nosnippet>206</a> <span class="comment">//
Clone the token from lock without holding the lock for entire function.
-<a href=#207 id=207 data-nosnippet>207</a> </span><span class="kw">let
</span>token = <span class="self">self</span>.token.lock().<span
class="kw">await</span>.clone();
-<a href=#208 id=208 data-nosnippet>208</a>
-<a href=#209 id=209 data-nosnippet>209</a> <span class="kw">if
</span><span class="self">self</span>.credential.is_none() &&
token.is_none() {
-<a href=#210 id=210 data-nosnippet>210</a> <span class="kw">return
</span><span class="prelude-val">Ok</span>(());
-<a href=#211 id=211 data-nosnippet>211</a> }
-<a href=#212 id=212 data-nosnippet>212</a>
-<a href=#213 id=213 data-nosnippet>213</a> <span class="comment">// Use
token if provided.
-<a href=#214 id=214 data-nosnippet>214</a> </span><span class="kw">if
let </span><span class="prelude-val">Some</span>(token) = <span
class="kw-2">&</span>token {
-<a href=#215 id=215 data-nosnippet>215</a> req.headers_mut().insert(
-<a href=#216 id=216 data-nosnippet>216</a>
http::header::AUTHORIZATION,
-<a href=#217 id=217 data-nosnippet>217</a> <span
class="macro">format!</span>(<span class="string">"Bearer
{token}"</span>).parse().map_err(|e| {
-<a href=#218 id=218 data-nosnippet>218</a> Error::new(
-<a href=#219 id=219 data-nosnippet>219</a>
ErrorKind::DataInvalid,
-<a href=#220 id=220 data-nosnippet>220</a> <span
class="string">"Invalid token received from catalog server!"</span>,
-<a href=#221 id=221 data-nosnippet>221</a> )
-<a href=#222 id=222 data-nosnippet>222</a> .with_source(e)
-<a href=#223 id=223 data-nosnippet>223</a> })<span
class="question-mark">?</span>,
-<a href=#224 id=224 data-nosnippet>224</a> );
-<a href=#225 id=225 data-nosnippet>225</a> <span class="kw">return
</span><span class="prelude-val">Ok</span>(());
-<a href=#226 id=226 data-nosnippet>226</a> }
-<a href=#227 id=227 data-nosnippet>227</a>
-<a href=#228 id=228 data-nosnippet>228</a> <span class="kw">let
</span>token = <span
class="self">self</span>.exchange_credential_for_token().<span
class="kw">await</span><span class="question-mark">?</span>;
-<a href=#229 id=229 data-nosnippet>229</a> <span class="comment">//
Update token.
-<a href=#230 id=230 data-nosnippet>230</a> </span><span
class="kw-2">*</span><span class="self">self</span>.token.lock().<span
class="kw">await </span>= <span class="prelude-val">Some</span>(token.clone());
-<a href=#231 id=231 data-nosnippet>231</a> <span class="comment">//
Insert token in request.
-<a href=#232 id=232 data-nosnippet>232</a>
</span>req.headers_mut().insert(
-<a href=#233 id=233 data-nosnippet>233</a>
http::header::AUTHORIZATION,
-<a href=#234 id=234 data-nosnippet>234</a> <span
class="macro">format!</span>(<span class="string">"Bearer
{token}"</span>).parse().map_err(|e| {
-<a href=#235 id=235 data-nosnippet>235</a> Error::new(
-<a href=#236 id=236 data-nosnippet>236</a>
ErrorKind::DataInvalid,
-<a href=#237 id=237 data-nosnippet>237</a> <span
class="string">"Invalid token received from catalog server!"</span>,
-<a href=#238 id=238 data-nosnippet>238</a> )
-<a href=#239 id=239 data-nosnippet>239</a> .with_source(e)
-<a href=#240 id=240 data-nosnippet>240</a> })<span
class="question-mark">?</span>,
-<a href=#241 id=241 data-nosnippet>241</a> );
-<a href=#242 id=242 data-nosnippet>242</a>
-<a href=#243 id=243 data-nosnippet>243</a> <span
class="prelude-val">Ok</span>(())
-<a href=#244 id=244 data-nosnippet>244</a> }
-<a href=#245 id=245 data-nosnippet>245</a>
-<a href=#246 id=246 data-nosnippet>246</a> <span class="attr">#[inline]
-<a href=#247 id=247 data-nosnippet>247</a> </span><span class="kw">pub fn
</span>request<U: IntoUrl>(<span class="kw-2">&</span><span
class="self">self</span>, method: Method, url: U) -> RequestBuilder {
-<a href=#248 id=248 data-nosnippet>248</a> <span
class="self">self</span>.client
-<a href=#249 id=249 data-nosnippet>249</a> .request(method, url)
-<a href=#250 id=250 data-nosnippet>250</a> .headers(<span
class="self">self</span>.extra_headers.clone())
-<a href=#251 id=251 data-nosnippet>251</a> }
-<a href=#252 id=252 data-nosnippet>252</a>
-<a href=#253 id=253 data-nosnippet>253</a> <span class="doccomment">///
Executes the given `Request` and returns a `Response`.
-<a href=#254 id=254 data-nosnippet>254</a> </span><span class="kw">pub
async fn </span>execute(<span class="kw-2">&</span><span
class="self">self</span>, <span class="kw-2">mut </span>request: Request) ->
<span class="prelude-ty">Result</span><Response> {
-<a href=#255 id=255 data-nosnippet>255</a>
request.headers_mut().extend(<span
class="self">self</span>.extra_headers.clone());
-<a href=#256 id=256 data-nosnippet>256</a> <span
class="prelude-val">Ok</span>(<span
class="self">self</span>.client.execute(request).<span
class="kw">await</span><span class="question-mark">?</span>)
-<a href=#257 id=257 data-nosnippet>257</a> }
-<a href=#258 id=258 data-nosnippet>258</a>
-<a href=#259 id=259 data-nosnippet>259</a> <span class="comment">// Queries
the Iceberg REST catalog after authentication with the given `Request` and
-<a href=#260 id=260 data-nosnippet>260</a> // returns a `Response`.
-<a href=#261 id=261 data-nosnippet>261</a> </span><span class="kw">pub
async fn </span>query_catalog(<span class="kw-2">&</span><span
class="self">self</span>, <span class="kw-2">mut </span>request: Request) ->
<span class="prelude-ty">Result</span><Response> {
-<a href=#262 id=262 data-nosnippet>262</a> <span
class="self">self</span>.authenticate(<span class="kw-2">&mut
</span>request).<span class="kw">await</span><span
class="question-mark">?</span>;
-<a href=#263 id=263 data-nosnippet>263</a> <span
class="self">self</span>.execute(request).<span class="kw">await
-<a href=#264 id=264 data-nosnippet>264</a> </span>}
-<a href=#265 id=265 data-nosnippet>265</a>}
-<a href=#266 id=266 data-nosnippet>266</a>
-<a href=#267 id=267 data-nosnippet>267</a><span class="doccomment">///
Deserializes a catalog response into the given [`DeserializedOwned`] type.
-<a href=#268 id=268 data-nosnippet>268</a>///
-<a href=#269 id=269 data-nosnippet>269</a>/// Returns an error if unable to
parse the response bytes.
-<a href=#270 id=270 data-nosnippet>270</a></span><span
class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">async fn
</span>deserialize_catalog_response<R: DeserializeOwned>(
-<a href=#271 id=271 data-nosnippet>271</a> response: Response,
-<a href=#272 id=272 data-nosnippet>272</a>) -> <span
class="prelude-ty">Result</span><R> {
-<a href=#273 id=273 data-nosnippet>273</a> <span class="kw">let
</span>bytes = response.bytes().<span class="kw">await</span><span
class="question-mark">?</span>;
-<a href=#274 id=274 data-nosnippet>274</a>
-<a href=#275 id=275 data-nosnippet>275</a>
serde_json::from_slice::<R>(<span
class="kw-2">&</span>bytes).map_err(|e| {
-<a href=#276 id=276 data-nosnippet>276</a> Error::new(
-<a href=#277 id=277 data-nosnippet>277</a> ErrorKind::Unexpected,
-<a href=#278 id=278 data-nosnippet>278</a> <span
class="string">"Failed to parse response from rest catalog server"</span>,
-<a href=#279 id=279 data-nosnippet>279</a> )
-<a href=#280 id=280 data-nosnippet>280</a> .with_context(<span
class="string">"json"</span>, String::from_utf8_lossy(<span
class="kw-2">&</span>bytes))
-<a href=#281 id=281 data-nosnippet>281</a> .with_source(e)
-<a href=#282 id=282 data-nosnippet>282</a> })
-<a href=#283 id=283 data-nosnippet>283</a>}
-<a href=#284 id=284 data-nosnippet>284</a>
-<a href=#285 id=285 data-nosnippet>285</a><span class="doccomment">///
Deserializes a unexpected catalog response into an error.
-<a href=#286 id=286 data-nosnippet>286</a></span><span
class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">async fn
</span>deserialize_unexpected_catalog_error(response: Response) -> Error {
-<a href=#287 id=287 data-nosnippet>287</a> <span class="kw">let </span>err
= Error::new(
-<a href=#288 id=288 data-nosnippet>288</a> ErrorKind::Unexpected,
-<a href=#289 id=289 data-nosnippet>289</a> <span
class="string">"Received response with unexpected status code"</span>,
-<a href=#290 id=290 data-nosnippet>290</a> )
-<a href=#291 id=291 data-nosnippet>291</a> .with_context(<span
class="string">"status"</span>, response.status().to_string())
-<a href=#292 id=292 data-nosnippet>292</a> .with_context(<span
class="string">"headers"</span>, <span class="macro">format!</span>(<span
class="string">"{:?}"</span>, response.headers()));
-<a href=#293 id=293 data-nosnippet>293</a>
-<a href=#294 id=294 data-nosnippet>294</a> <span class="kw">let
</span>bytes = <span class="kw">match </span>response.bytes().<span
class="kw">await </span>{
-<a href=#295 id=295 data-nosnippet>295</a> <span
class="prelude-val">Ok</span>(bytes) => bytes,
-<a href=#296 id=296 data-nosnippet>296</a> <span
class="prelude-val">Err</span>(err) => <span class="kw">return
</span>err.into(),
-<a href=#297 id=297 data-nosnippet>297</a> };
-<a href=#298 id=298 data-nosnippet>298</a>
-<a href=#299 id=299 data-nosnippet>299</a> <span class="kw">if
</span>bytes.is_empty() {
-<a href=#300 id=300 data-nosnippet>300</a> <span class="kw">return
</span>err;
-<a href=#301 id=301 data-nosnippet>301</a> }
-<a href=#302 id=302 data-nosnippet>302</a> err.with_context(<span
class="string">"json"</span>, String::from_utf8_lossy(<span
class="kw-2">&</span>bytes))
-<a href=#303 id=303
data-nosnippet>303</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file
+<a href=#204 id=204 data-nosnippet>204</a> /// When both `credential` and
`token` are present, `token` takes precedence.
+<a href=#205 id=205 data-nosnippet>205</a> ///
+<a href=#206 id=206 data-nosnippet>206</a> /// # TODO: Support automatic
token refreshing.
+<a href=#207 id=207 data-nosnippet>207</a> </span><span class="kw">async fn
</span>authenticate(<span class="kw-2">&</span><span
class="self">self</span>, req: <span class="kw-2">&mut </span>Request)
-> <span class="prelude-ty">Result</span><()> {
+<a href=#208 id=208 data-nosnippet>208</a> <span class="comment">//
Clone the token from lock without holding the lock for entire function.
+<a href=#209 id=209 data-nosnippet>209</a> </span><span class="kw">let
</span>token = <span class="self">self</span>.token.lock().<span
class="kw">await</span>.clone();
+<a href=#210 id=210 data-nosnippet>210</a>
+<a href=#211 id=211 data-nosnippet>211</a> <span class="kw">if
</span><span class="self">self</span>.credential.is_none() &&
token.is_none() {
+<a href=#212 id=212 data-nosnippet>212</a> <span class="kw">return
</span><span class="prelude-val">Ok</span>(());
+<a href=#213 id=213 data-nosnippet>213</a> }
+<a href=#214 id=214 data-nosnippet>214</a>
+<a href=#215 id=215 data-nosnippet>215</a> <span class="comment">//
Either use the provided token or exchange credential for token, cache and use
that
+<a href=#216 id=216 data-nosnippet>216</a> </span><span class="kw">let
</span>token = <span class="kw">match </span>token {
+<a href=#217 id=217 data-nosnippet>217</a> <span
class="prelude-val">Some</span>(token) => token,
+<a href=#218 id=218 data-nosnippet>218</a> <span
class="prelude-val">None </span>=> {
+<a href=#219 id=219 data-nosnippet>219</a> <span class="kw">let
</span>token = <span
class="self">self</span>.exchange_credential_for_token().<span
class="kw">await</span><span class="question-mark">?</span>;
+<a href=#220 id=220 data-nosnippet>220</a> <span
class="comment">// Update token so that we use it for next request instead of
+<a href=#221 id=221 data-nosnippet>221</a> // exchanging
credential for token from the server again
+<a href=#222 id=222 data-nosnippet>222</a> </span><span
class="kw-2">*</span><span class="self">self</span>.token.lock().<span
class="kw">await </span>= <span class="prelude-val">Some</span>(token.clone());
+<a href=#223 id=223 data-nosnippet>223</a> token
+<a href=#224 id=224 data-nosnippet>224</a> }
+<a href=#225 id=225 data-nosnippet>225</a> };
+<a href=#226 id=226 data-nosnippet>226</a>
+<a href=#227 id=227 data-nosnippet>227</a> <span class="comment">//
Insert token in request.
+<a href=#228 id=228 data-nosnippet>228</a>
</span>req.headers_mut().insert(
+<a href=#229 id=229 data-nosnippet>229</a>
http::header::AUTHORIZATION,
+<a href=#230 id=230 data-nosnippet>230</a> <span
class="macro">format!</span>(<span class="string">"Bearer
{token}"</span>).parse().map_err(|e| {
+<a href=#231 id=231 data-nosnippet>231</a> Error::new(
+<a href=#232 id=232 data-nosnippet>232</a>
ErrorKind::DataInvalid,
+<a href=#233 id=233 data-nosnippet>233</a> <span
class="string">"Invalid token received from catalog server!"</span>,
+<a href=#234 id=234 data-nosnippet>234</a> )
+<a href=#235 id=235 data-nosnippet>235</a> .with_source(e)
+<a href=#236 id=236 data-nosnippet>236</a> })<span
class="question-mark">?</span>,
+<a href=#237 id=237 data-nosnippet>237</a> );
+<a href=#238 id=238 data-nosnippet>238</a>
+<a href=#239 id=239 data-nosnippet>239</a> <span
class="prelude-val">Ok</span>(())
+<a href=#240 id=240 data-nosnippet>240</a> }
+<a href=#241 id=241 data-nosnippet>241</a>
+<a href=#242 id=242 data-nosnippet>242</a> <span class="attr">#[inline]
+<a href=#243 id=243 data-nosnippet>243</a> </span><span class="kw">pub fn
</span>request<U: IntoUrl>(<span class="kw-2">&</span><span
class="self">self</span>, method: Method, url: U) -> RequestBuilder {
+<a href=#244 id=244 data-nosnippet>244</a> <span
class="self">self</span>.client
+<a href=#245 id=245 data-nosnippet>245</a> .request(method, url)
+<a href=#246 id=246 data-nosnippet>246</a> .headers(<span
class="self">self</span>.extra_headers.clone())
+<a href=#247 id=247 data-nosnippet>247</a> }
+<a href=#248 id=248 data-nosnippet>248</a>
+<a href=#249 id=249 data-nosnippet>249</a> <span class="doccomment">///
Executes the given `Request` and returns a `Response`.
+<a href=#250 id=250 data-nosnippet>250</a> </span><span class="kw">pub
async fn </span>execute(<span class="kw-2">&</span><span
class="self">self</span>, <span class="kw-2">mut </span>request: Request) ->
<span class="prelude-ty">Result</span><Response> {
+<a href=#251 id=251 data-nosnippet>251</a>
request.headers_mut().extend(<span
class="self">self</span>.extra_headers.clone());
+<a href=#252 id=252 data-nosnippet>252</a> <span
class="prelude-val">Ok</span>(<span
class="self">self</span>.client.execute(request).<span
class="kw">await</span><span class="question-mark">?</span>)
+<a href=#253 id=253 data-nosnippet>253</a> }
+<a href=#254 id=254 data-nosnippet>254</a>
+<a href=#255 id=255 data-nosnippet>255</a> <span class="comment">// Queries
the Iceberg REST catalog after authentication with the given `Request` and
+<a href=#256 id=256 data-nosnippet>256</a> // returns a `Response`.
+<a href=#257 id=257 data-nosnippet>257</a> </span><span class="kw">pub
async fn </span>query_catalog(<span class="kw-2">&</span><span
class="self">self</span>, <span class="kw-2">mut </span>request: Request) ->
<span class="prelude-ty">Result</span><Response> {
+<a href=#258 id=258 data-nosnippet>258</a> <span
class="self">self</span>.authenticate(<span class="kw-2">&mut
</span>request).<span class="kw">await</span><span
class="question-mark">?</span>;
+<a href=#259 id=259 data-nosnippet>259</a> <span
class="self">self</span>.execute(request).<span class="kw">await
+<a href=#260 id=260 data-nosnippet>260</a> </span>}
+<a href=#261 id=261 data-nosnippet>261</a>}
+<a href=#262 id=262 data-nosnippet>262</a>
+<a href=#263 id=263 data-nosnippet>263</a><span class="doccomment">///
Deserializes a catalog response into the given [`DeserializedOwned`] type.
+<a href=#264 id=264 data-nosnippet>264</a>///
+<a href=#265 id=265 data-nosnippet>265</a>/// Returns an error if unable to
parse the response bytes.
+<a href=#266 id=266 data-nosnippet>266</a></span><span
class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">async fn
</span>deserialize_catalog_response<R: DeserializeOwned>(
+<a href=#267 id=267 data-nosnippet>267</a> response: Response,
+<a href=#268 id=268 data-nosnippet>268</a>) -> <span
class="prelude-ty">Result</span><R> {
+<a href=#269 id=269 data-nosnippet>269</a> <span class="kw">let
</span>bytes = response.bytes().<span class="kw">await</span><span
class="question-mark">?</span>;
+<a href=#270 id=270 data-nosnippet>270</a>
+<a href=#271 id=271 data-nosnippet>271</a>
serde_json::from_slice::<R>(<span
class="kw-2">&</span>bytes).map_err(|e| {
+<a href=#272 id=272 data-nosnippet>272</a> Error::new(
+<a href=#273 id=273 data-nosnippet>273</a> ErrorKind::Unexpected,
+<a href=#274 id=274 data-nosnippet>274</a> <span
class="string">"Failed to parse response from rest catalog server"</span>,
+<a href=#275 id=275 data-nosnippet>275</a> )
+<a href=#276 id=276 data-nosnippet>276</a> .with_context(<span
class="string">"json"</span>, String::from_utf8_lossy(<span
class="kw-2">&</span>bytes))
+<a href=#277 id=277 data-nosnippet>277</a> .with_source(e)
+<a href=#278 id=278 data-nosnippet>278</a> })
+<a href=#279 id=279 data-nosnippet>279</a>}
+<a href=#280 id=280 data-nosnippet>280</a>
+<a href=#281 id=281 data-nosnippet>281</a><span class="doccomment">///
Deserializes a unexpected catalog response into an error.
+<a href=#282 id=282 data-nosnippet>282</a></span><span
class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">async fn
</span>deserialize_unexpected_catalog_error(response: Response) -> Error {
+<a href=#283 id=283 data-nosnippet>283</a> <span class="kw">let </span>err
= Error::new(
+<a href=#284 id=284 data-nosnippet>284</a> ErrorKind::Unexpected,
+<a href=#285 id=285 data-nosnippet>285</a> <span
class="string">"Received response with unexpected status code"</span>,
+<a href=#286 id=286 data-nosnippet>286</a> )
+<a href=#287 id=287 data-nosnippet>287</a> .with_context(<span
class="string">"status"</span>, response.status().to_string())
+<a href=#288 id=288 data-nosnippet>288</a> .with_context(<span
class="string">"headers"</span>, <span class="macro">format!</span>(<span
class="string">"{:?}"</span>, response.headers()));
+<a href=#289 id=289 data-nosnippet>289</a>
+<a href=#290 id=290 data-nosnippet>290</a> <span class="kw">let
</span>bytes = <span class="kw">match </span>response.bytes().<span
class="kw">await </span>{
+<a href=#291 id=291 data-nosnippet>291</a> <span
class="prelude-val">Ok</span>(bytes) => bytes,
+<a href=#292 id=292 data-nosnippet>292</a> <span
class="prelude-val">Err</span>(err) => <span class="kw">return
</span>err.into(),
+<a href=#293 id=293 data-nosnippet>293</a> };
+<a href=#294 id=294 data-nosnippet>294</a>
+<a href=#295 id=295 data-nosnippet>295</a> <span class="kw">if
</span>bytes.is_empty() {
+<a href=#296 id=296 data-nosnippet>296</a> <span class="kw">return
</span>err;
+<a href=#297 id=297 data-nosnippet>297</a> }
+<a href=#298 id=298 data-nosnippet>298</a> err.with_context(<span
class="string">"json"</span>, String::from_utf8_lossy(<span
class="kw-2">&</span>bytes))
+<a href=#299 id=299
data-nosnippet>299</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file